UNPKG

matrix-react-sdk

Version:
148 lines (145 loc) 24.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.DefaultOptions = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2023 The Matrix.org Foundation C.I.C. Copyright 2020 Nurjin Jafar Copyright 2020 Nordeck IT + Consulting GmbH. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const DefaultOptions = exports.DefaultOptions = { maxCount: 150, speed: 3, frameInterval: 15, alpha: 1.0, gradient: false }; class Confetti { constructor(options) { (0, _defineProperty2.default)(this, "options", void 0); (0, _defineProperty2.default)(this, "context", null); (0, _defineProperty2.default)(this, "supportsAnimationFrame", window.requestAnimationFrame); (0, _defineProperty2.default)(this, "colors", ["rgba(30,144,255,", "rgba(107,142,35,", "rgba(255,215,0,", "rgba(255,192,203,", "rgba(106,90,205,", "rgba(173,216,230,", "rgba(238,130,238,", "rgba(152,251,152,", "rgba(70,130,180,", "rgba(244,164,96,", "rgba(210,105,30,", "rgba(220,20,60,"]); (0, _defineProperty2.default)(this, "lastFrameTime", Date.now()); (0, _defineProperty2.default)(this, "particles", []); (0, _defineProperty2.default)(this, "waveAngle", 0); (0, _defineProperty2.default)(this, "isRunning", false); (0, _defineProperty2.default)(this, "start", async (canvas, timeout = 3000) => { if (!canvas) { return; } this.context = canvas.getContext("2d"); this.particles = []; const count = this.options.maxCount; while (this.particles.length < count) { this.particles.push(this.resetParticle({}, canvas.width, canvas.height)); } this.isRunning = true; this.runAnimation(); if (timeout) { window.setTimeout(this.stop, timeout); } }); (0, _defineProperty2.default)(this, "stop", async () => { this.isRunning = false; }); (0, _defineProperty2.default)(this, "resetParticle", (particle, width, height) => { particle.color = this.colors[Math.random() * this.colors.length | 0] + (this.options.alpha + ")"); if (this.options.gradient) { particle.color2 = this.colors[Math.random() * this.colors.length | 0] + (this.options.alpha + ")"); } else { particle.color2 = particle.color; } particle.x = Math.random() * width; particle.y = Math.random() * -height; particle.diameter = Math.random() * 10 + 5; particle.tilt = Math.random() * -10; particle.tiltAngleIncrement = Math.random() * 0.07 + 0.05; particle.tiltAngle = Math.random() * Math.PI; return particle; }); (0, _defineProperty2.default)(this, "runAnimation", () => { if (!this.context || !this.context.canvas) { return; } if (this.particles.length === 0) { this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); } else { const now = Date.now(); const delta = now - this.lastFrameTime; if (!this.supportsAnimationFrame || delta > this.options.frameInterval) { this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); this.updateParticles(); this.drawParticles(this.context); this.lastFrameTime = now - delta % this.options.frameInterval; } requestAnimationFrame(this.runAnimation); } }); (0, _defineProperty2.default)(this, "drawParticles", context => { if (!this.context || !this.context.canvas) { return; } let x; let x2; let y2; for (const particle of this.particles) { this.context.beginPath(); context.lineWidth = particle.diameter; x2 = particle.x + particle.tilt; x = x2 + particle.diameter / 2; y2 = particle.y + particle.tilt + particle.diameter / 2; if (this.options.gradient) { const gradient = context.createLinearGradient(x, particle.y, x2, y2); gradient.addColorStop(0, particle.color); gradient.addColorStop(1.0, particle.color2); context.strokeStyle = gradient; } else { context.strokeStyle = particle.color; } context.moveTo(x, particle.y); context.lineTo(x2, y2); context.stroke(); } }); (0, _defineProperty2.default)(this, "updateParticles", () => { if (!this.context || !this.context.canvas) { return; } const width = this.context.canvas.width; const height = this.context.canvas.height; let particle; this.waveAngle += 0.01; for (let i = 0; i < this.particles.length; i++) { particle = this.particles[i]; if (!this.isRunning && particle.y < -15) { particle.y = height + 100; } else { particle.tiltAngle += particle.tiltAngleIncrement; particle.x += Math.sin(this.waveAngle) - 0.5; particle.y += (Math.cos(this.waveAngle) + particle.diameter + this.options.speed) * 0.5; particle.tilt = Math.sin(particle.tiltAngle) * 15; } if (particle.x > width + 20 || particle.x < -20 || particle.y > height) { if (this.isRunning && this.particles.length <= this.options.maxCount) { this.resetParticle(particle, width, height); } else { this.particles.splice(i, 1); i--; } } } }); this.options = _objectSpread(_objectSpread({}, DefaultOptions), options); } } exports.default = Confetti; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZWZhdWx0T3B0aW9ucyIsImV4cG9ydHMiLCJtYXhDb3VudCIsInNwZWVkIiwiZnJhbWVJbnRlcnZhbCIsImFscGhhIiwiZ3JhZGllbnQiLCJDb25mZXR0aSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0Iiwid2luZG93IiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiRGF0ZSIsIm5vdyIsImNhbnZhcyIsInRpbWVvdXQiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsInBhcnRpY2xlcyIsImNvdW50IiwibGVuZ3RoIiwicHVzaCIsInJlc2V0UGFydGljbGUiLCJ3aWR0aCIsImhlaWdodCIsImlzUnVubmluZyIsInJ1bkFuaW1hdGlvbiIsInNldFRpbWVvdXQiLCJzdG9wIiwicGFydGljbGUiLCJjb2xvciIsImNvbG9ycyIsIk1hdGgiLCJyYW5kb20iLCJjb2xvcjIiLCJ4IiwieSIsImRpYW1ldGVyIiwidGlsdCIsInRpbHRBbmdsZUluY3JlbWVudCIsInRpbHRBbmdsZSIsIlBJIiwiY2xlYXJSZWN0IiwiZGVsdGEiLCJsYXN0RnJhbWVUaW1lIiwic3VwcG9ydHNBbmltYXRpb25GcmFtZSIsInVwZGF0ZVBhcnRpY2xlcyIsImRyYXdQYXJ0aWNsZXMiLCJ4MiIsInkyIiwiYmVnaW5QYXRoIiwibGluZVdpZHRoIiwiY3JlYXRlTGluZWFyR3JhZGllbnQiLCJhZGRDb2xvclN0b3AiLCJzdHJva2VTdHlsZSIsIm1vdmVUbyIsImxpbmVUbyIsInN0cm9rZSIsIndhdmVBbmdsZSIsImkiLCJzaW4iLCJjb3MiLCJzcGxpY2UiLCJfb2JqZWN0U3ByZWFkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VmZmVjdHMvY29uZmV0dGkvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjMgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDIwIE51cmppbiBKYWZhclxuQ29weXJpZ2h0IDIwMjAgTm9yZGVjayBJVCArIENvbnN1bHRpbmcgR21iSC5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuICovXG5pbXBvcnQgSUNhbnZhc0VmZmVjdCBmcm9tIFwiLi4vSUNhbnZhc0VmZmVjdFwiO1xuXG5leHBvcnQgdHlwZSBDb25mZXR0aU9wdGlvbnMgPSB7XG4gICAgLyoqXG4gICAgICogbWF4IGNvbmZldHRpIGNvdW50XG4gICAgICovXG4gICAgbWF4Q291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBwYXJ0aWNsZSBhbmltYXRpb24gc3BlZWRcbiAgICAgKi9cbiAgICBzcGVlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIHRoZSBjb25mZXR0aSBhbmltYXRpb24gZnJhbWUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgZnJhbWVJbnRlcnZhbDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIHRoZSBhbHBoYSBvcGFjaXR5IG9mIHRoZSBjb25mZXR0aSAoYmV0d2VlbiAwIGFuZCAxLCB3aGVyZSAxIGlzIG9wYXF1ZSBhbmQgMCBpcyBpbnZpc2libGUpXG4gICAgICovXG4gICAgYWxwaGE6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiB1c2UgZ3JhZGllbnQgaW5zdGVhZCBvZiBzb2xpZCBwYXJ0aWNsZSBjb2xvclxuICAgICAqL1xuICAgIGdyYWRpZW50OiBib29sZWFuO1xufTtcblxudHlwZSBDb25mZXR0aVBhcnRpY2xlID0ge1xuICAgIGNvbG9yOiBzdHJpbmc7XG4gICAgY29sb3IyOiBzdHJpbmc7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICBkaWFtZXRlcjogbnVtYmVyO1xuICAgIHRpbHQ6IG51bWJlcjtcbiAgICB0aWx0QW5nbGVJbmNyZW1lbnQ6IG51bWJlcjtcbiAgICB0aWx0QW5nbGU6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0T3B0aW9uczogQ29uZmV0dGlPcHRpb25zID0ge1xuICAgIG1heENvdW50OiAxNTAsXG4gICAgc3BlZWQ6IDMsXG4gICAgZnJhbWVJbnRlcnZhbDogMTUsXG4gICAgYWxwaGE6IDEuMCxcbiAgICBncmFkaWVudDogZmFsc2UsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25mZXR0aSBpbXBsZW1lbnRzIElDYW52YXNFZmZlY3Qge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQ29uZmV0dGlPcHRpb25zO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0geyAuLi5EZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBzdXBwb3J0c0FuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgICBwcml2YXRlIGNvbG9ycyA9IFtcbiAgICAgICAgXCJyZ2JhKDMwLDE0NCwyNTUsXCIsXG4gICAgICAgIFwicmdiYSgxMDcsMTQyLDM1LFwiLFxuICAgICAgICBcInJnYmEoMjU1LDIxNSwwLFwiLFxuICAgICAgICBcInJnYmEoMjU1LDE5MiwyMDMsXCIsXG4gICAgICAgIFwicmdiYSgxMDYsOTAsMjA1LFwiLFxuICAgICAgICBcInJnYmEoMTczLDIxNiwyMzAsXCIsXG4gICAgICAgIFwicmdiYSgyMzgsMTMwLDIzOCxcIixcbiAgICAgICAgXCJyZ2JhKDE1MiwyNTEsMTUyLFwiLFxuICAgICAgICBcInJnYmEoNzAsMTMwLDE4MCxcIixcbiAgICAgICAgXCJyZ2JhKDI0NCwxNjQsOTYsXCIsXG4gICAgICAgIFwicmdiYSgyMTAsMTA1LDMwLFwiLFxuICAgICAgICBcInJnYmEoMjIwLDIwLDYwLFwiLFxuICAgIF07XG5cbiAgICBwcml2YXRlIGxhc3RGcmFtZVRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHByaXZhdGUgcGFydGljbGVzOiBBcnJheTxDb25mZXR0aVBhcnRpY2xlPiA9IFtdO1xuICAgIHByaXZhdGUgd2F2ZUFuZ2xlID0gMDtcblxuICAgIHB1YmxpYyBpc1J1bm5pbmcgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBzdGFydCA9IGFzeW5jIChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCB0aW1lb3V0ID0gMzAwMCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBpZiAoIWNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgIHRoaXMucGFydGljbGVzID0gW107XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5vcHRpb25zLm1heENvdW50O1xuICAgICAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFydGljbGVzLnB1c2godGhpcy5yZXNldFBhcnRpY2xlKHt9IGFzIENvbmZldHRpUGFydGljbGUsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ydW5BbmltYXRpb24oKTtcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc3RvcCwgdGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHN0b3AgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVzZXRQYXJ0aWNsZSA9IChwYXJ0aWNsZTogQ29uZmV0dGlQYXJ0aWNsZSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBDb25mZXR0aVBhcnRpY2xlID0+IHtcbiAgICAgICAgcGFydGljbGUuY29sb3IgPSB0aGlzLmNvbG9yc1soTWF0aC5yYW5kb20oKSAqIHRoaXMuY29sb3JzLmxlbmd0aCkgfCAwXSArICh0aGlzLm9wdGlvbnMuYWxwaGEgKyBcIilcIik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JhZGllbnQpIHtcbiAgICAgICAgICAgIHBhcnRpY2xlLmNvbG9yMiA9IHRoaXMuY29sb3JzWyhNYXRoLnJhbmRvbSgpICogdGhpcy5jb2xvcnMubGVuZ3RoKSB8IDBdICsgKHRoaXMub3B0aW9ucy5hbHBoYSArIFwiKVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnRpY2xlLmNvbG9yMiA9IHBhcnRpY2xlLmNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRpY2xlLnggPSBNYXRoLnJhbmRvbSgpICogd2lkdGg7XG4gICAgICAgIHBhcnRpY2xlLnkgPSBNYXRoLnJhbmRvbSgpICogLWhlaWdodDtcbiAgICAgICAgcGFydGljbGUuZGlhbWV0ZXIgPSBNYXRoLnJhbmRvbSgpICogMTAgKyA1O1xuICAgICAgICBwYXJ0aWNsZS50aWx0ID0gTWF0aC5yYW5kb20oKSAqIC0xMDtcbiAgICAgICAgcGFydGljbGUudGlsdEFuZ2xlSW5jcmVtZW50ID0gTWF0aC5yYW5kb20oKSAqIDAuMDcgKyAwLjA1O1xuICAgICAgICBwYXJ0aWNsZS50aWx0QW5nbGUgPSBNYXRoLnJhbmRvbSgpICogTWF0aC5QSTtcbiAgICAgICAgcmV0dXJuIHBhcnRpY2xlO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHJ1bkFuaW1hdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQgfHwgIXRoaXMuY29udGV4dC5jYW52YXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMuY29udGV4dC5jYW52YXMud2lkdGgsIHRoaXMuY29udGV4dC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IG5vdyAtIHRoaXMubGFzdEZyYW1lVGltZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdXBwb3J0c0FuaW1hdGlvbkZyYW1lIHx8IGRlbHRhID4gdGhpcy5vcHRpb25zLmZyYW1lSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMuY29udGV4dC5jYW52YXMud2lkdGgsIHRoaXMuY29udGV4dC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBhcnRpY2xlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1BhcnRpY2xlcyh0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdEZyYW1lVGltZSA9IG5vdyAtIChkZWx0YSAlIHRoaXMub3B0aW9ucy5mcmFtZUludGVydmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJ1bkFuaW1hdGlvbik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBkcmF3UGFydGljbGVzID0gKGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dCB8fCAhdGhpcy5jb250ZXh0LmNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB4O1xuICAgICAgICBsZXQgeDI7XG4gICAgICAgIGxldCB5MjtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0aWNsZSBvZiB0aGlzLnBhcnRpY2xlcykge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSBwYXJ0aWNsZS5kaWFtZXRlcjtcbiAgICAgICAgICAgIHgyID0gcGFydGljbGUueCArIHBhcnRpY2xlLnRpbHQ7XG4gICAgICAgICAgICB4ID0geDIgKyBwYXJ0aWNsZS5kaWFtZXRlciAvIDI7XG4gICAgICAgICAgICB5MiA9IHBhcnRpY2xlLnkgKyBwYXJ0aWNsZS50aWx0ICsgcGFydGljbGUuZGlhbWV0ZXIgLyAyO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncmFkaWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyYWRpZW50ID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudCh4LCBwYXJ0aWNsZS55LCB4MiwgeTIpO1xuICAgICAgICAgICAgICAgIGdyYWRpZW50LmFkZENvbG9yU3RvcCgwLCBwYXJ0aWNsZS5jb2xvcik7XG4gICAgICAgICAgICAgICAgZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDEuMCwgcGFydGljbGUuY29sb3IyKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gZ3JhZGllbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBwYXJ0aWNsZS5jb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRleHQubW92ZVRvKHgsIHBhcnRpY2xlLnkpO1xuICAgICAgICAgICAgY29udGV4dC5saW5lVG8oeDIsIHkyKTtcbiAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB1cGRhdGVQYXJ0aWNsZXMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0IHx8ICF0aGlzLmNvbnRleHQuY2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmNvbnRleHQuY2FudmFzLndpZHRoO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmNvbnRleHQuY2FudmFzLmhlaWdodDtcbiAgICAgICAgbGV0IHBhcnRpY2xlOiBDb25mZXR0aVBhcnRpY2xlO1xuICAgICAgICB0aGlzLndhdmVBbmdsZSArPSAwLjAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFydGljbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYXJ0aWNsZSA9IHRoaXMucGFydGljbGVzW2ldO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzUnVubmluZyAmJiBwYXJ0aWNsZS55IDwgLTE1KSB7XG4gICAgICAgICAgICAgICAgcGFydGljbGUueSA9IGhlaWdodCArIDEwMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFydGljbGUudGlsdEFuZ2xlICs9IHBhcnRpY2xlLnRpbHRBbmdsZUluY3JlbWVudDtcbiAgICAgICAgICAgICAgICBwYXJ0aWNsZS54ICs9IE1hdGguc2luKHRoaXMud2F2ZUFuZ2xlKSAtIDAuNTtcbiAgICAgICAgICAgICAgICBwYXJ0aWNsZS55ICs9IChNYXRoLmNvcyh0aGlzLndhdmVBbmdsZSkgKyBwYXJ0aWNsZS5kaWFtZXRlciArIHRoaXMub3B0aW9ucy5zcGVlZCkgKiAwLjU7XG4gICAgICAgICAgICAgICAgcGFydGljbGUudGlsdCA9IE1hdGguc2luKHBhcnRpY2xlLnRpbHRBbmdsZSkgKiAxNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJ0aWNsZS54ID4gd2lkdGggKyAyMCB8fCBwYXJ0aWNsZS54IDwgLTIwIHx8IHBhcnRpY2xlLnkgPiBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1J1bm5pbmcgJiYgdGhpcy5wYXJ0aWNsZXMubGVuZ3RoIDw9IHRoaXMub3B0aW9ucy5tYXhDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0UGFydGljbGUocGFydGljbGUsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFydGljbGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBcUNPLE1BQU1BLGNBQStCLEdBQUFDLE9BQUEsQ0FBQUQsY0FBQSxHQUFHO0VBQzNDRSxRQUFRLEVBQUUsR0FBRztFQUNiQyxLQUFLLEVBQUUsQ0FBQztFQUNSQyxhQUFhLEVBQUUsRUFBRTtFQUNqQkMsS0FBSyxFQUFFLEdBQUc7RUFDVkMsUUFBUSxFQUFFO0FBQ2QsQ0FBQztBQUVjLE1BQU1DLFFBQVEsQ0FBMEI7RUFHNUNDLFdBQVdBLENBQUNDLE9BQStCLEVBQUU7SUFBQSxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQSxtQkFJRCxJQUFJO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQSxrQ0FDdEJDLE1BQU0sQ0FBQ0MscUJBQXFCO0lBQUEsSUFBQUgsZ0JBQUEsQ0FBQUMsT0FBQSxrQkFDNUMsQ0FDYixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLG1CQUFtQixF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