UNPKG

20 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var index_1 = require("../index");
4var concat_1 = require("./concat");
5function interpolate(y, from, to) {
6 return (from * (1 - y) + to * y);
7}
8function flip(fn) {
9 return function (x) { return 1 - fn(1 - x); };
10}
11function createEasing(fn) {
12 var fnFlipped = flip(fn);
13 return {
14 easeIn: function (x, from, to) {
15 return interpolate(fn(x), from, to);
16 },
17 easeOut: function (x, from, to) {
18 return interpolate(fnFlipped(x), from, to);
19 },
20 easeInOut: function (x, from, to) {
21 var y = (x < 0.5) ?
22 (fn(2 * x) * 0.5) :
23 (0.5 + fnFlipped(2 * (x - 0.5)) * 0.5);
24 return interpolate(y, from, to);
25 }
26 };
27}
28var easingPower2 = createEasing(function (x) { return x * x; });
29var easingPower3 = createEasing(function (x) { return x * x * x; });
30var easingPower4 = createEasing(function (x) {
31 var xx = x * x;
32 return xx * xx;
33});
34var EXP_WEIGHT = 6;
35var EXP_MAX = Math.exp(EXP_WEIGHT) - 1;
36function expFn(x) {
37 return (Math.exp(x * EXP_WEIGHT) - 1) / EXP_MAX;
38}
39var easingExponential = createEasing(expFn);
40var OVERSHOOT = 1.70158;
41var easingBack = createEasing(function (x) { return x * x * ((OVERSHOOT + 1) * x - OVERSHOOT); });
42var PARAM1 = 7.5625;
43var PARAM2 = 2.75;
44function easeOutFn(x) {
45 var z = x;
46 if (z < 1 / PARAM2) {
47 return (PARAM1 * z * z);
48 }
49 else if (z < 2 / PARAM2) {
50 return (PARAM1 * (z -= 1.5 / PARAM2) * z + 0.75);
51 }
52 else if (z < 2.5 / PARAM2) {
53 return (PARAM1 * (z -= 2.25 / PARAM2) * z + 0.9375);
54 }
55 else {
56 return (PARAM1 * (z -= 2.625 / PARAM2) * z + 0.984375);
57 }
58}
59var easingBounce = createEasing(function (x) { return 1 - easeOutFn(1 - x); });
60var easingCirc = createEasing(function (x) { return -(Math.sqrt(1 - x * x) - 1); });
61var PERIOD = 0.3;
62var OVERSHOOT_ELASTIC = PERIOD / 4;
63var AMPLITUDE = 1;
64function elasticIn(x) {
65 var z = x;
66 if (z <= 0) {
67 return 0;
68 }
69 else if (z >= 1) {
70 return 1;
71 }
72 else {
73 z -= 1;
74 return -(AMPLITUDE * Math.pow(2, 10 * z))
75 * Math.sin((z - OVERSHOOT_ELASTIC) * (2 * Math.PI) / PERIOD);
76 }
77}
78var easingElastic = createEasing(elasticIn);
79var HALF_PI = Math.PI * 0.5;
80var easingSine = createEasing(function (x) { return 1 - Math.cos(x * HALF_PI); });
81var DEFAULT_INTERVAL = 15;
82/**
83 * Creates a stream of numbers emitted in a quick burst, following a numeric
84 * function like sine or elastic or quadratic. tween() is meant for creating
85 * streams for animations.
86 *
87 * Example:
88 *
89 * ```js
90 * import tween from 'xstream/extra/tween'
91 *
92 * const stream = tween({
93 * from: 20,
94 * to: 100,
95 * ease: tween.exponential.easeIn,
96 * duration: 1000, // milliseconds
97 * })
98 *
99 * stream.addListener({
100 * next: (x) => console.log(x),
101 * error: (err) => console.error(err),
102 * complete: () => console.log('concat completed'),
103 * })
104 * ```
105 *
106 * The stream would behave like the plot below:
107 *
108 * ```text
109 * 100 #
110 * |
111 * |
112 * |
113 * |
114 * 80 #
115 * |
116 * |
117 * |
118 * | #
119 * 60
120 * |
121 * | #
122 * |
123 * | #
124 * 40
125 * | #
126 * | #
127 * | ##
128 * | ###
129 * 20########
130 * +---------------------> time
131 * ```
132 *
133 * Provide a configuration object with **from**, **to**, **duration**, **ease**,
134 * **interval** (optional), and this factory function will return a stream of
135 * numbers following that pattern. The first number emitted will be `from`, and
136 * the last number will be `to`. The numbers in between follow the easing
137 * function you specify in `ease`, and the stream emission will last in total
138 * `duration` milliseconds.
139 *
140 * The easing functions are attached to `tween` too, such as
141 * `tween.linear.ease`, `tween.power2.easeIn`, `tween.exponential.easeOut`, etc.
142 * Here is a list of all the available easing options:
143 *
144 * - `tween.linear` with ease
145 * - `tween.power2` with easeIn, easeOut, easeInOut
146 * - `tween.power3` with easeIn, easeOut, easeInOut
147 * - `tween.power4` with easeIn, easeOut, easeInOut
148 * - `tween.exponential` with easeIn, easeOut, easeInOut
149 * - `tween.back` with easeIn, easeOut, easeInOut
150 * - `tween.bounce` with easeIn, easeOut, easeInOut
151 * - `tween.circular` with easeIn, easeOut, easeInOut
152 * - `tween.elastic` with easeIn, easeOut, easeInOut
153 * - `tween.sine` with easeIn, easeOut, easeInOut
154 *
155 * @factory true
156 * @param {TweenConfig} config An object with properties `from: number`,
157 * `to: number`, `duration: number`, `ease: function` (optional, defaults to
158 * linear), `interval: number` (optional, defaults to 15).
159 * @return {Stream}
160 */
161function tween(_a) {
162 var from = _a.from, to = _a.to, duration = _a.duration, _b = _a.ease, ease = _b === void 0 ? tweenFactory.linear.ease : _b, _c = _a.interval, interval = _c === void 0 ? DEFAULT_INTERVAL : _c;
163 var totalTicks = Math.round(duration / interval);
164 return index_1.Stream.periodic(interval)
165 .take(totalTicks)
166 .map(function (tick) { return ease(tick / totalTicks, from, to); })
167 .compose(function (s) { return concat_1.default(s, index_1.Stream.of(to)); });
168}
169var tweenFactory = tween;
170tweenFactory.linear = { ease: interpolate };
171tweenFactory.power2 = easingPower2;
172tweenFactory.power3 = easingPower3;
173tweenFactory.power4 = easingPower4;
174tweenFactory.exponential = easingExponential;
175tweenFactory.back = easingBack;
176tweenFactory.bounce = easingBounce;
177tweenFactory.circular = easingCirc;
178tweenFactory.elastic = easingElastic;
179tweenFactory.sine = easingSine;
180exports.default = tweenFactory;
181//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdlZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXh0cmEvdHdlZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQ0FBZ0M7QUFDaEMsbUNBQThCO0FBbUI5QixTQUFTLFdBQVcsQ0FBQyxDQUFTLEVBQUUsSUFBWSxFQUFFLEVBQVU7SUFDdEQsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQVMsSUFBSSxDQUFDLEVBQW1CO0lBQy9CLE9BQU8sVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBYixDQUFhLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEVBQW1CO0lBQ3ZDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixPQUFPO1FBQ0wsTUFBTSxZQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNoQixPQUFPLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxPQUFPLFlBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ2pCLE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELFNBQVMsWUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDbkIsSUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLENBQUMsR0FB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aW1wb3J0IGNvbmNhdCBmcm9tICcuL2NvbmNhdCc7XG5cbmV4cG9ydCB0eXBlIEVhc2UgPSAoeDogbnVtYmVyLCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IG51bWJlcjtcbmV4cG9ydCB0eXBlIEVhc2luZ3MgPSB7XG4gIGVhc2VJbjogRWFzZTtcbiAgZWFzZU91dDogRWFzZTtcbiAgZWFzZUluT3V0OiBFYXNlO1xufTtcblxuZXhwb3J0IHR5cGUgTnVtZXJpY0Z1bmN0aW9uID0gKGlucHV0OiBudW1iZXIpID0+IG51bWJlcjtcblxuZXhwb3J0IGludGVyZmFjZSBUd2VlbkNvbmZpZyB7XG4gIGZyb206IG51bWJlcjtcbiAgdG86IG51bWJlcjtcbiAgZHVyYXRpb246IG51bWJlcjtcbiAgZWFzZT86IEVhc2U7XG4gIGludGVydmFsPzogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZSh5OiBudW1iZXIsIGZyb206IG51bWJlciwgdG86IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiAoZnJvbSAqICgxIC0geSkgKyB0byAqIHkpO1xufVxuXG5mdW5jdGlvbiBmbGlwKGZuOiBOdW1lcmljRnVuY3Rpb24pOiBOdW1lcmljRnVuY3Rpb24ge1xuICByZXR1cm4geCA9PiAxIC0gZm4oMSAtIHgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFYXNpbmcoZm46IE51bWVyaWNGdW5jdGlvbik6IEVhc2luZ3Mge1xuICBsZXQgZm5GbGlwcGVkID0gZmxpcChmbik7XG4gIHJldHVybiB7XG4gICAgZWFzZUluKHgsIGZyb20sIHRvKSB7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoZm4oeCksIGZyb20sIHRvKTtcbiAgICB9LFxuICAgIGVhc2VPdXQoeCwgZnJvbSwgdG8pIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShmbkZsaXBwZWQoeCksIGZyb20sIHRvKTtcbiAgICB9LFxuICAgIGVhc2VJbk91dCh4LCBmcm9tLCB0bykge1xuICAgICAgY29uc3QgeSA9ICh4IDwgMC41KSA/XG4gICAgICAgIChmbigyICogeCkgKiAwLjUpIDpcbiAgICAgICAgKDAuNSArIGZuRmxpcHBlZCgyICogKHggLSAwLjUpKSAqIDAuNSk7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoeSwgZnJvbSwgdG8pO1xuICAgIH1cbiAgfTtcbn1cblxubGV0IGVhc2luZ1Bvd2VyMiA9IGNyZWF0ZUVhc2luZyh4ID0+IHggKiB4KTtcbmxldCBlYXNpbmdQb3dlcjMgPSBjcmVhdGVFYXNpbmcoeCA9PiB4ICogeCAqIHgpO1xubGV0IGVhc2luZ1Bvd2VyNCA9IGNyZWF0ZUVhc2luZyh4ID0+IHtcbiAgY29uc3QgeHggPSB4ICogeDtcbiAgcmV0dXJuIHh4ICogeHg7XG59KTtcblxuY29uc3QgRVhQX1dFSUdIVCA9IDY7XG5jb25zdCBFWFBfTUFYID0gTWF0aC5leHAoRVhQX1dFSUdIVCkgLSAxO1xuZnVuY3Rpb24gZXhwRm4oeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChNYXRoLmV4cCh4ICogRVhQX1dFSUdIVCkgLSAxKSAvIEVYUF9NQVg7XG59XG5sZXQgZWFzaW5nRXhwb25lbnRpYWwgPSBjcmVhdGVFYXNpbmcoZXhwRm4pO1xuXG5jb25zdCBPVkVSU0hPT1QgPSAxLjcwMTU4O1xubGV0IGVhc2luZ0JhY2sgPSBjcmVhdGVFYXNpbmcoeCA9PiB4ICogeCAqICgoT1ZFUlNIT09UICsgMSkgKiB4IC0gT1ZFUlNIT09UKSk7XG5cbmNvbnN0IFBBUkFNMSA9IDcuNTYyNTtcbmNvbnN0IFBBUkFNMiA9IDIuNzU7XG5mdW5jdGlvbiBlYXNlT3V0Rm4oeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IHogPSB4O1xuICBpZiAoeiA8IDEgLyBQQVJBTTIpIHtcbiAgICByZXR1cm4gKFBBUkFNMSAqIHogKiB6KTtcbiAgfSBlbHNlIGlmICh6IDwgMiAvIFBBUkFNMikge1xuICAgIHJldHVybiAoUEFSQU0xICogKHogLT0gMS41IC8gUEFSQU0yKSAqIHogKyAwLjc1KTtcbiAgfSBlbHNlIGlmICh6IDwgMi41IC8gUEFSQU0yKSB7XG4gICAgcmV0dXJuIChQQVJBTTEgKiAoeiAtPSAyLjI1IC8gUEFSQU0yKSAqIHogKyAwLjkzNzUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoUEFSQU0xICogKHogLT0gMi42MjUgLyBQQVJBTTIpICogeiArIDAuOTg0Mzc1KTtcbiAgfVxufVxubGV0IGVhc2luZ0JvdW5jZSA9IGNyZWF0ZUVhc2luZyh4ID0+IDEgLSBlYXNlT3V0Rm4oMSAtIHgpKTtcblxubGV0IGVhc2luZ0NpcmMgPSBjcmVhdGVFYXNpbmcoeCA9PiAtKE1hdGguc3FydCgxIC0geCAqIHgpIC0gMSkpO1xuXG5jb25zdCBQRVJJT0QgPSAwLjM7XG5jb25zdCBPVkVSU0hPT1RfRUxBU1RJQyA9IFBFUklPRCAvIDQ7XG5jb25zdCBBTVBMSVRVREUgPSAxO1xuZnVuY3Rpb24gZWxhc3RpY0luKHg6IG51bWJlcik6IG51bWJlciB7XG4gIGxldCB6ID0geDtcbiAgaWYgKHogPD0gMCkge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2UgaWYgKHogPj0gMSkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHogLT0gMTtcbiAgICByZXR1cm4gLShBTVBMSVRVREUgKiBNYXRoLnBvdygyLCAxMCAqIHopKVxuICAgICAgKiBNYXRoLnNpbigoeiAtIE9WRVJTSE9PVF9FTEFTVElDKSAqICgyICogTWF0aC5QSSkgLyBQRVJJT0QpO1xuICB9XG59XG5sZXQgZWFzaW5nRWxhc3RpYyA9IGNyZWF0ZUVhc2luZyhlbGFzdGljSW4pO1xuXG5jb25zdCBIQUxGX1BJID0gTWF0aC5QSSAqIDAuNTtcbmxldCBlYXNpbmdTaW5lID0gY3JlYXRlRWFzaW5nKHggPT4gMSAtIE1hdGguY29zKHggKiBIQUxGX1BJKSk7XG5cbmNvbnN0IERFRkFVTFRfSU5URVJWQUw6IG51bWJlciA9IDE1O1xuXG5leHBvcnQgaW50ZXJmYWNlIFR3ZWVuRmFjdG9yeSB7XG4gIChjb25maWc6IFR3ZWVuQ29uZmlnKTogU3RyZWFtPG51bWJlcj47XG4gIGxpbmVhcjogeyBlYXNlOiBFYXNlIH07XG4gIHBvd2VyMjogRWFzaW5ncztcbiAgcG93ZXIzOiBFYXNpbmdzO1xuICBwb3dlcjQ6IEVhc2luZ3M7XG4gIGV4cG9uZW50aWFsOiBFYXNpbmdzO1xuICBiYWNrOiBFYXNpbmdzO1xuICBib3VuY2U6IEVhc2luZ3M7XG4gIGNpcmN1bGFyOiBFYXNpbmdzO1xuICBlbGFzdGljOiBFYXNpbmdzO1xuICBzaW5lOiBFYXNpbmdzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdHJlYW0gb2YgbnVtYmVycyBlbWl0dGVkIGluIGEgcXVpY2sgYnVyc3QsIGZvbGxvd2luZyBhIG51bWVyaWNcbiAqIGZ1bmN0aW9uIGxpa2Ugc2luZSBvciBlbGFzdGljIG9yIHF1YWRyYXRpYy4gdHdlZW4oKSBpcyBtZWFudCBmb3IgY3JlYXRpbmdcbiAqIHN0cmVhbXMgZm9yIGFuaW1hdGlvbnMuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHR3ZWVuIGZyb20gJ3hzdHJlYW0vZXh0cmEvdHdlZW4nXG4gKlxuICogY29uc3Qgc3RyZWFtID0gdHdlZW4oe1xuICogICBmcm9tOiAyMCxcbiAqICAgdG86IDEwMCxcbiAqICAgZWFzZTogdHdlZW4uZXhwb25lbnRpYWwuZWFzZUluLFxuICogICBkdXJhdGlvbjogMTAwMCwgLy8gbWlsbGlzZWNvbmRzXG4gKiB9KVxuICpcbiAqIHN0cmVhbS5hZGRMaXN0ZW5lcih7XG4gKiAgIG5leHQ6ICh4KSA9PiBjb25zb2xlLmxvZyh4KSxcbiAqICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoZXJyKSxcbiAqICAgY29tcGxldGU6ICgpID0+IGNvbnNvbGUubG9nKCdjb25jYXQgY29tcGxldGVkJyksXG4gKiB9KVxuICogYGBgXG4gKlxuICogVGhlIHN0cmVhbSB3b3VsZCBiZWhhdmUgbGlrZSB0aGUgcGxvdCBiZWxvdzpcbiAqXG4gKiBgYGB0ZXh0XG4gKiAxMDAgICAgICAgICAgICAgICAgICAjXG4gKiB8XG4gKiB8XG4gKiB8XG4gKiB8XG4gKiA4MCAgICAgICAgICAgICAgICAgICNcbiAqIHxcbiAqIHxcbiAqIHxcbiAqIHwgICAgICAgICAgICAgICAgICAjXG4gKiA2MFxuICogfFxuICogfCAgICAgICAgICAgICAgICAgI1xuICogfFxuICogfCAgICAgICAgICAgICAgICAjXG4gKiA0MFxuICogfCAgICAgICAgICAgICAgICNcbiAqIHwgICAgICAgICAgICAgICNcbiAqIHwgICAgICAgICAgICAjI1xuICogfCAgICAgICAgICMjI1xuICogMjAjIyMjIyMjI1xuICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gdGltZVxuICogYGBgXG4gKlxuICogUHJvdmlkZSBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggKipmcm9tKiosICoqdG8qKiwgKipkdXJhdGlvbioqLCAqKmVhc2UqKixcbiAqICoqaW50ZXJ2YWwqKiAob3B0aW9uYWwpLCBhbmQgdGhpcyBmYWN0b3J5IGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgc3RyZWFtIG9mXG4gKiBudW1iZXJzIGZvbGxvd2luZyB0aGF0IHBhdHRlcm4uIFRoZSBmaXJzdCBudW1iZXIgZW1pdHRlZCB3aWxsIGJlIGBmcm9tYCwgYW5kXG4gKiB0aGUgbGFzdCBudW1iZXIgd2lsbCBiZSBgdG9gLiBUaGUgbnVtYmVycyBpbiBiZXR3ZWVuIGZvbGxvdyB0aGUgZWFzaW5nXG4gKiBmdW5jdGlvbiB5b3Ugc3BlY2lmeSBpbiBgZWFzZWAsIGFuZCB0aGUgc3RyZWFtIGVtaXNzaW9uIHdpbGwgbGFzdCBpbiB0b3RhbFxuICogYGR1cmF0aW9uYCBtaWxsaXNlY29uZHMuXG4gKlxuICogVGhlIGVhc2luZyBmdW5jdGlvbnMgYXJlIGF0dGFjaGVkIHRvIGB0d2VlbmAgdG9vLCBzdWNoIGFzXG4gKiBgdHdlZW4ubGluZWFyLmVhc2VgLCBgdHdlZW4ucG93ZXIyLmVhc2VJbmAsIGB0d2Vlbi5leHBvbmVudGlhbC5lYXNlT3V0YCwgZXRjLlxuICogSGVyZSBpcyBhIGxpc3Qgb2YgYWxsIHRoZSBhdmFpbGFibGUgZWFzaW5nIG9wdGlvbnM6XG4gKlxuICogLSBgdHdlZW4ubGluZWFyYCB3aXRoIGVhc2VcbiAqIC0gYHR3ZWVuLnBvd2VyMmAgd2l0aCBlYXNlSW4sIGVhc2VPdXQsIGVhc2VJbk91dFxuICogLSBgdHdlZW4ucG93ZXIzYCB3aXRoIGVhc2VJbiwgZWFzZU91dCwgZWFzZUluT3V0XG4gKiAtIGB0d2Vlbi5wb3dlcjRgIHdpdGggZWFzZUluLCBlYXNlT3V0LCBlYXNlSW5PdXRcbiAqIC0gYHR3ZWVuLmV4cG9uZW50aWFsYCB3aXRoIGVhc2VJbiwgZWFzZU91dCwgZWFzZUluT3V0XG4gKiAtIGB0d2Vlbi5iYWNrYCB3aXRoIGVhc2VJbiwgZWFzZU91dCwgZWFzZUluT3V0XG4gKiAtIGB0d2Vlbi5ib3VuY2VgIHdpdGggZWFzZUluLCBlYXNlT3V0LCBlYXNlSW5PdXRcbiAqIC0gYHR3ZWVuLmNpcmN1bGFyYCB3aXRoIGVhc2VJbiwgZWFzZU91dCwgZWFzZUluT3V0XG4gKiAtIGB0d2Vlbi5lbGFzdGljYCB3aXRoIGVhc2VJbiwgZWFzZU91dCwgZWFzZUluT3V0XG4gKiAtIGB0d2Vlbi5zaW5lYCB3aXRoIGVhc2VJbiwgZWFzZU91dCwgZWFzZUluT3V0XG4gKlxuICogQGZhY3RvcnkgdHJ1ZVxuICogQHBhcmFtIHtUd2VlbkNvbmZpZ30gY29uZmlnIEFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgYGZyb206IG51bWJlcmAsXG4gKiBgdG86IG51bWJlcmAsIGBkdXJhdGlvbjogbnVtYmVyYCwgYGVhc2U6IGZ1bmN0aW9uYCAob3B0aW9uYWwsIGRlZmF1bHRzIHRvXG4gKiBsaW5lYXIpLCBgaW50ZXJ2YWw6IG51bWJlcmAgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byAxNSkuXG4gKiBAcmV0dXJuIHtTdHJlYW19XG4gKi9cbmZ1bmN0aW9uIHR3ZWVuKHtcbiAgZnJvbSxcbiAgdG8sXG4gIGR1cmF0aW9uLFxuICBlYXNlID0gdHdlZW5GYWN0b3J5LmxpbmVhci5lYXNlLFxuICBpbnRlcnZhbCA9IERFRkFVTFRfSU5URVJWQUxcbn06IFR3ZWVuQ29uZmlnKTogU3RyZWFtPG51bWJlcj4ge1xuICBjb25zdCB0b3RhbFRpY2tzID0gTWF0aC5yb3VuZChkdXJhdGlvbiAvIGludGVydmFsKTtcbiAgcmV0dXJuIFN0cmVhbS5wZXJpb2RpYyhpbnRlcnZhbClcbiAgICAudGFrZSh0b3RhbFRpY2tzKVxuICAgIC5tYXAodGljayA9PiBlYXNlKHRpY2sgLyB0b3RhbFRpY2tzLCBmcm9tLCB0bykpXG4gICAgLmNvbXBvc2UocyA9PiBjb25jYXQ8bnVtYmVyPihzLCBTdHJlYW0ub2YodG8pKSk7XG59XG5cbmNvbnN0IHR3ZWVuRmFjdG9yeTogVHdlZW5GYWN0b3J5ID0gPFR3ZWVuRmFjdG9yeT4gdHdlZW47XG5cbnR3ZWVuRmFjdG9yeS5saW5lYXIgPSB7IGVhc2U6IGludGVycG9sYXRlIH07XG50d2VlbkZhY3RvcnkucG93ZXIyID0gZWFzaW5nUG93ZXIyO1xudHdlZW5GYWN0b3J5LnBvd2VyMyA9IGVhc2luZ1Bvd2VyMztcbnR3ZWVuRmFjdG9yeS5wb3dlcjQgPSBlYXNpbmdQb3dlcjQ7XG50d2VlbkZhY3RvcnkuZXhwb25lbnRpYWwgPSBlYXNpbmdFeHBvbmVudGlhbDtcbnR3ZWVuRmFjdG9yeS5iYWNrID0gZWFzaW5nQmFjaztcbnR3ZWVuRmFjdG9yeS5ib3VuY2UgPSBlYXNpbmdCb3VuY2U7XG50d2VlbkZhY3RvcnkuY2lyY3VsYXIgPSBlYXNpbmdDaXJjO1xudHdlZW5GYWN0b3J5LmVsYXN0aWMgPSBlYXNpbmdFbGFzdGljO1xudHdlZW5GYWN0b3J5LnNpbmUgPSBlYXNpbmdTaW5lO1xuXG5leHBvcnQgZGVmYXVsdCB0d2VlbkZhY3Rvcnk7XG4iXX0=
\No newline at end of file