static/js/terrain/terrain1.js @ 578872d23f06 default tip

Links
author Steve Losh <steve@stevelosh.com>
date Mon, 09 Sep 2024 10:31:31 -0400
parents d20bad4b886f
children (none)
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var width = exports.width = 676;
var height = exports.height = 400;
var wireframe = exports.wireframe = true;
var wireframeWidth = exports.wireframeWidth = 1.2;
var terrainHeight = exports.terrainHeight = 50;
var terrainSize = exports.terrainSize = 100;
void 0;
void 0;
void 0;
void 0;
void 0;
void 0;
var l = exports.l = function l(v) {
    return console.log(v);
};
var midpoint = exports.midpoint = function midpoint(a, b) {
    return (a + b) / 2;
};
var average2 = exports.average2 = function average2(a, b) {
    return (a + b) / 2;
};
var average4 = exports.average4 = function average4(a, b, c, d) {
    return (a + b + c + d) / 4;
};
var safeAverage = exports.safeAverage = function safeAverage(a, b, c, d) {
    return function () {
        var totalø1 = 0;
        var countø1 = 0;
        a ? (function () {
            totalø1 = totalø1 + a;
            return countø1 = countø1 + 1;
        })() : void 0;
        b ? (function () {
            totalø1 = totalø1 + b;
            return countø1 = countø1 + 1;
        })() : void 0;
        c ? (function () {
            totalø1 = totalø1 + c;
            return countø1 = countø1 + 1;
        })() : void 0;
        d ? (function () {
            totalø1 = totalø1 + d;
            return countø1 = countø1 + 1;
        })() : void 0;
        return totalø1 / countø1;
    }.call(this);
};
var rand = exports.rand = function rand() {
    return Math.random();
};
var randAroundZero = exports.randAroundZero = function randAroundZero(spread) {
    return spread * rand() * 2 - spread;
};
var jitter = exports.jitter = function jitter(value, spread) {
    return value + randAroundZero(spread);
};
void 0;
var heightmapGetSafe = exports.heightmapGetSafe = function heightmapGetSafe(hm, x, y) {
    return 0 <= x && x <= hm.last && (0 <= y && y <= hm.last) ? (function () {
        return hm[y * hm.resolution + x];
    })() : void 0;
};
void 0;
var normalize = exports.normalize = function normalize(hm) {
    return function () {
        var maxø1 = 0 - Infinity;
        var minø1 = Infinity;
        (function () {
            var G__1ø1 = hm.length;
            return function loop() {
                var recur = loop;
                var iø1 = 0;
                do {
                    recur = iø1 < G__1ø1 ? (function () {
                        (function () {
                            var elø1 = hm[iø1];
                            maxø1 < elø1 ? (function () {
                                return maxø1 = elø1;
                            })() : void 0;
                            return minø1 > elø1 ? (function () {
                                return minø1 = elø1;
                            })() : void 0;
                        }.call(this));
                        return loop[0] = 1 + iø1, loop;
                    })() : void 0;
                } while (iø1 = loop[0], recur === loop);
                return recur;
            }.call(this);
        }.call(this));
        return function () {
            var spanø1 = maxø1 - minø1;
            return function () {
                var G__2ø1 = hm.length;
                return function loop() {
                    var recur = loop;
                    var iø1 = 0;
                    do {
                        recur = iø1 < G__2ø1 ? (function () {
                            hm[iø1] = (hm[iø1] - minø1) / spanø1;
                            return loop[0] = 1 + iø1, loop;
                        })() : void 0;
                    } while (iø1 = loop[0], recur === loop);
                    return recur;
                }.call(this);
            }.call(this);
        }.call(this);
    }.call(this);
};
var zeroHeightmap = exports.zeroHeightmap = function zeroHeightmap(heightmap) {
    (function () {
        var G__3ø1 = heightmap.length;
        return function loop() {
            var recur = loop;
            var iø1 = 0;
            do {
                recur = iø1 < G__3ø1 ? (function () {
                    heightmap[iø1] = 0;
                    return loop[0] = 1 + iø1, loop;
                })() : void 0;
            } while (iø1 = loop[0], recur === loop);
            return recur;
        }.call(this);
    }.call(this));
    return heightmap;
};
var makeHeightmap = exports.makeHeightmap = function makeHeightmap(exponent) {
    return function () {
        var resolutionø1 = 1 + Math.pow(2, exponent);
        l('Creating ' + resolutionø1 + ' by ' + resolutionø1 + ' heightmap...');
        var heightmap = new Array(resolutionø1 * resolutionø1);
        heightmap.resolution = resolutionø1;
        heightmap.exponent = exponent;
        heightmap.last = resolutionø1 - 1;
        return zeroHeightmap(heightmap);
    }.call(this);
};
var randomNoise = exports.randomNoise = function randomNoise(heightmap) {
    return function () {
        var G__4ø1 = heightmap.length;
        return function loop() {
            var recur = loop;
            var iø1 = 0;
            do {
                recur = iø1 < G__4ø1 ? (function () {
                    heightmap[iø1] = rand();
                    return loop[0] = 1 + iø1, loop;
                })() : void 0;
            } while (iø1 = loop[0], recur === loop);
            return recur;
        }.call(this);
    }.call(this);
};
var mpdInitCorners = exports.mpdInitCorners = function mpdInitCorners(heightmap) {
    heightmap[0 * heightmap.resolution + 0] = rand();
    heightmap[heightmap.last * heightmap.resolution + 0] = rand();
    heightmap[0 * heightmap.resolution + heightmap.last] = rand();
    return heightmap[heightmap.last * heightmap.resolution + heightmap.last] = rand();
};
var mpdDisplace = exports.mpdDisplace = function mpdDisplace(heightmap, lx, rx, by, ty, spread) {
    return function () {
        var cxø1 = midpoint(lx, rx);
        var cyø1 = midpoint(by, ty);
        var bottomLeftø1 = heightmap[by * heightmap.resolution + lx];
        var bottomRightø1 = heightmap[by * heightmap.resolution + rx];
        var topLeftø1 = heightmap[ty * heightmap.resolution + lx];
        var topRightø1 = heightmap[ty * heightmap.resolution + rx];
        var topø1 = average2(topLeftø1, topRightø1);
        var leftø1 = average2(bottomLeftø1, topLeftø1);
        var bottomø1 = average2(bottomLeftø1, bottomRightø1);
        var rightø1 = average2(bottomRightø1, topRightø1);
        var centerø1 = average4(topø1, leftø1, bottomø1, rightø1);
        heightmap[by * heightmap.resolution + cxø1] = jitter(bottomø1, spread);
        heightmap[ty * heightmap.resolution + cxø1] = jitter(topø1, spread);
        heightmap[cyø1 * heightmap.resolution + lx] = jitter(leftø1, spread);
        heightmap[cyø1 * heightmap.resolution + rx] = jitter(rightø1, spread);
        return heightmap[cyø1 * heightmap.resolution + cxø1] = jitter(centerø1, spread);
    }.call(this);
};
var midpointDisplacement = exports.midpointDisplacement = function midpointDisplacement(heightmap) {
    mpdInitCorners(heightmap);
    (function loop() {
        var recur = loop;
        var iterø1 = 0;
        var spreadø1 = 0.3;
        do {
            recur = iterø1 < heightmap.exponent ? (function () {
                (function () {
                    var chunksø1 = Math.pow(2, iterø1);
                    var chunkWidthø1 = (heightmap.resolution - 1) / chunksø1;
                    return function () {
                        var G__5ø1 = chunksø1;
                        return function () {
                            var G__6ø1 = G__5ø1;
                            return function loop() {
                                var recur = loop;
                                var xchunkø1 = 0;
                                do {
                                    recur = xchunkø1 < G__6ø1 ? (function () {
                                        (function () {
                                            var G__7ø1 = G__5ø1;
                                            return function loop() {
                                                var recur = loop;
                                                var ychunkø1 = 0;
                                                do {
                                                    recur = ychunkø1 < G__7ø1 ? (function () {
                                                        (function () {
                                                            var leftXø1 = chunkWidthø1 * xchunkø1;
                                                            var rightXø1 = leftXø1 + chunkWidthø1;
                                                            var bottomYø1 = chunkWidthø1 * ychunkø1;
                                                            var topYø1 = bottomYø1 + chunkWidthø1;
                                                            return mpdDisplace(heightmap, leftXø1, rightXø1, bottomYø1, topYø1, spreadø1);
                                                        }.call(this));
                                                        return loop[0] = 1 + ychunkø1, loop;
                                                    })() : void 0;
                                                } while (ychunkø1 = loop[0], recur === loop);
                                                return recur;
                                            }.call(this);
                                        }.call(this));
                                        return loop[0] = 1 + xchunkø1, loop;
                                    })() : void 0;
                                } while (xchunkø1 = loop[0], recur === loop);
                                return recur;
                            }.call(this);
                        }.call(this);
                    }.call(this);
                }.call(this));
                return loop[0] = 1 + iterø1, loop[1] = spreadø1 * 0.5, loop;
            })() : void 0;
        } while (iterø1 = loop[0], spreadø1 = loop[1], recur === loop);
        return recur;
    }.call(this));
    return normalize(heightmap);
};
var midpointDisplacementFinal = exports.midpointDisplacementFinal = function midpointDisplacementFinal(heightmap) {
    mpdInitCorners(heightmap);
    (function loop() {
        var recur = loop;
        var iterø1 = 0;
        var spreadø1 = 0 + $('#input-starting-spread').val();
        do {
            recur = iterø1 < heightmap.exponent ? (function () {
                (function () {
                    var chunksø1 = Math.pow(2, iterø1);
                    var chunkWidthø1 = (heightmap.resolution - 1) / chunksø1;
                    return function () {
                        var G__8ø1 = chunksø1;
                        return function () {
                            var G__9ø1 = G__8ø1;
                            return function loop() {
                                var recur = loop;
                                var xchunkø1 = 0;
                                do {
                                    recur = xchunkø1 < G__9ø1 ? (function () {
                                        (function () {
                                            var G__10ø1 = G__8ø1;
                                            return function loop() {
                                                var recur = loop;
                                                var ychunkø1 = 0;
                                                do {
                                                    recur = ychunkø1 < G__10ø1 ? (function () {
                                                        (function () {
                                                            var leftXø1 = chunkWidthø1 * xchunkø1;
                                                            var rightXø1 = leftXø1 + chunkWidthø1;
                                                            var bottomYø1 = chunkWidthø1 * ychunkø1;
                                                            var topYø1 = bottomYø1 + chunkWidthø1;
                                                            return mpdDisplace(heightmap, leftXø1, rightXø1, bottomYø1, topYø1, spreadø1);
                                                        }.call(this));
                                                        return loop[0] = 1 + ychunkø1, loop;
                                                    })() : void 0;
                                                } while (ychunkø1 = loop[0], recur === loop);
                                                return recur;
                                            }.call(this);
                                        }.call(this));
                                        return loop[0] = 1 + xchunkø1, loop;
                                    })() : void 0;
                                } while (xchunkø1 = loop[0], recur === loop);
                                return recur;
                            }.call(this);
                        }.call(this);
                    }.call(this);
                }.call(this));
                return loop[0] = 1 + iterø1, loop[1] = spreadø1 * (0 + $('#input-spread-reduction').val()), loop;
            })() : void 0;
        } while (iterø1 = loop[0], spreadø1 = loop[1], recur === loop);
        return recur;
    }.call(this));
    return normalize(heightmap);
};
var mpdDisplaceD2 = exports.mpdDisplaceD2 = function mpdDisplaceD2(heightmap, lx, rx, by, ty, spread) {
    return function () {
        var cxø1 = midpoint(lx, rx);
        var cyø1 = midpoint(by, ty);
        var bottomLeftø1 = heightmap[by * heightmap.resolution + lx];
        var bottomRightø1 = heightmap[by * heightmap.resolution + rx];
        var topLeftø1 = heightmap[ty * heightmap.resolution + lx];
        var topRightø1 = heightmap[ty * heightmap.resolution + rx];
        var topø1 = average2(topLeftø1, topRightø1);
        var leftø1 = average2(bottomLeftø1, topLeftø1);
        var bottomø1 = average2(bottomLeftø1, bottomRightø1);
        var rightø1 = average2(bottomRightø1, topRightø1);
        heightmap[by * heightmap.resolution + cxø1] = jitter(bottomø1, spread);
        heightmap[ty * heightmap.resolution + cxø1] = jitter(topø1, spread);
        heightmap[cyø1 * heightmap.resolution + lx] = jitter(leftø1, spread);
        return heightmap[cyø1 * heightmap.resolution + rx] = jitter(rightø1, spread);
    }.call(this);
};
var midpointDisplacementD1 = exports.midpointDisplacementD1 = function midpointDisplacementD1(heightmap) {
    return mpdInitCorners(heightmap);
};
var midpointDisplacementD2 = exports.midpointDisplacementD2 = function midpointDisplacementD2(heightmap) {
    mpdInitCorners(heightmap);
    return mpdDisplaceD2(heightmap, 0, heightmap.last, 0, heightmap.last, 0.1);
};
var midpointDisplacementD3 = exports.midpointDisplacementD3 = function midpointDisplacementD3(heightmap) {
    mpdInitCorners(heightmap);
    return mpdDisplace(heightmap, 0, heightmap.last, 0, heightmap.last, 0.1);
};
var makeDirectionalLight = exports.makeDirectionalLight = function makeDirectionalLight() {
    return function () {
        var lightø1 = new THREE.DirectionalLight(16777215, 1);
        lightø1.position.set(100, 0, 150);
        return lightø1;
    }.call(this);
};
var makeCamera = exports.makeCamera = function makeCamera() {
    return function () {
        var cameraø1 = new THREE.PerspectiveCamera(55, width / height, 0.1, 1000);
        cameraø1.position.set(0, -100, 150);
        return cameraø1;
    }.call(this);
};
var makeRenderer = exports.makeRenderer = function makeRenderer() {
    return function () {
        var rendererø1 = new THREE.WebGLRenderer({ 'antialias': false });
        rendererø1.setClearColor(16777215);
        rendererø1.setSize(width, height);
        rendererø1.setPixelRatio(2);
        return rendererø1;
    }.call(this);
};
var makeGeometry = exports.makeGeometry = function makeGeometry(heightmap) {
    return function () {
        var geometryø1 = new THREE.PlaneGeometry(terrainSize, terrainSize, heightmap.resolution - 1, heightmap.resolution - 1);
        geometryø1.dynamic = true;
        return geometryø1;
    }.call(this);
};
var makeControls = exports.makeControls = function makeControls(camera, renderer) {
    return function () {
        var controlsø1 = new THREE.TrackballControls(camera, renderer.domElement);
        controlsø1.rotateSpeed = 1.4;
        controlsø1.zoomSpeed = 0.5;
        controlsø1.staticMoving = true;
        controlsø1.dynamicDampingFactor = 0.3;
        return controlsø1;
    }.call(this);
};
var makePlane = exports.makePlane = function makePlane(geometry) {
    return function () {
        var materialø1 = new THREE.MeshLambertMaterial({
            'wireframe': wireframe,
            'wireframeLinewidth': wireframeWidth,
            'color': 47872
        });
        return new THREE.Mesh(geometry, materialø1);
    }.call(this);
};
var attachToDom = exports.attachToDom = function attachToDom(renderer, elName, refreshFn) {
    return function () {
        var containerø1 = document.getElementById(elName);
        var settingsø1 = document.createElement('div');
        var refreshButtonø1 = document.createElement('button');
        var buttonTextø1 = document.createTextNode('Refresh');
        var cancelScrollø1 = function (e) {
            return e.preventDefault();
        };
        refreshButtonø1.onclick = refreshFn;
        renderer.domElement.onmousewheel = cancelScrollø1;
        renderer.domElement.addEventListener('MozMousePixelScroll', cancelScrollø1, false);
        refreshButtonø1.appendChild(buttonTextø1);
        containerø1.appendChild(renderer.domElement);
        containerø1.appendChild(settingsø1);
        return settingsø1.appendChild(refreshButtonø1);
    }.call(this);
};
var updateGeometry = exports.updateGeometry = function updateGeometry(geometry, heightmap) {
    (function () {
        var G__11ø1 = geometry.vertices.length;
        return function loop() {
            var recur = loop;
            var iø1 = 0;
            do {
                recur = iø1 < G__11ø1 ? (function () {
                    geometry.vertices[iø1].z = terrainHeight * heightmap[iø1];
                    return loop[0] = 1 + iø1, loop;
                })() : void 0;
            } while (iø1 = loop[0], recur === loop);
            return recur;
        }.call(this);
    }.call(this));
    geometry.verticesNeedUpdate = true;
    geometry.computeFaceNormals();
    geometry.computeVertexNormals();
    geometry.computeMorphNormals();
    return geometry;
};
var makeDemo = exports.makeDemo = function makeDemo(elementId, algorithm, size) {
    var scene = new THREE.Scene();
    scene.add(new THREE.AxisHelper(100));
    var clock = new THREE.Clock();
    var camera = makeCamera();
    var renderer = makeRenderer();
    var geometry = makeGeometry(makeHeightmap(size));
    scene.add(makeDirectionalLight());
    scene.add(new THREE.AmbientLight(16777215, 0.05));
    scene.add(makePlane(geometry));
    var refresh = function refresh() {
        l('Refreshing ========================================');
        return function () {
            var heightmapø1 = makeHeightmap(size);
            l('Generating terrain...');
            (function () {
                var G__12ø1 = new Date().getTime();
                var G__14ø1 = (function () {
                    return algorithm(heightmapø1);
                })();
                var G__13ø1 = new Date().getTime();
                l('Elapsed time: ' + (G__13ø1 - G__12ø1) + 'ms.');
                return G__14ø1;
            }.call(this));
            l('Refreshing geometry...');
            (function () {
                var G__15ø1 = new Date().getTime();
                var G__17ø1 = (function () {
                    return updateGeometry(geometry, heightmapø1);
                })();
                var G__16ø1 = new Date().getTime();
                l('Elapsed time: ' + (G__16ø1 - G__15ø1) + 'ms.');
                return G__17ø1;
            }.call(this));
            return l('Done!');
        }.call(this);
    };
    attachToDom(renderer, elementId, refresh);
    var controls = makeControls(camera, renderer);
    var render = function render() {
        return function () {
            var deltaø1 = clock.getDelta();
            requestAnimationFrame(render);
            controls.update(deltaø1);
            return renderer.render(scene, camera);
        }.call(this);
    };
    render();
    return void 0;
};
var makeFinal = exports.makeFinal = function makeFinal(elementId) {
    var scene = new THREE.Scene();
    scene.add(new THREE.AxisHelper(100));
    var clock = new THREE.Clock();
    var camera = makeCamera();
    var renderer = makeRenderer();
    var heightmap = makeHeightmap($('#input-exponent').val());
    var geometry = makeGeometry(heightmap);
    var plane = makePlane(geometry);
    scene.add(makeDirectionalLight());
    scene.add(new THREE.AmbientLight(16777215, 0.05));
    scene.add(plane);
    var refresh = function refresh() {
        l('Refreshing ========================================');
        scene.remove(plane);
        heightmap = makeHeightmap($('#input-exponent').val());
        geometry = makeGeometry(heightmap);
        plane = makePlane(geometry);
        scene.add(plane);
        l('Generating terrain...');
        (function () {
            var G__18ø1 = new Date().getTime();
            var G__20ø1 = (function () {
                return midpointDisplacementFinal(heightmap);
            })();
            var G__19ø1 = new Date().getTime();
            l('Elapsed time: ' + (G__19ø1 - G__18ø1) + 'ms.');
            return G__20ø1;
        }.call(this));
        l('Refreshing geometry...');
        (function () {
            var G__21ø1 = new Date().getTime();
            var G__23ø1 = (function () {
                return updateGeometry(geometry, heightmap);
            })();
            var G__22ø1 = new Date().getTime();
            l('Elapsed time: ' + (G__22ø1 - G__21ø1) + 'ms.');
            return G__23ø1;
        }.call(this));
        return l('Done!');
    };
    attachToDom(renderer, elementId, refresh);
    var controls = makeControls(camera, renderer);
    var render = function render() {
        return function () {
            var deltaø1 = clock.getDelta();
            requestAnimationFrame(render);
            controls.update(deltaø1);
            return renderer.render(scene, camera);
        }.call(this);
    };
    render();
    return void 0;
};
var run = exports.run = function run() {
    makeDemo('demo-random', randomNoise, 7);
    makeDemo('demo-mpd-1', midpointDisplacementD1, 2);
    makeDemo('demo-mpd-2', midpointDisplacementD2, 2);
    makeDemo('demo-mpd-3', midpointDisplacementD3, 2);
    makeDemo('demo-mpd-4', midpointDisplacement, 3);
    return makeFinal('demo-final');
};
$(run);


},{}]},{},[1])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm1lZGlhL2pzL3dpc3AvYW5vbnltb3VzLndpc3AiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNDQSxJQUFLLEtBQUEsR0FBQSxPQUFBLENBQUEsS0FBQSxHQUFNLEdBQVg7QUFDQSxJQUFLLE1BQUEsR0FBQSxPQUFBLENBQUEsTUFBQSxHQUFPLEdBQVosQ0FEQTtBQUVBLElBQUssU0FBQSxHQUFBLE9BQUEsQ0FBQSxTQUFBLEcsSUFBTCxDQUZBO0FBR0EsSUFBSyxjQUFBLEdBQUEsT0FBQSxDQUFBLGNBQUEsR0FBZ0IsR0FBckIsQ0FIQTtBQUlBLElBQUssYUFBQSxHQUFBLE9BQUEsQ0FBQSxhQUFBLEdBQWUsRUFBcEIsQ0FKQTtBQUtBLElBQUssV0FBQSxHQUFBLE9BQUEsQ0FBQSxXQUFBLEdBQWEsR0FBbEIsQ0FMQTtPQUFBO09BQUE7T0FBQTtPQUFBO09BQUE7T0FBQTtBQTJDQSxJQUFNLENBQUEsR0FBQSxPQUFBLENBQUEsQ0FBQSxHQUFOLFNBQU0sQ0FBTixDQUFTLENBQVQsRUFDRTtBQUFBLFdBQUMsT0FBQSxDQUFRLEdBQVQsQ0FBYSxDQUFiO0FBQUEsQ0FERixDQTNDQTtBQStDQSxJQUFNLFFBQUEsR0FBQSxPQUFBLENBQUEsUUFBQSxHQUFOLFNBQU0sUUFBTixDQUFnQixDQUFoQixFQUFrQixDQUFsQixFQUNFO0FBQUEsV0FBRyxDQUFHLENBQUgsR0FBSyxDQUFMLENBQUgsR0FBVyxDQUFYO0FBQUEsQ0FERixDQS9DQTtBQWtEQSxJQUFNLFFBQUEsR0FBQSxPQUFBLENBQUEsUUFBQSxHQUFOLFNBQU0sUUFBTixDQUFnQixDQUFoQixFQUFrQixDQUFsQixFQUNFO0FBQUEsV0FBRyxDQUFHLENBQUgsR0FBSyxDQUFMLENBQUgsR0FBVyxDQUFYO0FBQUEsQ0FERixDQWxEQTtBQXFEQSxJQUFNLFFBQUEsR0FBQSxPQUFBLENBQUEsUUFBQSxHQUFOLFNBQU0sUUFBTixDQUFnQixDQUFoQixFQUFrQixDQUFsQixFQUFvQixDQUFwQixFQUFzQixDQUF0QixFQUNFO0FBQUEsV0FBRyxDQUFHLEMsR0FBRSxDLEdBQUUsQ0FBUCxHQUFTLENBQVQsQ0FBSCxHQUFlLENBQWY7QUFBQSxDQURGLENBckRBO0FBd0RBLElBQU0sV0FBQSxHQUFBLE9BQUEsQ0FBQSxXQUFBLEdBQU4sU0FBTSxXQUFOLENBQW9CLENBQXBCLEVBQXNCLENBQXRCLEVBQXdCLENBQXhCLEVBQTBCLENBQTFCLEVBQ0U7QUFBQSxXLFlBQU07QUFBQSxZQUFBLE8sR0FBTSxDQUFOO0FBQUEsUUFBUSxJQUFBLE8sR0FBTSxDQUFOLENBQVI7QUFBQSxRQUNFLENBQU4sRyxhQUFRO0FBQUEsWUFBTSxPQUFOLEdBQU0sTyxHQUFNLENBQVo7QUFBQSxZQUFlLE9BQU0sT0FBTixHQUFNLE8sSUFBTixDQUFmO0FBQUEsUyxDQUFBLEVBQVIsRyxNQUFBLENBREk7QUFBQSxRQUVFLENBQU4sRyxhQUFRO0FBQUEsWUFBTSxPQUFOLEdBQU0sTyxHQUFNLENBQVo7QUFBQSxZQUFlLE9BQU0sT0FBTixHQUFNLE8sSUFBTixDQUFmO0FBQUEsUyxDQUFBLEVBQVIsRyxNQUFBLENBRkk7QUFBQSxRQUdFLENBQU4sRyxhQUFRO0FBQUEsWUFBTSxPQUFOLEdBQU0sTyxHQUFNLENBQVo7QUFBQSxZQUFlLE9BQU0sT0FBTixHQUFNLE8sSUFBTixDQUFmO0FBQUEsUyxDQUFBLEVBQVIsRyxNQUFBLENBSEk7QUFBQSxRQUlFLENBQU4sRyxhQUFRO0FBQUEsWUFBTSxPQUFOLEdBQU0sTyxHQUFNLENBQVo7QUFBQSxZQUFlLE9BQU0sT0FBTixHQUFNLE8sSUFBTixDQUFmO0FBQUEsUyxDQUFBLEVBQVIsRyxNQUFBLENBSkk7QUFBQSxRQUtKLE9BQUcsT0FBSCxHQUFTLE9BQVQsQ0FMSTtBQUFBLEssS0FBTixDLElBQUE7QUFBQSxDQURGLENBeERBO0FBaUVBLElBQU0sSUFBQSxHQUFBLE9BQUEsQ0FBQSxJQUFBLEdBQU4sU0FBTSxJQUFOLEdBQ0U7QUFBQSxXQUFDLElBQUEsQ0FBSyxNQUFOO0FBQUEsQ0FERixDQWpFQTtBQW9FQSxJQUFNLGNBQUEsR0FBQSxPQUFBLENBQUEsY0FBQSxHQUFOLFNBQU0sY0FBTixDQUF3QixNQUF4QixFQUNFO0FBQUEsV0FBTSxNLEdBQVEsSUFBRCxFQUFWLEdBQWlCLENBQXBCLEdBQXVCLE1BQXZCO0FBQUEsQ0FERixDQXBFQTtBQXdFQSxJQUFNLE1BQUEsR0FBQSxPQUFBLENBQUEsTUFBQSxHQUFOLFNBQU0sTUFBTixDQUFjLEtBQWQsRUFBb0IsTUFBcEIsRUFDRTtBQUFBLFdBQUcsS0FBSCxHQUFVLGNBQUQsQ0FBa0IsTUFBbEIsQ0FBVDtBQUFBLENBREYsQ0F4RUE7T0FBQTtBQWdGQSxJQUFNLGdCQUFBLEdBQUEsT0FBQSxDQUFBLGdCQUFBLEdBQU4sU0FBTSxnQkFBTixDQUEwQixFQUExQixFQUE2QixDQUE3QixFQUErQixDQUEvQixFQUNFO0FBQUEsV0FBZSxDLElBQUUsQ0FBTixJQUFNLEMsSUFBRSxFQUFBLENBQUcsSUFBaEIsSUFDSyxDQUFJLEMsSUFBRSxDQUFOLElBQU0sQyxJQUFFLEVBQUEsQ0FBRyxJQUFYLENBRFgsRyxhQUVFO0FBQUEsZUFBZSxFQUFmLENBQW9CLEMsR0FBTCxFLGNBQUcsQ0FBbEI7QUFBQSxLLENBQUEsRUFGRixHLE1BQUE7QUFBQSxDQURGLENBaEZBO09BQUE7QUF5RkEsSUFBTSxTQUFBLEdBQUEsT0FBQSxDQUFBLFNBQUEsR0FBTixTQUFNLFNBQU4sQ0FBaUIsRUFBakIsRUFDRTtBQUFBLFcsWUFBTTtBQUFBLFlBQUEsSyxJQUFJLEdBQUcsUUFBUDtBQUFBLFFBQ0EsSUFBQSxLLEdBQUksUUFBSixDQURBO0FBQUEsUUFFSixDO3lCQUFZLEVBQUEsQ0FBRyxNOzs7b0JBQUwsRzs7NEJBQUEsRzt3QkFDUixDLFlBQU07QUFBQSxnQ0FBQSxJLEdBQVMsRUFBTixDQUFTLEdBQVQsQ0FBSDtBQUFBLDRCQUNLLEtBQUgsR0FBTyxJQUFiLEcsYUFBaUI7QUFBQSx1Q0FBTSxLQUFOLEdBQVUsSUFBVjtBQUFBLDZCLENBQUEsRUFBakIsRyxNQUFBLENBREk7QUFBQSw0QkFFSixPQUFTLEtBQUgsR0FBTyxJQUFiLEcsYUFBaUI7QUFBQSx1Q0FBTSxLQUFOLEdBQVUsSUFBVjtBQUFBLDZCLENBQUEsRUFBakIsRyxNQUFBLENBRkk7QUFBQSx5QixLQUFOLEMsSUFBQSxHOzZDQURRLEc7O3lCQUFBLEc7OztjQUFWLEMsSUFBQSxHQUZJO0FBQUEsUUFNSixPLFlBQU07QUFBQSxnQkFBQSxNLEdBQVEsS0FBSCxHQUFPLEtBQVo7QUFBQSxZQUNKLE87NkJBQVksRUFBQSxDQUFHLE07Ozt3QkFBTCxHOztnQ0FBQSxHOzRCQUNJLEVBQU4sQ0FBUyxHQUFULENBQU4sR0FDSyxDQUFTLEVBQU4sQ0FBUyxHQUFULENBQUgsR0FBZSxLQUFmLENBQUgsR0FDRyxNQUZMLEM7aURBRFEsRzs7NkJBQUEsRzs7O2tCQUFWLEMsSUFBQSxFQURJO0FBQUEsUyxLQUFOLEMsSUFBQSxFQU5JO0FBQUEsSyxLQUFOLEMsSUFBQTtBQUFBLENBREYsQ0F6RkE7QUFzR0EsSUFBTSxhQUFBLEdBQUEsT0FBQSxDQUFBLGFBQUEsR0FBTixTQUFNLGFBQU4sQ0FBc0IsU0FBdEIsRUFDRTtBQUFBLEs7cUJBQVksU0FBQSxDQUFVLE07OztnQkFBWixHOzt3QkFBQSxHO29CQUNJLFNBQU4sQ0FBZ0IsR0FBaEIsQ0FBTixHQUF5QixDQUF6QixDO3lDQURRLEc7O3FCQUFBLEc7OztVQUFWLEMsSUFBQTtBQUFBLElBRUEsT0FBQSxTQUFBLENBRkE7QUFBQSxDQURGLENBdEdBO0FBMkdBLElBQU0sYUFBQSxHQUFBLE9BQUEsQ0FBQSxhQUFBLEdBQU4sU0FBTSxhQUFOLENBQXNCLFFBQXRCLEVBQ0U7QUFBQSxXLFlBQU07QUFBQSxZQUFBLFksR0FBYyxDQUFILEdBQU0sSUFBQSxDQUFLLEdBQU4sQ0FBVSxDQUFWLEVBQVksUUFBWixDQUFoQjtBQUFBLFFBQ0gsQ0FBRCxDQUFNLFcsR0FBWSxZLEdBQVcsTSxHQUFPLFlBQWpDLEdBQTRDLGVBQS9DLEVBREk7QUFBQSxRQUVKLElBQUssU0FBQSxHQUNILElBQUssS0FBTCxDQUFjLFlBQUgsR0FBYyxZQUF6QixDQURGLENBRkk7QUFBQSxRQUlFLFNBQUEsQ0FBVSxVQUFoQixHQUEyQixZQUEzQixDQUpJO0FBQUEsUUFLRSxTQUFBLENBQVUsUUFBaEIsR0FBeUIsUUFBekIsQ0FMSTtBQUFBLFFBTUUsU0FBQSxDQUFVLElBQWhCLEdBQXdCLFlBQUgsR0FBYyxDQUFuQyxDQU5JO0FBQUEsUUFPSixPQUFDLGFBQUQsQ0FBZ0IsU0FBaEIsRUFQSTtBQUFBLEssS0FBTixDLElBQUE7QUFBQSxDQURGLENBM0dBO0FBdUhBLElBQU0sV0FBQSxHQUFBLE9BQUEsQ0FBQSxXQUFBLEdBQU4sU0FBTSxXQUFOLENBQW9CLFNBQXBCLEVBQ0U7QUFBQSxXO3FCQUFZLFNBQUEsQ0FBVSxNOzs7Z0JBQVosRzs7d0JBQUEsRztvQkFDSSxTQUFOLENBQWdCLEdBQWhCLENBQU4sR0FBMEIsSUFBRCxFQUF6QixDO3lDQURRLEc7O3FCQUFBLEc7OztVQUFWLEMsSUFBQTtBQUFBLENBREYsQ0F2SEE7QUE2SEEsSUFBTSxjQUFBLEdBQUEsT0FBQSxDQUFBLGNBQUEsR0FBTixTQUFNLGNBQU4sQ0FBd0IsU0FBeEIsRUFDRTtBQUFBLElBQWdCLFMsQ0FBWSxDLEdBQVosUyxjQUFVLEMsQ0FBMUIsR0FBK0IsSUFBRCxFQUE5QjtBQUFBLElBQ2dCLFMsQ0FBWSxTQUFBLENBQVUsSSxHQUF0QixTLGNBQVUsQyxDQUExQixHQUE0QyxJQUFELEVBQTNDLENBREE7QUFBQSxJQUVnQixTLENBQXlCLEMsR0FBekIsUyxjQUFVLFNBQUEsQ0FBVSxJLENBQXBDLEdBQTRDLElBQUQsRUFBM0MsQ0FGQTtBQUFBLElBR0EsT0FBZ0IsUyxDQUF5QixTQUFBLENBQVUsSSxHQUFuQyxTLGNBQVUsU0FBQSxDQUFVLEksQ0FBcEMsR0FBeUQsSUFBRCxFQUF4RCxDQUhBO0FBQUEsQ0FERixDQTdIQTtBQW1JQSxJQUFNLFdBQUEsR0FBQSxPQUFBLENBQUEsV0FBQSxHQUFOLFNBQU0sV0FBTixDQUFvQixTQUFwQixFQUE4QixFQUE5QixFQUFpQyxFQUFqQyxFQUFvQyxFQUFwQyxFQUF1QyxFQUF2QyxFQUEwQyxNQUExQyxFQUNFO0FBQUEsVyxZQUFNO0FBQUEsWUFBQSxJLEdBQUksUUFBRCxDQUFVLEVBQVYsRUFBYSxFQUFiLENBQUg7QUFBQSxRQUNBLElBQUEsSSxHQUFJLFFBQUQsQ0FBVSxFQUFWLEVBQWEsRUFBYixDQUFILENBREE7QUFBQSxRQUdBLElBQUEsWSxHQUEyQixTQUFmLENBQTRCLEUsR0FBYixTLGNBQVUsRUFBekIsQ0FBWixDQUhBO0FBQUEsUUFJQSxJQUFBLGEsR0FBNEIsU0FBZixDQUE0QixFLEdBQWIsUyxjQUFVLEVBQXpCLENBQWIsQ0FKQTtBQUFBLFFBS0EsSUFBQSxTLEdBQXdCLFNBQWYsQ0FBNEIsRSxHQUFiLFMsY0FBVSxFQUF6QixDQUFULENBTEE7QUFBQSxRQU1BLElBQUEsVSxHQUF5QixTQUFmLENBQTRCLEUsR0FBYixTLGNBQVUsRUFBekIsQ0FBVixDQU5BO0FBQUEsUUFRQSxJQUFBLEssR0FBSyxRQUFELENBQVUsU0FBVixFQUFtQixVQUFuQixDQUFKLENBUkE7QUFBQSxRQVNBLElBQUEsTSxHQUFNLFFBQUQsQ0FBVSxZQUFWLEVBQXNCLFNBQXRCLENBQUwsQ0FUQTtBQUFBLFFBVUEsSUFBQSxRLEdBQVEsUUFBRCxDQUFVLFlBQVYsRUFBc0IsYUFBdEIsQ0FBUCxDQVZBO0FBQUEsUUFXQSxJQUFBLE8sR0FBTyxRQUFELENBQVUsYUFBVixFQUF1QixVQUF2QixDQUFOLENBWEE7QUFBQSxRQVlBLElBQUEsUSxHQUFRLFFBQUQsQ0FBVSxLQUFWLEVBQWMsTUFBZCxFQUFtQixRQUFuQixFQUEwQixPQUExQixDQUFQLENBWkE7QUFBQSxRQWFZLFMsQ0FBYSxFLEdBQWIsUyxjQUFVLEksQ0FBMUIsR0FBaUMsTUFBRCxDQUFRLFFBQVIsRUFBZSxNQUFmLENBQWhDLENBYkk7QUFBQSxRQWNZLFMsQ0FBYSxFLEdBQWIsUyxjQUFVLEksQ0FBMUIsR0FBaUMsTUFBRCxDQUFRLEtBQVIsRUFBWSxNQUFaLENBQWhDLENBZEk7QUFBQSxRQWVZLFMsQ0FBYSxJLEdBQWIsUyxjQUFVLEUsQ0FBMUIsR0FBaUMsTUFBRCxDQUFRLE1BQVIsRUFBYSxNQUFiLENBQWhDLENBZkk7QUFBQSxRQWdCWSxTLENBQWEsSSxHQUFiLFMsY0FBVSxFLENBQTFCLEdBQWlDLE1BQUQsQ0FBUSxPQUFSLEVBQWMsTUFBZCxDQUFoQyxDQWhCSTtBQUFBLFFBaUJKLE9BQWdCLFMsQ0FBYSxJLEdBQWIsUyxjQUFVLEksQ0FBMUIsR0FBaUMsTUFBRCxDQUFRLFFBQVIsRUFBZSxNQUFmLENBQWhDLENBakJJO0FBQUEsSyxLQUFOLEMsSUFBQTtBQUFBLENBREYsQ0FuSUE7QUF1SkEsSUFBTSxvQkFBQSxHQUFBLE9BQUEsQ0FBQSxvQkFBQSxHQUFOLFNBQU0sb0JBQU4sQ0FBNkIsU0FBN0IsRUFDRTtBQUFBLElBQUMsY0FBRCxDQUFrQixTQUFsQjtBQUFBLElBRUEsQzs7UUFBTyxJQUFBLE0sR0FBSyxDQUFMLEM7UUFDQSxJQUFBLFEsR0FBTyxHQUFQLEM7O29CQUNJLE1BQUgsR0FBUSxTQUFBLENBQVUsUUFBeEIsRyxhQUNFO0FBQUEsaUIsWUFBTTtBQUFBLHdCQUFBLFEsR0FBUSxJQUFBLENBQUssR0FBTixDQUFVLENBQVYsRUFBWSxNQUFaLENBQVA7QUFBQSxvQkFDQSxJQUFBLFksR0FBZSxDQUFHLFNBQUEsQ0FBVSxVQUFiLEdBQXdCLENBQXhCLENBQUgsR0FBOEIsUUFBMUMsQ0FEQTtBQUFBLG9CQUVKLE87cUNBQXlCLFE7Ozs7O29DQUFkLFE7OzRDQUFBLFE7Ozs7O29EQUFPLFE7OzREQUFBLFE7d0RBQ2hCLEMsWUFBTTtBQUFBLGdFQUFBLE8sR0FBVSxZQUFILEdBQWUsUUFBdEI7QUFBQSw0REFDQSxJQUFBLFEsR0FBVyxPQUFILEdBQVUsWUFBbEIsQ0FEQTtBQUFBLDREQUVBLElBQUEsUyxHQUFZLFlBQUgsR0FBZSxRQUF4QixDQUZBO0FBQUEsNERBR0EsSUFBQSxNLEdBQVMsU0FBSCxHQUFZLFlBQWxCLENBSEE7QUFBQSw0REFJSixPQUFDLFdBQUQsQ0FBYyxTQUFkLEVBQXdCLE9BQXhCLEVBQStCLFFBQS9CLEVBQXVDLFNBQXZDLEVBQWdELE1BQWhELEVBQXNELFFBQXRELEVBSkk7QUFBQSx5RCxLQUFOLEMsSUFBQSxHOzZFQURnQixROzt5REFBQSxROzs7OzZEQUFQLFE7O3lDQUFBLFE7Ozs7MEJBQVgsQyxJQUFBLEVBRkk7QUFBQSxpQixLQUFOLEMsSUFBQTtBQUFBLGdCQVFBLE8sVUFBVSxDQUFILEdBQUssTUFBWixFLFVBQXFCLFFBQUgsR0FBVSxHQUE1QixFLElBQUEsQ0FSQTtBQUFBLGEsQ0FBQSxFQURGLEc7aUJBRkssTSxZQUNBLFE7O1VBRFAsQyxJQUFBLEdBRkE7QUFBQSxJQWNBLE9BQUMsU0FBRCxDQUFXLFNBQVgsRUFkQTtBQUFBLENBREYsQ0F2SkE7QUF5S0EsSUFBTSx5QkFBQSxHQUFBLE9BQUEsQ0FBQSx5QkFBQSxHQUFOLFNBQU0seUJBQU4sQ0FBbUMsU0FBbkMsRUFDRTtBQUFBLElBQUMsY0FBRCxDQUFrQixTQUFsQjtBQUFBLElBRUEsQzs7UUFBTyxJQUFBLE0sR0FBSyxDQUFMLEM7UUFDQSxJQUFBLFEsR0FBVSxDQUFILEdBQVksQ0FBRCxDQUFHLHdCQUFILENBQUwsQ0FBQyxHQUFGLEVBQVosQzs7b0JBQ0ksTUFBSCxHQUFRLFNBQUEsQ0FBVSxRQUF4QixHLGFBQ0U7QUFBQSxpQixZQUFNO0FBQUEsd0JBQUEsUSxHQUFRLElBQUEsQ0FBSyxHQUFOLENBQVUsQ0FBVixFQUFZLE1BQVosQ0FBUDtBQUFBLG9CQUNBLElBQUEsWSxHQUFlLENBQUcsU0FBQSxDQUFVLFVBQWIsR0FBd0IsQ0FBeEIsQ0FBSCxHQUE4QixRQUExQyxDQURBO0FBQUEsb0JBRUosTztxQ0FBeUIsUTs7Ozs7b0NBQWQsUTs7NENBQUEsUTs7Ozs7b0RBQU8sUTs7NERBQUEsUTt3REFDaEIsQyxZQUFNO0FBQUEsZ0VBQUEsTyxHQUFVLFlBQUgsR0FBZSxRQUF0QjtBQUFBLDREQUNBLElBQUEsUSxHQUFXLE9BQUgsR0FBVSxZQUFsQixDQURBO0FBQUEsNERBRUEsSUFBQSxTLEdBQVksWUFBSCxHQUFlLFFBQXhCLENBRkE7QUFBQSw0REFHQSxJQUFBLE0sR0FBUyxTQUFILEdBQVksWUFBbEIsQ0FIQTtBQUFBLDREQUlKLE9BQUMsV0FBRCxDQUFjLFNBQWQsRUFBd0IsT0FBeEIsRUFBK0IsUUFBL0IsRUFBdUMsU0FBdkMsRUFBZ0QsTUFBaEQsRUFBc0QsUUFBdEQsRUFKSTtBQUFBLHlELEtBQU4sQyxJQUFBLEc7NkVBRGdCLFE7O3lEQUFBLFE7Ozs7NkRBQVAsUTs7eUNBQUEsUTs7OzswQkFBWCxDLElBQUEsRUFGSTtBQUFBLGlCLEtBQU4sQyxJQUFBO0FBQUEsZ0JBUUEsTyxVQUFVLENBQUgsR0FBSyxNQUFaLEUsVUFBcUIsUUFBSCxHQUNHLENBQUcsQ0FBSCxHQUFZLENBQUQsQ0FBRyx5QkFBSCxDQUFMLENBQUMsR0FBRixFQUFMLENBRHJCLEUsSUFBQSxDQVJBO0FBQUEsYSxDQUFBLEVBREYsRztpQkFGSyxNLFlBQ0EsUTs7VUFEUCxDLElBQUEsR0FGQTtBQUFBLElBZUEsT0FBQyxTQUFELENBQVcsU0FBWCxFQWZBO0FBQUEsQ0FERixDQXpLQTtBQTRMQSxJQUFNLGFBQUEsR0FBQSxPQUFBLENBQUEsYUFBQSxHQUFOLFNBQU0sYUFBTixDQUF1QixTQUF2QixFQUFpQyxFQUFqQyxFQUFvQyxFQUFwQyxFQUF1QyxFQUF2QyxFQUEwQyxFQUExQyxFQUE2QyxNQUE3QyxFQUNFO0FBQUEsVyxZQUFNO0FBQUEsWUFBQSxJLEdBQUksUUFBRCxDQUFVLEVBQVYsRUFBYSxFQUFiLENBQUg7QUFBQSxRQUNBLElBQUEsSSxHQUFJLFFBQUQsQ0FBVSxFQUFWLEVBQWEsRUFBYixDQUFILENBREE7QUFBQSxRQUdBLElBQUEsWSxHQUEyQixTQUFmLENBQTRCLEUsR0FBYixTLGNBQVUsRUFBekIsQ0FBWixDQUhBO0FBQUEsUUFJQSxJQUFBLGEsR0FBNEIsU0FBZixDQUE0QixFLEdBQWIsUyxjQUFVLEVBQXpCLENBQWIsQ0FKQTtBQUFBLFFBS0EsSUFBQSxTLEdBQXdCLFNBQWYsQ0FBNEIsRSxHQUFiLFMsY0FBVSxFQUF6QixDQUFULENBTEE7QUFBQSxRQU1BLElBQUEsVSxHQUF5QixTQUFmLENBQTRCLEUsR0FBYixTLGNBQVUsRUFBekIsQ0FBVixDQU5BO0FBQUEsUUFRQSxJQUFBLEssR0FBSyxRQUFELENBQVUsU0FBVixFQUFtQixVQUFuQixDQUFKLENBUkE7QUFBQSxRQVNBLElBQUEsTSxHQUFNLFFBQUQsQ0FBVSxZQUFWLEVBQXNCLFNBQXRCLENBQUwsQ0FUQTtBQUFBLFFBVUEsSUFBQSxRLEdBQVEsUUFBRCxDQUFVLFlBQVYsRUFBc0IsYUFBdEIsQ0FBUCxDQVZBO0FBQUEsUUFXQSxJQUFBLE8sR0FBTyxRQUFELENBQVUsYUFBVixFQUF1QixVQUF2QixDQUFOLENBWEE7QUFBQSxRQVlZLFMsQ0FBYSxFLEdBQWIsUyxjQUFVLEksQ0FBMUIsR0FBaUMsTUFBRCxDQUFRLFFBQVIsRUFBZSxNQUFmLENBQWhDLENBWkk7QUFBQSxRQWFZLFMsQ0FBYSxFLEdBQWIsUyxjQUFVLEksQ0FBMUIsR0FBaUMsTUFBRCxDQUFRLEtBQVIsRUFBWSxNQUFaLENBQWhDLENBYkk7QUFBQSxRQWNZLFMsQ0FBYSxJLEdBQWIsUyxjQUFVLEUsQ0FBMUIsR0FBaUMsTUFBRCxDQUFRLE1BQVIsRUFBYSxNQUFiLENBQWhDLENBZEk7QUFBQSxRQWVKLE9BQWdCLFMsQ0FBYSxJLEdBQWIsUyxjQUFVLEUsQ0FBMUIsR0FBaUMsTUFBRCxDQUFRLE9BQVIsRUFBYyxNQUFkLENBQWhDLENBZkk7QUFBQSxLLEtBQU4sQyxJQUFBO0FBQUEsQ0FERixDQTVMQTtBQThNQSxJQUFNLHNCQUFBLEdBQUEsT0FBQSxDQUFBLHNCQUFBLEdBQU4sU0FBTSxzQkFBTixDQUFnQyxTQUFoQyxFQUNFO0FBQUEsV0FBQyxjQUFELENBQWtCLFNBQWxCO0FBQUEsQ0FERixDQTlNQTtBQWlOQSxJQUFNLHNCQUFBLEdBQUEsT0FBQSxDQUFBLHNCQUFBLEdBQU4sU0FBTSxzQkFBTixDQUFnQyxTQUFoQyxFQUNFO0FBQUEsSUFBQyxjQUFELENBQWtCLFNBQWxCO0FBQUEsSUFDQSxPQUFDLGFBQUQsQ0FBaUIsU0FBakIsRUFDaUIsQ0FEakIsRUFDbUIsU0FBQSxDQUFVLElBRDdCLEVBRWlCLENBRmpCLEVBRW1CLFNBQUEsQ0FBVSxJQUY3QixFQUdpQixHQUhqQixFQURBO0FBQUEsQ0FERixDQWpOQTtBQXdOQSxJQUFNLHNCQUFBLEdBQUEsT0FBQSxDQUFBLHNCQUFBLEdBQU4sU0FBTSxzQkFBTixDQUFnQyxTQUFoQyxFQUNFO0FBQUEsSUFBQyxjQUFELENBQWtCLFNBQWxCO0FBQUEsSUFDQSxPQUFDLFdBQUQsQ0FBYyxTQUFkLEVBQ2MsQ0FEZCxFQUNnQixTQUFBLENBQVUsSUFEMUIsRUFFYyxDQUZkLEVBRWdCLFNBQUEsQ0FBVSxJQUYxQixFQUdjLEdBSGQsRUFEQTtBQUFBLENBREYsQ0F4TkE7QUFrT0EsSUFBTSxvQkFBQSxHQUFBLE9BQUEsQ0FBQSxvQkFBQSxHQUFOLFNBQU0sb0JBQU4sR0FDRTtBQUFBLFcsWUFBTTtBQUFBLFlBQUEsTyxHQUFNLElBQUssS0FBQSxDQUFNLGdCQUFYLENBQTRCLFFBQTVCLEVBQXFDLENBQXJDLENBQU47QUFBQSxRQUNILE9BQUEsQ0FBTSxZQUFQLENBQW9CLEdBQXBCLEVBQXdCLENBQXhCLEVBQTBCLEdBQTFCLEVBREk7QUFBQSxRQUVKLE9BQUEsT0FBQSxDQUZJO0FBQUEsSyxLQUFOLEMsSUFBQTtBQUFBLENBREYsQ0FsT0E7QUF1T0EsSUFBTSxVQUFBLEdBQUEsT0FBQSxDQUFBLFVBQUEsR0FBTixTQUFNLFVBQU4sR0FDRTtBQUFBLFcsWUFBTTtBQUFBLFlBQUEsUSxHQUFPLElBQUssS0FBQSxDQUFNLGlCQUFYLENBQ0ssRUFETCxFQUVRLEtBQUgsR0FBUyxNQUZkLEVBR0ssR0FITCxFQUlLLElBSkwsQ0FBUDtBQUFBLFFBS0gsUUFBQSxDQUFPLFlBQVIsQ0FBcUIsQ0FBckIsRUFBdUIsQyxHQUF2QixFQUE0QixHQUE1QixFQUxJO0FBQUEsUUFNSixPQUFBLFFBQUEsQ0FOSTtBQUFBLEssS0FBTixDLElBQUE7QUFBQSxDQURGLENBdk9BO0FBZ1BBLElBQU0sWUFBQSxHQUFBLE9BQUEsQ0FBQSxZQUFBLEdBQU4sU0FBTSxZQUFOLEdBQ0U7QUFBQSxXLFlBQU07QUFBQSxZQUFBLFUsR0FBUyxJQUFLLEtBQUEsQ0FBTSxhQUFYLENBQXlCLEUsa0JBQUEsRUFBekIsQ0FBVDtBQUFBLFFBQ0gsVUFBQSxDQUFTLGFBQVYsQ0FBd0IsUUFBeEIsRUFESTtBQUFBLFFBRUgsVUFBQSxDQUFTLE9BQVYsQ0FBa0IsS0FBbEIsRUFBd0IsTUFBeEIsRUFGSTtBQUFBLFFBR0gsVUFBQSxDQUFTLGFBQVYsQ0FBd0IsQ0FBeEIsRUFISTtBQUFBLFFBSUosT0FBQSxVQUFBLENBSkk7QUFBQSxLLEtBQU4sQyxJQUFBO0FBQUEsQ0FERixDQWhQQTtBQXVQQSxJQUFNLFlBQUEsR0FBQSxPQUFBLENBQUEsWUFBQSxHQUFOLFNBQU0sWUFBTixDQUFxQixTQUFyQixFQUNFO0FBQUEsVyxZQUFNO0FBQUEsWUFBQSxVLEdBQVMsSUFBSyxLQUFBLENBQU0sYUFBWCxDQUNLLFdBREwsRUFFSyxXQUZMLEVBR1EsU0FBQSxDQUFVLFVBQWIsR0FBd0IsQ0FIN0IsRUFJUSxTQUFBLENBQVUsVUFBYixHQUF3QixDQUo3QixDQUFUO0FBQUEsUUFLRSxVQUFBLENBQVMsT0FBZixHLElBQUEsQ0FMSTtBQUFBLFFBTUosT0FBQSxVQUFBLENBTkk7QUFBQSxLLEtBQU4sQyxJQUFBO0FBQUEsQ0FERixDQXZQQTtBQWdRQSxJQUFNLFlBQUEsR0FBQSxPQUFBLENBQUEsWUFBQSxHQUFOLFNBQU0sWUFBTixDQUFxQixNQUFyQixFQUE0QixRQUE1QixFQUNFO0FBQUEsVyxZQUFNO0FBQUEsWUFBQSxVLEdBQVMsSUFBSyxLQUFBLENBQU0saUJBQVgsQ0FBNkIsTUFBN0IsRUFBb0MsUUFBQSxDQUFTLFVBQTdDLENBQVQ7QUFBQSxRQUNFLFVBQUEsQ0FBUyxXQUFmLEdBQTJCLEdBQTNCLENBREk7QUFBQSxRQUVFLFVBQUEsQ0FBUyxTQUFmLEdBQXlCLEdBQXpCLENBRkk7QUFBQSxRQUdFLFVBQUEsQ0FBUyxZQUFmLEcsSUFBQSxDQUhJO0FBQUEsUUFJRSxVQUFBLENBQVMsb0JBQWYsR0FBb0MsR0FBcEMsQ0FKSTtBQUFBLFFBS0osT0FBQSxVQUFBLENBTEk7QUFBQSxLLEtBQU4sQyxJQUFBO0FBQUEsQ0FERixDQWhRQTtBQXdRQSxJQUFNLFNBQUEsR0FBQSxPQUFBLENBQUEsU0FBQSxHQUFOLFNBQU0sU0FBTixDQUFrQixRQUFsQixFQUNFO0FBQUEsVyxZQUFNO0FBQUEsWUFBQSxVLEdBQVMsSUFBSyxLQUFBLENBQU0sbUJBQVgsQ0FDSztBQUFBLFksYUFBWSxTQUFaO0FBQUEsWSxzQkFDcUIsY0FEckI7QUFBQSxZLFNBRVEsS0FGUjtBQUFBLFNBREwsQ0FBVDtBQUFBLFFBSUosV0FBSyxLQUFBLENBQU0sSUFBWCxDQUFnQixRQUFoQixFQUF5QixVQUF6QixFQUpJO0FBQUEsSyxLQUFOLEMsSUFBQTtBQUFBLENBREYsQ0F4UUE7QUFnUkEsSUFBTSxXQUFBLEdBQUEsT0FBQSxDQUFBLFdBQUEsR0FBTixTQUFNLFdBQU4sQ0FBcUIsUUFBckIsRUFBOEIsTUFBOUIsRUFBc0MsU0FBdEMsRUFDRTtBQUFBLFcsWUFBTTtBQUFBLFlBQUEsVyxHQUFXLFFBQUEsQ0FBUyxjQUFWLENBQXlCLE1BQXpCLENBQVY7QUFBQSxRQUNBLElBQUEsVSxHQUFVLFFBQUEsQ0FBUyxhQUFWLENBQXdCLEtBQXhCLENBQVQsQ0FEQTtBQUFBLFFBRUEsSUFBQSxlLEdBQWdCLFFBQUEsQ0FBUyxhQUFWLENBQXdCLFFBQXhCLENBQWYsQ0FGQTtBQUFBLFFBR0EsSUFBQSxZLEdBQWEsUUFBQSxDQUFTLGNBQVYsQ0FBeUIsU0FBekIsQ0FBWixDQUhBO0FBQUEsUUFJQSxJQUFBLGMsR0FBYyxVQUFLLENBQUwsRUFBUTtBQUFBLG1CQUFpQixDQUFoQixDQUFDLGNBQUY7QUFBQSxTQUF0QixDQUpBO0FBQUEsUUFLRSxlQUFBLENBQWUsT0FBckIsR0FBNkIsU0FBN0IsQ0FMSTtBQUFBLFFBTUUsUUFBQSxDQUFTLHVCQUFmLEdBQXVDLGNBQXZDLENBTkk7QUFBQSxRQU9ILFFBQUEsQ0FBUywyQkFBVixDQUFzQyxxQkFBdEMsRUFBNEQsY0FBNUQsRSxLQUFBLEVBUEk7QUFBQSxRQVFVLGVBQWIsQ0FBQyxXQUFGLENBQTZCLFlBQTdCLEVBUkk7QUFBQSxRQVNVLFdBQWIsQ0FBQyxXQUFGLENBQXdCLFFBQUEsQ0FBUyxVQUFqQyxFQVRJO0FBQUEsUUFVVSxXQUFiLENBQUMsV0FBRixDQUF3QixVQUF4QixFQVZJO0FBQUEsUUFXSixPQUFjLFVBQWIsQ0FBQyxXQUFGLENBQXVCLGVBQXZCLEVBWEk7QUFBQSxLLEtBQU4sQyxJQUFBO0FBQUEsQ0FERixDQWhSQTtBQThSQSxJQUFNLGNBQUEsR0FBQSxPQUFBLENBQUEsY0FBQSxHQUFOLFNBQU0sY0FBTixDQUF1QixRQUF2QixFQUFnQyxTQUFoQyxFQUNFO0FBQUEsSztzQkFBWSxRQUFBLENBQVMsZTs7O2dCQUFYLEc7O3dCQUFBLEc7b0JBQ1MsUUFBQSxDQUFTLFFBQWYsQ0FBd0IsR0FBeEIsQ0FBTCxDQUFHLENBQVQsR0FDSyxhQUFILEdBQXdCLFNBQU4sQ0FBZ0IsR0FBaEIsQ0FEcEIsQzt5Q0FEUSxHOztxQkFBQSxHOzs7VUFBVixDLElBQUE7QUFBQSxJQUdNLFFBQUEsQ0FBUyxrQkFBZixHLElBQUEsQ0FIQTtBQUFBLElBSUMsUUFBQSxDQUFTLGtCQUFWLEdBSkE7QUFBQSxJQUtDLFFBQUEsQ0FBUyxvQkFBVixHQUxBO0FBQUEsSUFNQyxRQUFBLENBQVMsbUJBQVYsR0FOQTtBQUFBLElBT0EsT0FBQSxRQUFBLENBUEE7QUFBQSxDQURGLENBOVJBO0FBMFNBLElBQU0sUUFBQSxHQUFBLE9BQUEsQ0FBQSxRQUFBLEdBQU4sU0FBTSxRQUFOLENBQWlCLFNBQWpCLEVBQTRCLFNBQTVCLEVBQXNDLElBQXRDLEU7SUFDRSxJQUFLLEtBQUEsR0FBTSxJQUFLLEtBQUEsQ0FBTSxLQUFYLEVBQVgsQztJQUNDLEtBQUEsQ0FBTSxHQUFQLENBQVcsSUFBSyxLQUFBLENBQU0sVUFBWCxDQUFzQixHQUF0QixDQUFYLEU7SUFFQSxJQUFLLEtBQUEsR0FBTSxJQUFLLEtBQUEsQ0FBTSxLQUFYLEVBQVgsQztJQUNBLElBQUssTUFBQSxHQUFRLFVBQUQsRUFBWixDO0lBQ0EsSUFBSyxRQUFBLEdBQVUsWUFBRCxFQUFkLEM7SUFDQSxJQUFLLFFBQUEsR0FBVSxZQUFELENBQWdCLGFBQUQsQ0FBZ0IsSUFBaEIsQ0FBZixDQUFkLEM7SUFFQyxLQUFBLENBQU0sR0FBUCxDQUFZLG9CQUFELEVBQVgsRTtJQUNDLEtBQUEsQ0FBTSxHQUFQLENBQVcsSUFBSyxLQUFBLENBQU0sWUFBWCxDQUF3QixRQUF4QixFQUFpQyxJQUFqQyxDQUFYLEU7SUFDQyxLQUFBLENBQU0sR0FBUCxDQUFZLFNBQUQsQ0FBWSxRQUFaLENBQVgsRTtJQUVBLElBQU0sT0FBQSxHQUFOLFNBQU0sT0FBTixHQUNFO0FBQUEsUUFBQyxDQUFELENBQUcscURBQUg7QUFBQSxRQUNBLE8sWUFBTTtBQUFBLGdCQUFBLFcsR0FBVyxhQUFELENBQWdCLElBQWhCLENBQVY7QUFBQSxZQUNILENBQUQsQ0FBRyx1QkFBSCxFQURJO0FBQUEsWUFFSixDOzsyQ0FBTTtBQUFBLDJCQUFDLFNBQUQsQ0FBVyxXQUFYO0FBQUEsaUIsQ0FBQSxFOzs7O2tCQUFOLEMsSUFBQSxHQUZJO0FBQUEsWUFHSCxDQUFELENBQUcsd0JBQUgsRUFISTtBQUFBLFlBSUosQzs7MkNBQU07QUFBQSwyQkFBQyxjQUFELENBQWlCLFFBQWpCLEVBQTBCLFdBQTFCO0FBQUEsaUIsQ0FBQSxFOzs7O2tCQUFOLEMsSUFBQSxHQUpJO0FBQUEsWUFLSixPQUFDLENBQUQsQ0FBRyxPQUFILEVBTEk7QUFBQSxTLEtBQU4sQyxJQUFBLEVBREE7QUFBQSxLQURGLEM7SUFTQyxXQUFELENBQWUsUUFBZixFQUF3QixTQUF4QixFQUFtQyxPQUFuQyxFO0lBQ0EsSUFBSyxRQUFBLEdBQVUsWUFBRCxDQUFlLE1BQWYsRUFBc0IsUUFBdEIsQ0FBZCxDO0lBRUEsSUFBTSxNQUFBLEdBQU4sU0FBTSxNQUFOLEdBQ0U7QUFBQSxlLFlBQU07QUFBQSxnQkFBQSxPLEdBQU8sS0FBQSxDQUFNLFFBQVAsRUFBTjtBQUFBLFlBQ0gscUJBQUQsQ0FBdUIsTUFBdkIsRUFESTtBQUFBLFlBRUssUUFBUixDQUFDLE1BQUYsQ0FBa0IsT0FBbEIsRUFGSTtBQUFBLFlBR0osT0FBQyxRQUFBLENBQVMsTUFBVixDQUFpQixLQUFqQixFQUF1QixNQUF2QixFQUhJO0FBQUEsUyxLQUFOLEMsSUFBQTtBQUFBLEtBREYsQztJQU1DLE1BQUQsRzs7Q0EvQkYsQ0ExU0E7QUE2VUEsSUFBTSxTQUFBLEdBQUEsT0FBQSxDQUFBLFNBQUEsR0FBTixTQUFNLFNBQU4sQ0FBa0IsU0FBbEIsRTtJQUNFLElBQUssS0FBQSxHQUFNLElBQUssS0FBQSxDQUFNLEtBQVgsRUFBWCxDO0lBQ0MsS0FBQSxDQUFNLEdBQVAsQ0FBVyxJQUFLLEtBQUEsQ0FBTSxVQUFYLENBQXNCLEdBQXRCLENBQVgsRTtJQUVBLElBQUssS0FBQSxHQUFNLElBQUssS0FBQSxDQUFNLEtBQVgsRUFBWCxDO0lBQ0EsSUFBSyxNQUFBLEdBQVEsVUFBRCxFQUFaLEM7SUFDQSxJQUFLLFFBQUEsR0FBVSxZQUFELEVBQWQsQztJQUNBLElBQUssU0FBQSxHQUFXLGFBQUQsQ0FBdUIsQ0FBRCxDQUFHLGlCQUFILENBQUwsQ0FBQyxHQUFGLEVBQWhCLENBQWYsQztJQUNBLElBQUssUUFBQSxHQUFVLFlBQUQsQ0FBZSxTQUFmLENBQWQsQztJQUNBLElBQUssS0FBQSxHQUFPLFNBQUQsQ0FBWSxRQUFaLENBQVgsQztJQUVDLEtBQUEsQ0FBTSxHQUFQLENBQVksb0JBQUQsRUFBWCxFO0lBQ0MsS0FBQSxDQUFNLEdBQVAsQ0FBVyxJQUFLLEtBQUEsQ0FBTSxZQUFYLENBQXdCLFFBQXhCLEVBQWlDLElBQWpDLENBQVgsRTtJQUNDLEtBQUEsQ0FBTSxHQUFQLENBQVcsS0FBWCxFO0lBRUEsSUFBTSxPQUFBLEdBQU4sU0FBTSxPQUFOLEdBQ0U7QUFBQSxRQUFDLENBQUQsQ0FBRyxxREFBSDtBQUFBLFFBQ0MsS0FBQSxDQUFNLE1BQVAsQ0FBYyxLQUFkLEVBREE7QUFBQSxRQUVNLFNBQU4sR0FBaUIsYUFBRCxDQUF1QixDQUFELENBQUcsaUJBQUgsQ0FBTCxDQUFDLEdBQUYsRUFBaEIsQ0FBaEIsQ0FGQTtBQUFBLFFBR00sUUFBTixHQUFnQixZQUFELENBQWUsU0FBZixDQUFmLENBSEE7QUFBQSxRQUlNLEtBQU4sR0FBYSxTQUFELENBQVksUUFBWixDQUFaLENBSkE7QUFBQSxRQUtDLEtBQUEsQ0FBTSxHQUFQLENBQVcsS0FBWCxFQUxBO0FBQUEsUUFNQyxDQUFELENBQUcsdUJBQUgsRUFOQTtBQUFBLFFBT0EsQzs7dUNBQU07QUFBQSx1QkFBQyx5QkFBRCxDQUE2QixTQUE3QjtBQUFBLGEsQ0FBQSxFOzs7O2NBQU4sQyxJQUFBLEdBUEE7QUFBQSxRQVFDLENBQUQsQ0FBRyx3QkFBSCxFQVJBO0FBQUEsUUFTQSxDOzt1Q0FBTTtBQUFBLHVCQUFDLGNBQUQsQ0FBaUIsUUFBakIsRUFBMEIsU0FBMUI7QUFBQSxhLENBQUEsRTs7OztjQUFOLEMsSUFBQSxHQVRBO0FBQUEsUUFVQSxPQUFDLENBQUQsQ0FBRyxPQUFILEVBVkE7QUFBQSxLQURGLEM7SUFhQyxXQUFELENBQWUsUUFBZixFQUF3QixTQUF4QixFQUFtQyxPQUFuQyxFO0lBQ0EsSUFBSyxRQUFBLEdBQVUsWUFBRCxDQUFlLE1BQWYsRUFBc0IsUUFBdEIsQ0FBZCxDO0lBRUEsSUFBTSxNQUFBLEdBQU4sU0FBTSxNQUFOLEdBQ0U7QUFBQSxlLFlBQU07QUFBQSxnQkFBQSxPLEdBQU8sS0FBQSxDQUFNLFFBQVAsRUFBTjtBQUFBLFlBQ0gscUJBQUQsQ0FBdUIsTUFBdkIsRUFESTtBQUFBLFlBRUssUUFBUixDQUFDLE1BQUYsQ0FBa0IsT0FBbEIsRUFGSTtBQUFBLFlBR0osT0FBQyxRQUFBLENBQVMsTUFBVixDQUFpQixLQUFqQixFQUF1QixNQUF2QixFQUhJO0FBQUEsUyxLQUFOLEMsSUFBQTtBQUFBLEtBREYsQztJQU1DLE1BQUQsRzs7Q0FyQ0YsQ0E3VUE7QUF1WEEsSUFBTSxHQUFBLEdBQUEsT0FBQSxDQUFBLEdBQUEsR0FBTixTQUFNLEdBQU4sR0FDRTtBQUFBLElBQUMsUUFBRCxDQUFXLGFBQVgsRUFBeUIsV0FBekIsRUFBc0MsQ0FBdEM7QUFBQSxJQUNDLFFBQUQsQ0FBVyxZQUFYLEVBQXdCLHNCQUF4QixFQUFpRCxDQUFqRCxFQURBO0FBQUEsSUFFQyxRQUFELENBQVcsWUFBWCxFQUF3QixzQkFBeEIsRUFBaUQsQ0FBakQsRUFGQTtBQUFBLElBR0MsUUFBRCxDQUFXLFlBQVgsRUFBd0Isc0JBQXhCLEVBQWlELENBQWpELEVBSEE7QUFBQSxJQUlDLFFBQUQsQ0FBVyxZQUFYLEVBQXdCLG9CQUF4QixFQUE4QyxDQUE5QyxFQUpBO0FBQUEsSUFLQSxPQUFDLFNBQUQsQ0FBWSxZQUFaLEVBTEE7QUFBQSxDQURGLENBdlhBO0FBbVlDLENBQUQsQ0FBRyxHQUFIIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIjsgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWYgd2lkdGggNjEwKVxuKGRlZiBoZWlnaHQgNDAwKVxuKGRlZiB3aXJlZnJhbWUgdHJ1ZSlcbihkZWYgd2lyZWZyYW1lLXdpZHRoIDEuMilcbihkZWYgdGVycmFpbi1oZWlnaHQgNTApXG4oZGVmIHRlcnJhaW4tc2l6ZSAxMDApXG5cbjsgR2VuZXJhbCBVdGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWZtYWNybyB3aGVuIFtjb25kaXRpb24gJiBib2R5XVxuICBgKGlmIH5jb25kaXRpb25cbiAgICAgKGRvIH5AYm9keSkpKVxuXG4oZGVmbWFjcm8gZG8tdGltZXMgW3Zhcm5hbWUgbGltaXQgJiBib2R5XVxuICAobGV0IFtlbmQgKGdlbnN5bSldXG4gICAgYChsZXQgW35lbmQgfmxpbWl0XVxuICAgICAgIChsb29wIFt+dmFybmFtZSAwXVxuICAgICAgICAgKHdoZW4gKDwgfnZhcm5hbWUgfmVuZClcbiAgICAgICAgICAgfkBib2R5XG4gICAgICAgICAgIChyZWN1ciAoKyAxIH52YXJuYW1lKSkpKSkpKVxuXG4oZGVmbWFjcm8gZG8tbmVzdGVkIFt4bmFtZSB5bmFtZSB3aWR0aCAmIGJvZHldXG4gIChsZXQgW2l0ZXJhdGlvbnMgKGdlbnN5bSldXG4gICAgYChsZXQgW35pdGVyYXRpb25zIH53aWR0aF1cbiAgICAgICAoZG8tdGltZXMgfnhuYW1lIH5pdGVyYXRpb25zXG4gICAgICAgICAoZG8tdGltZXMgfnluYW1lIH5pdGVyYXRpb25zXG4gICAgICAgICAgIH5AYm9keSkpKSkpXG5cbihkZWZtYWNybyBpbmMhIFtwbGFjZV1cbiAgYChzZXQhIH5wbGFjZSAoKyB+cGxhY2UgMSkpKVxuXG4oZGVmbWFjcm8gYWRkISBbcGxhY2UgYW1vdW50XVxuICBgKHNldCEgfnBsYWNlICgrIH5wbGFjZSB+YW1vdW50KSkpXG5cbihkZWZtYWNybyB0aW1lIFsmIGJvZHldXG4gIChsZXQgW3N0YXJ0IChnZW5zeW0pXG4gICAgICAgIGVuZCAoZ2Vuc3ltKVxuICAgICAgICByZXN1bHQgKGdlbnN5bSldXG4gICAgYChsZXQgW35zdGFydCAoLmdldFRpbWUgKG5ldyBEYXRlKSlcbiAgICAgICAgICAgfnJlc3VsdCAoZG8gfkBib2R5KVxuICAgICAgICAgICB+ZW5kICguZ2V0VGltZSAobmV3IERhdGUpKV1cbiAgICAgICAobCAoKyBcIkVsYXBzZWQgdGltZTogXCIgKC0gfmVuZCB+c3RhcnQpIFwibXMuXCIpKVxuICAgICAgIH5yZXN1bHQpKSlcblxuKGRlZm4gbCBbdl1cbiAgKGNvbnNvbGUubG9nIHYpKVxuXG5cbihkZWZuIG1pZHBvaW50IFthIGJdXG4gICgvICgrIGEgYikgMikpXG5cbihkZWZuIGF2ZXJhZ2UyIFthIGJdXG4gICgvICgrIGEgYikgMikpXG5cbihkZWZuIGF2ZXJhZ2U0IFthIGIgYyBkXVxuICAoLyAoKyBhIGIgYyBkKSA0KSlcblxuKGRlZm4gc2FmZS1hdmVyYWdlIFthIGIgYyBkXVxuICAobGV0IFt0b3RhbCAwIGNvdW50IDBdXG4gICAgKHdoZW4gYSAoYWRkISB0b3RhbCBhKSAoaW5jISBjb3VudCkpXG4gICAgKHdoZW4gYiAoYWRkISB0b3RhbCBiKSAoaW5jISBjb3VudCkpXG4gICAgKHdoZW4gYyAoYWRkISB0b3RhbCBjKSAoaW5jISBjb3VudCkpXG4gICAgKHdoZW4gZCAoYWRkISB0b3RhbCBkKSAoaW5jISBjb3VudCkpXG4gICAgKC8gdG90YWwgY291bnQpKSlcblxuXG4oZGVmbiByYW5kIFtdXG4gIChNYXRoLnJhbmRvbSkpXG5cbihkZWZuIHJhbmQtYXJvdW5kLXplcm8gW3NwcmVhZF1cbiAgKC0gKCogc3ByZWFkIChyYW5kKSAyKSBzcHJlYWQpKVxuXG5cbihkZWZuIGppdHRlciBbdmFsdWUgc3ByZWFkXVxuICAoKyB2YWx1ZSAocmFuZC1hcm91bmQtemVybyBzcHJlYWQpKSlcblxuXG47IEhlaWdodG1hcCBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4oZGVmbWFjcm8gaGVpZ2h0bWFwLWdldCBbaG0geCB5XVxuICBgKGFnZXQgfmhtICgrICgqIH55ICguLXJlc29sdXRpb24gfmhtKSkgfngpKSlcblxuKGRlZm4gaGVpZ2h0bWFwLWdldC1zYWZlIFtobSB4IHldXG4gICh3aGVuIChhbmQgKDw9IDAgeCBobS5sYXN0KVxuICAgICAgICAgICAgICg8PSAwIHkgaG0ubGFzdCkpXG4gICAgKGhlaWdodG1hcC1nZXQgaG0geCB5KSkpXG5cbihkZWZtYWNybyBoZWlnaHRtYXAtc2V0ISBbaG0geCB5IHZhbF1cbiAgYChzZXQhIChoZWlnaHRtYXAtZ2V0IH5obSB+eCB+eSkgfnZhbCkpXG5cblxuKGRlZm4gbm9ybWFsaXplIFtobV1cbiAgKGxldCBbbWF4ICgtIEluZmluaXR5KVxuICAgICAgICBtaW4gSW5maW5pdHldXG4gICAgKGRvLXRpbWVzIGkgaG0ubGVuZ3RoXG4gICAgICAobGV0IFtlbCAoYWdldCBobSBpKV1cbiAgICAgICAgKHdoZW4gKDwgbWF4IGVsKSAoc2V0ISBtYXggZWwpKVxuICAgICAgICAod2hlbiAoPiBtaW4gZWwpIChzZXQhIG1pbiBlbCkpKSlcbiAgICAobGV0IFtzcGFuICgtIG1heCBtaW4pXVxuICAgICAgKGRvLXRpbWVzIGkgaG0ubGVuZ3RoXG4gICAgICAgIChzZXQhIChhZ2V0IGhtIGkpXG4gICAgICAgICAgKC8gKC0gKGFnZXQgaG0gaSkgbWluKVxuICAgICAgICAgICAgIHNwYW4pKSkpKSlcblxuKGRlZm4gemVyby1oZWlnaHRtYXAgW2hlaWdodG1hcF1cbiAgKGRvLXRpbWVzIGkgaGVpZ2h0bWFwLmxlbmd0aFxuICAgIChzZXQhIChhZ2V0IGhlaWdodG1hcCBpKSAwLjApKVxuICBoZWlnaHRtYXApXG5cbihkZWZuIG1ha2UtaGVpZ2h0bWFwIFtleHBvbmVudF1cbiAgKGxldCBbcmVzb2x1dGlvbiAoKyAxIChNYXRoLnBvdyAyIGV4cG9uZW50KSldXG4gICAgKGwgKCsgXCJDcmVhdGluZyBcIiByZXNvbHV0aW9uIFwiIGJ5IFwiIHJlc29sdXRpb24gXCIgaGVpZ2h0bWFwLi4uXCIpKVxuICAgIChkZWYgaGVpZ2h0bWFwXG4gICAgICAobmV3IEFycmF5ICgqIHJlc29sdXRpb24gcmVzb2x1dGlvbikpKVxuICAgIChzZXQhIGhlaWdodG1hcC5yZXNvbHV0aW9uIHJlc29sdXRpb24pXG4gICAgKHNldCEgaGVpZ2h0bWFwLmV4cG9uZW50IGV4cG9uZW50KVxuICAgIChzZXQhIGhlaWdodG1hcC5sYXN0ICgtIHJlc29sdXRpb24gMSkpXG4gICAgKHplcm8taGVpZ2h0bWFwIGhlaWdodG1hcCkpKVxuXG5cbjsgUmFuZG9tIE5vaXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWZuIHJhbmRvbS1ub2lzZSBbaGVpZ2h0bWFwXVxuICAoZG8tdGltZXMgaSBoZWlnaHRtYXAubGVuZ3RoXG4gICAgKHNldCEgKGFnZXQgaGVpZ2h0bWFwIGkpIChyYW5kKSkpKVxuXG5cbjsgTWlkcG9pbnQgRGlzcGxhY2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWZuIG1wZC1pbml0LWNvcm5lcnMgW2hlaWdodG1hcF1cbiAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCAwIDAgKHJhbmQpKVxuICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIDAgaGVpZ2h0bWFwLmxhc3QgKHJhbmQpKVxuICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIGhlaWdodG1hcC5sYXN0IDAgKHJhbmQpKVxuICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIGhlaWdodG1hcC5sYXN0IGhlaWdodG1hcC5sYXN0IChyYW5kKSkpXG5cbihkZWZuIG1wZC1kaXNwbGFjZSBbaGVpZ2h0bWFwIGx4IHJ4IGJ5IHR5IHNwcmVhZF1cbiAgKGxldCBbY3ggKG1pZHBvaW50IGx4IHJ4KVxuICAgICAgICBjeSAobWlkcG9pbnQgYnkgdHkpXG5cbiAgICAgICAgYm90dG9tLWxlZnQgKGhlaWdodG1hcC1nZXQgaGVpZ2h0bWFwIGx4IGJ5KVxuICAgICAgICBib3R0b20tcmlnaHQgKGhlaWdodG1hcC1nZXQgaGVpZ2h0bWFwIHJ4IGJ5KVxuICAgICAgICB0b3AtbGVmdCAoaGVpZ2h0bWFwLWdldCBoZWlnaHRtYXAgbHggdHkpXG4gICAgICAgIHRvcC1yaWdodCAoaGVpZ2h0bWFwLWdldCBoZWlnaHRtYXAgcnggdHkpXG5cbiAgICAgICAgdG9wIChhdmVyYWdlMiB0b3AtbGVmdCB0b3AtcmlnaHQpXG4gICAgICAgIGxlZnQgKGF2ZXJhZ2UyIGJvdHRvbS1sZWZ0IHRvcC1sZWZ0KVxuICAgICAgICBib3R0b20gKGF2ZXJhZ2UyIGJvdHRvbS1sZWZ0IGJvdHRvbS1yaWdodClcbiAgICAgICAgcmlnaHQgKGF2ZXJhZ2UyIGJvdHRvbS1yaWdodCB0b3AtcmlnaHQpXG4gICAgICAgIGNlbnRlciAoYXZlcmFnZTQgdG9wIGxlZnQgYm90dG9tIHJpZ2h0KV1cbiAgICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIGN4IGJ5IChqaXR0ZXIgYm90dG9tIHNwcmVhZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCBjeCB0eSAoaml0dGVyIHRvcCBzcHJlYWQpKVxuICAgIChoZWlnaHRtYXAtc2V0ISBoZWlnaHRtYXAgbHggY3kgKGppdHRlciBsZWZ0IHNwcmVhZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCByeCBjeSAoaml0dGVyIHJpZ2h0IHNwcmVhZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCBjeCBjeSAoaml0dGVyIGNlbnRlciBzcHJlYWQpKSkpXG5cbihkZWZuIG1pZHBvaW50LWRpc3BsYWNlbWVudCBbaGVpZ2h0bWFwXVxuICAobXBkLWluaXQtY29ybmVycyBoZWlnaHRtYXApXG4gIDsgKG1wZC1kaXNwbGFjZSBoZWlnaHRtYXAgMCBoZWlnaHRtYXAubGFzdCAwIGhlaWdodG1hcC5sYXN0IDAuMSlcbiAgKGxvb3AgW2l0ZXIgMFxuICAgICAgICAgc3ByZWFkIDAuM11cbiAgICAod2hlbiAoPCBpdGVyIGhlaWdodG1hcC5leHBvbmVudClcbiAgICAgIChsZXQgW2NodW5rcyAoTWF0aC5wb3cgMiBpdGVyKVxuICAgICAgICAgICAgY2h1bmstd2lkdGggKC8gKC0gaGVpZ2h0bWFwLnJlc29sdXRpb24gMSkgY2h1bmtzKV1cbiAgICAgICAgKGRvLW5lc3RlZCB4Y2h1bmsgeWNodW5rIGNodW5rc1xuICAgICAgICAgIChsZXQgW2xlZnQteCAoKiBjaHVuay13aWR0aCB4Y2h1bmspXG4gICAgICAgICAgICAgICAgcmlnaHQteCAoKyBsZWZ0LXggY2h1bmstd2lkdGgpXG4gICAgICAgICAgICAgICAgYm90dG9tLXkgKCogY2h1bmstd2lkdGggeWNodW5rKVxuICAgICAgICAgICAgICAgIHRvcC15ICgrIGJvdHRvbS15IGNodW5rLXdpZHRoKV1cbiAgICAgICAgICAgIChtcGQtZGlzcGxhY2UgaGVpZ2h0bWFwIGxlZnQteCByaWdodC14IGJvdHRvbS15IHRvcC15IHNwcmVhZCkpKSlcbiAgICAgIChyZWN1ciAoKyAxIGl0ZXIpICgqIHNwcmVhZCAwLjUpKSkpXG4gIChub3JtYWxpemUgaGVpZ2h0bWFwKSlcblxuXG4oZGVmbiBtaWRwb2ludC1kaXNwbGFjZW1lbnQtZmluYWwgW2hlaWdodG1hcF1cbiAgKG1wZC1pbml0LWNvcm5lcnMgaGVpZ2h0bWFwKVxuICA7IChsZXQgW3NwcmVhZCBdKVxuICAobG9vcCBbaXRlciAwXG4gICAgICAgICBzcHJlYWQgKCsgMCAoLnZhbCAoJCBcIiNpbnB1dC1zdGFydGluZy1zcHJlYWRcIikpKV1cbiAgICAod2hlbiAoPCBpdGVyIGhlaWdodG1hcC5leHBvbmVudClcbiAgICAgIChsZXQgW2NodW5rcyAoTWF0aC5wb3cgMiBpdGVyKVxuICAgICAgICAgICAgY2h1bmstd2lkdGggKC8gKC0gaGVpZ2h0bWFwLnJlc29sdXRpb24gMSkgY2h1bmtzKV1cbiAgICAgICAgKGRvLW5lc3RlZCB4Y2h1bmsgeWNodW5rIGNodW5rc1xuICAgICAgICAgIChsZXQgW2xlZnQteCAoKiBjaHVuay13aWR0aCB4Y2h1bmspXG4gICAgICAgICAgICAgICAgcmlnaHQteCAoKyBsZWZ0LXggY2h1bmstd2lkdGgpXG4gICAgICAgICAgICAgICAgYm90dG9tLXkgKCogY2h1bmstd2lkdGggeWNodW5rKVxuICAgICAgICAgICAgICAgIHRvcC15ICgrIGJvdHRvbS15IGNodW5rLXdpZHRoKV1cbiAgICAgICAgICAgIChtcGQtZGlzcGxhY2UgaGVpZ2h0bWFwIGxlZnQteCByaWdodC14IGJvdHRvbS15IHRvcC15IHNwcmVhZCkpKSlcbiAgICAgIChyZWN1ciAoKyAxIGl0ZXIpICgqIHNwcmVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKCsgMCAoLnZhbCAoJCBcIiNpbnB1dC1zcHJlYWQtcmVkdWN0aW9uXCIpKSkpKSkpXG4gIChub3JtYWxpemUgaGVpZ2h0bWFwKSlcblxuXG4oZGVmbiBtcGQtZGlzcGxhY2UtZDIgW2hlaWdodG1hcCBseCByeCBieSB0eSBzcHJlYWRdXG4gIChsZXQgW2N4IChtaWRwb2ludCBseCByeClcbiAgICAgICAgY3kgKG1pZHBvaW50IGJ5IHR5KVxuXG4gICAgICAgIGJvdHRvbS1sZWZ0IChoZWlnaHRtYXAtZ2V0IGhlaWdodG1hcCBseCBieSlcbiAgICAgICAgYm90dG9tLXJpZ2h0IChoZWlnaHRtYXAtZ2V0IGhlaWdodG1hcCByeCBieSlcbiAgICAgICAgdG9wLWxlZnQgKGhlaWdodG1hcC1nZXQgaGVpZ2h0bWFwIGx4IHR5KVxuICAgICAgICB0b3AtcmlnaHQgKGhlaWdodG1hcC1nZXQgaGVpZ2h0bWFwIHJ4IHR5KVxuXG4gICAgICAgIHRvcCAoYXZlcmFnZTIgdG9wLWxlZnQgdG9wLXJpZ2h0KVxuICAgICAgICBsZWZ0IChhdmVyYWdlMiBib3R0b20tbGVmdCB0b3AtbGVmdClcbiAgICAgICAgYm90dG9tIChhdmVyYWdlMiBib3R0b20tbGVmdCBib3R0b20tcmlnaHQpXG4gICAgICAgIHJpZ2h0IChhdmVyYWdlMiBib3R0b20tcmlnaHQgdG9wLXJpZ2h0KV1cbiAgICAoaGVpZ2h0bWFwLXNldCEgaGVpZ2h0bWFwIGN4IGJ5IChqaXR0ZXIgYm90dG9tIHNwcmVhZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCBjeCB0eSAoaml0dGVyIHRvcCBzcHJlYWQpKVxuICAgIChoZWlnaHRtYXAtc2V0ISBoZWlnaHRtYXAgbHggY3kgKGppdHRlciBsZWZ0IHNwcmVhZCkpXG4gICAgKGhlaWdodG1hcC1zZXQhIGhlaWdodG1hcCByeCBjeSAoaml0dGVyIHJpZ2h0IHNwcmVhZCkpKSlcblxuKGRlZm4gbWlkcG9pbnQtZGlzcGxhY2VtZW50LWQxIFtoZWlnaHRtYXBdXG4gIChtcGQtaW5pdC1jb3JuZXJzIGhlaWdodG1hcCkpXG5cbihkZWZuIG1pZHBvaW50LWRpc3BsYWNlbWVudC1kMiBbaGVpZ2h0bWFwXVxuICAobXBkLWluaXQtY29ybmVycyBoZWlnaHRtYXApXG4gIChtcGQtZGlzcGxhY2UtZDIgaGVpZ2h0bWFwXG4gICAgICAgICAgICAgICAgICAgMCBoZWlnaHRtYXAubGFzdFxuICAgICAgICAgICAgICAgICAgIDAgaGVpZ2h0bWFwLmxhc3RcbiAgICAgICAgICAgICAgICAgICAwLjEpKVxuXG4oZGVmbiBtaWRwb2ludC1kaXNwbGFjZW1lbnQtZDMgW2hlaWdodG1hcF1cbiAgKG1wZC1pbml0LWNvcm5lcnMgaGVpZ2h0bWFwKVxuICAobXBkLWRpc3BsYWNlIGhlaWdodG1hcFxuICAgICAgICAgICAgICAgIDAgaGVpZ2h0bWFwLmxhc3RcbiAgICAgICAgICAgICAgICAwIGhlaWdodG1hcC5sYXN0XG4gICAgICAgICAgICAgICAgMC4xKSlcblxuXG5cbjsgVGhyZWUuanMgSGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbihkZWZuIG1ha2UtZGlyZWN0aW9uYWwtbGlnaHQgW11cbiAgKGxldCBbbGlnaHQgKG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0IDB4ZmZmZmZmIDEpXVxuICAgIChsaWdodC5wb3NpdGlvbi5zZXQgMTAwIDAgMTUwKVxuICAgIGxpZ2h0KSlcblxuKGRlZm4gbWFrZS1jYW1lcmEgW11cbiAgKGxldCBbY2FtZXJhIChuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmFcbiAgICAgICAgICAgICAgICAgICAgNTUsXG4gICAgICAgICAgICAgICAgICAgICgvIHdpZHRoIGhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgMC4xLFxuICAgICAgICAgICAgICAgICAgICAxMDAwKV1cbiAgICAoY2FtZXJhLnBvc2l0aW9uLnNldCAwIC0xMDAgMTUwKVxuICAgIGNhbWVyYSkpXG5cbihkZWZuIG1ha2UtcmVuZGVyZXIgW11cbiAgKGxldCBbcmVuZGVyZXIgKG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyIHs6YW50aWFsaWFzIGZhbHNlfSldXG4gICAgKHJlbmRlcmVyLnNldENsZWFyQ29sb3IgMHhmZmZmZmYpXG4gICAgKHJlbmRlcmVyLnNldFNpemUgd2lkdGggaGVpZ2h0KVxuICAgIChyZW5kZXJlci5zZXRQaXhlbFJhdGlvIDIpXG4gICAgcmVuZGVyZXIpKVxuXG4oZGVmbiBtYWtlLWdlb21ldHJ5IFtoZWlnaHRtYXBdXG4gIChsZXQgW2dlb21ldHJ5IChuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeVxuICAgICAgICAgICAgICAgICAgICAgIHRlcnJhaW4tc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgIHRlcnJhaW4tc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICgtIGhlaWdodG1hcC5yZXNvbHV0aW9uIDEpXG4gICAgICAgICAgICAgICAgICAgICAgKC0gaGVpZ2h0bWFwLnJlc29sdXRpb24gMSkpXVxuICAgIChzZXQhIGdlb21ldHJ5LmR5bmFtaWMgdHJ1ZSlcbiAgICBnZW9tZXRyeSkpXG5cbihkZWZuIG1ha2UtY29udHJvbHMgW2NhbWVyYSByZW5kZXJlcl1cbiAgKGxldCBbY29udHJvbHMgKG5ldyBUSFJFRS5UcmFja2JhbGxDb250cm9scyBjYW1lcmEgcmVuZGVyZXIuZG9tRWxlbWVudCldXG4gICAgKHNldCEgY29udHJvbHMucm90YXRlU3BlZWQgMS40KVxuICAgIChzZXQhIGNvbnRyb2xzLnpvb21TcGVlZCAwLjUpXG4gICAgKHNldCEgY29udHJvbHMuc3RhdGljTW92aW5nIHRydWUpXG4gICAgKHNldCEgY29udHJvbHMuZHluYW1pY0RhbXBpbmdGYWN0b3IgMC4zKVxuICAgIGNvbnRyb2xzKSlcblxuKGRlZm4gbWFrZS1wbGFuZSBbZ2VvbWV0cnldXG4gIChsZXQgW21hdGVyaWFsIChuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbFxuICAgICAgICAgICAgICAgICAgICAgIHs6d2lyZWZyYW1lIHdpcmVmcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICA6d2lyZWZyYW1lTGluZXdpZHRoIHdpcmVmcmFtZS13aWR0aFxuICAgICAgICAgICAgICAgICAgICAgICA6Y29sb3IgMHgwMGJiMDB9KV1cbiAgICAobmV3IFRIUkVFLk1lc2ggZ2VvbWV0cnkgbWF0ZXJpYWwpKSlcblxuXG4oZGVmbiBhdHRhY2gtdG8tZG9tIFtyZW5kZXJlciBlbC1uYW1lIHJlZnJlc2gtZm5dXG4gIChsZXQgW2NvbnRhaW5lciAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgZWwtbmFtZSlcbiAgICAgICAgc2V0dGluZ3MgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgXCJkaXZcIilcbiAgICAgICAgcmVmcmVzaC1idXR0b24gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgXCJidXR0b25cIilcbiAgICAgICAgYnV0dG9uLXRleHQgKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlIFwiUmVmcmVzaFwiKVxuICAgICAgICBjYW5jZWwtc2Nyb2xsIChmbiBbZV0gKC5wcmV2ZW50RGVmYXVsdCBlKSldXG4gICAgKHNldCEgcmVmcmVzaC1idXR0b24ub25jbGljayByZWZyZXNoLWZuKVxuICAgIChzZXQhIHJlbmRlcmVyLmRvbUVsZW1lbnQub25tb3VzZXdoZWVsIGNhbmNlbC1zY3JvbGwpXG4gICAgKHJlbmRlcmVyLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciBcIk1vek1vdXNlUGl4ZWxTY3JvbGxcIiBjYW5jZWwtc2Nyb2xsIGZhbHNlKVxuICAgICguYXBwZW5kQ2hpbGQgcmVmcmVzaC1idXR0b24gYnV0dG9uLXRleHQpXG4gICAgKC5hcHBlbmRDaGlsZCBjb250YWluZXIgcmVuZGVyZXIuZG9tRWxlbWVudClcbiAgICAoLmFwcGVuZENoaWxkIGNvbnRhaW5lciBzZXR0aW5ncylcbiAgICAoLmFwcGVuZENoaWxkIHNldHRpbmdzIHJlZnJlc2gtYnV0dG9uKSkpXG5cbihkZWZuIHVwZGF0ZS1nZW9tZXRyeSBbZ2VvbWV0cnkgaGVpZ2h0bWFwXVxuICAoZG8tdGltZXMgaSBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGhcbiAgICAoc2V0ISAoLi16IChhZ2V0IGdlb21ldHJ5LnZlcnRpY2VzIGkpKVxuICAgICAgKCogdGVycmFpbi1oZWlnaHQgKGFnZXQgaGVpZ2h0bWFwIGkpKSkpXG4gIChzZXQhIGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSB0cnVlKVxuICAoZ2VvbWV0cnkuY29tcHV0ZUZhY2VOb3JtYWxzKVxuICAoZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMpXG4gIChnZW9tZXRyeS5jb21wdXRlTW9ycGhOb3JtYWxzKVxuICBnZW9tZXRyeSlcblxuXG47IE1haW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4oZGVmbiBtYWtlLWRlbW8gW2VsZW1lbnQtaWQgYWxnb3JpdGhtIHNpemVdXG4gIChkZWYgc2NlbmUgKG5ldyBUSFJFRS5TY2VuZSkpXG4gIChzY2VuZS5hZGQgKG5ldyBUSFJFRS5BeGlzSGVscGVyIDEwMCkpXG5cbiAgKGRlZiBjbG9jayAobmV3IFRIUkVFLkNsb2NrKSlcbiAgKGRlZiBjYW1lcmEgKG1ha2UtY2FtZXJhKSlcbiAgKGRlZiByZW5kZXJlciAobWFrZS1yZW5kZXJlcikpXG4gIChkZWYgZ2VvbWV0cnkgKG1ha2UtZ2VvbWV0cnkgKG1ha2UtaGVpZ2h0bWFwIHNpemUpKSlcblxuICAoc2NlbmUuYWRkIChtYWtlLWRpcmVjdGlvbmFsLWxpZ2h0KSlcbiAgKHNjZW5lLmFkZCAobmV3IFRIUkVFLkFtYmllbnRMaWdodCAweGZmZmZmZiAwLjA1KSlcbiAgKHNjZW5lLmFkZCAobWFrZS1wbGFuZSBnZW9tZXRyeSkpXG5cbiAgKGRlZm4gcmVmcmVzaCBbXVxuICAgIChsIFwiUmVmcmVzaGluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIpXG4gICAgKGxldCBbaGVpZ2h0bWFwIChtYWtlLWhlaWdodG1hcCBzaXplKV1cbiAgICAgIChsIFwiR2VuZXJhdGluZyB0ZXJyYWluLi4uXCIpXG4gICAgICAodGltZSAoYWxnb3JpdGhtIGhlaWdodG1hcCkpXG4gICAgICAobCBcIlJlZnJlc2hpbmcgZ2VvbWV0cnkuLi5cIilcbiAgICAgICh0aW1lICh1cGRhdGUtZ2VvbWV0cnkgZ2VvbWV0cnkgaGVpZ2h0bWFwKSlcbiAgICAgIChsIFwiRG9uZSFcIikpKVxuXG4gIChhdHRhY2gtdG8tZG9tIHJlbmRlcmVyIGVsZW1lbnQtaWQgcmVmcmVzaClcbiAgKGRlZiBjb250cm9scyAobWFrZS1jb250cm9scyBjYW1lcmEgcmVuZGVyZXIpKVxuXG4gIChkZWZuIHJlbmRlciBbXVxuICAgIChsZXQgW2RlbHRhIChjbG9jay5nZXREZWx0YSldXG4gICAgICAocmVxdWVzdEFuaW1hdGlvbkZyYW1lIHJlbmRlcilcbiAgICAgICgudXBkYXRlIGNvbnRyb2xzIGRlbHRhKVxuICAgICAgKHJlbmRlcmVyLnJlbmRlciBzY2VuZSBjYW1lcmEpKSlcblxuICAocmVuZGVyKVxuXG4gIG5pbClcblxuKGRlZm4gbWFrZS1maW5hbCBbZWxlbWVudC1pZF1cbiAgKGRlZiBzY2VuZSAobmV3IFRIUkVFLlNjZW5lKSlcbiAgKHNjZW5lLmFkZCAobmV3IFRIUkVFLkF4aXNIZWxwZXIgMTAwKSlcblxuICAoZGVmIGNsb2NrIChuZXcgVEhSRUUuQ2xvY2spKVxuICAoZGVmIGNhbWVyYSAobWFrZS1jYW1lcmEpKVxuICAoZGVmIHJlbmRlcmVyIChtYWtlLXJlbmRlcmVyKSlcbiAgKGRlZiBoZWlnaHRtYXAgKG1ha2UtaGVpZ2h0bWFwICgudmFsICgkIFwiI2lucHV0LWV4cG9uZW50XCIpKSkpXG4gIChkZWYgZ2VvbWV0cnkgKG1ha2UtZ2VvbWV0cnkgaGVpZ2h0bWFwKSlcbiAgKGRlZiBwbGFuZSAobWFrZS1wbGFuZSBnZW9tZXRyeSkpXG5cbiAgKHNjZW5lLmFkZCAobWFrZS1kaXJlY3Rpb25hbC1saWdodCkpXG4gIChzY2VuZS5hZGQgKG5ldyBUSFJFRS5BbWJpZW50TGlnaHQgMHhmZmZmZmYgMC4wNSkpXG4gIChzY2VuZS5hZGQgcGxhbmUpXG5cbiAgKGRlZm4gcmVmcmVzaCBbXVxuICAgIChsIFwiUmVmcmVzaGluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIpXG4gICAgKHNjZW5lLnJlbW92ZSBwbGFuZSlcbiAgICAoc2V0ISBoZWlnaHRtYXAgKG1ha2UtaGVpZ2h0bWFwICgudmFsICgkIFwiI2lucHV0LWV4cG9uZW50XCIpKSkpXG4gICAgKHNldCEgZ2VvbWV0cnkgKG1ha2UtZ2VvbWV0cnkgaGVpZ2h0bWFwKSlcbiAgICAoc2V0ISBwbGFuZSAobWFrZS1wbGFuZSBnZW9tZXRyeSkpXG4gICAgKHNjZW5lLmFkZCBwbGFuZSlcbiAgICAobCBcIkdlbmVyYXRpbmcgdGVycmFpbi4uLlwiKVxuICAgICh0aW1lIChtaWRwb2ludC1kaXNwbGFjZW1lbnQtZmluYWwgaGVpZ2h0bWFwKSlcbiAgICAobCBcIlJlZnJlc2hpbmcgZ2VvbWV0cnkuLi5cIilcbiAgICAodGltZSAodXBkYXRlLWdlb21ldHJ5IGdlb21ldHJ5IGhlaWdodG1hcCkpXG4gICAgKGwgXCJEb25lIVwiKSlcblxuICAoYXR0YWNoLXRvLWRvbSByZW5kZXJlciBlbGVtZW50LWlkIHJlZnJlc2gpXG4gIChkZWYgY29udHJvbHMgKG1ha2UtY29udHJvbHMgY2FtZXJhIHJlbmRlcmVyKSlcblxuICAoZGVmbiByZW5kZXIgW11cbiAgICAobGV0IFtkZWx0YSAoY2xvY2suZ2V0RGVsdGEpXVxuICAgICAgKHJlcXVlc3RBbmltYXRpb25GcmFtZSByZW5kZXIpXG4gICAgICAoLnVwZGF0ZSBjb250cm9scyBkZWx0YSlcbiAgICAgIChyZW5kZXJlci5yZW5kZXIgc2NlbmUgY2FtZXJhKSkpXG5cbiAgKHJlbmRlcilcblxuICBuaWwpXG5cblxuKGRlZm4gcnVuIFtdXG4gIChtYWtlLWRlbW8gXCJkZW1vLXJhbmRvbVwiIHJhbmRvbS1ub2lzZSA3KVxuICAobWFrZS1kZW1vIFwiZGVtby1tcGQtMVwiIG1pZHBvaW50LWRpc3BsYWNlbWVudC1kMSAyKVxuICAobWFrZS1kZW1vIFwiZGVtby1tcGQtMlwiIG1pZHBvaW50LWRpc3BsYWNlbWVudC1kMiAyKVxuICAobWFrZS1kZW1vIFwiZGVtby1tcGQtM1wiIG1pZHBvaW50LWRpc3BsYWNlbWVudC1kMyAyKVxuICAobWFrZS1kZW1vIFwiZGVtby1tcGQtNFwiIG1pZHBvaW50LWRpc3BsYWNlbWVudCAzKVxuICAobWFrZS1maW5hbCBcImRlbW8tZmluYWxcIilcbiAgOyAobWFrZS1kZW1vIFwiZGVtby1taWRwb2ludFwiIG1pZHBvaW50LWRpc3BsYWNlbWVudClcbiAgOyAobWFrZS1kZW1vIFwiZGVtby1kaWFtb25kXCIgZGlhbW9uZC1zcXVhcmUpXG5cbiAgKVxuXG4oJCBydW4pXG5cblxuOyB2aW06IGx3Kz1kby10aW1lcyBsdys9ZG8tbmVzdGVkIDpcbiJdfQ==