1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var index_1 = require("../index");
|
4 | var concat_1 = require("./concat");
|
5 | function interpolate(y, from, to) {
|
6 | return (from * (1 - y) + to * y);
|
7 | }
|
8 | function flip(fn) {
|
9 | return function (x) { return 1 - fn(1 - x); };
|
10 | }
|
11 | function 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 | }
|
28 | var easingPower2 = createEasing(function (x) { return x * x; });
|
29 | var easingPower3 = createEasing(function (x) { return x * x * x; });
|
30 | var easingPower4 = createEasing(function (x) {
|
31 | var xx = x * x;
|
32 | return xx * xx;
|
33 | });
|
34 | var EXP_WEIGHT = 6;
|
35 | var EXP_MAX = Math.exp(EXP_WEIGHT) - 1;
|
36 | function expFn(x) {
|
37 | return (Math.exp(x * EXP_WEIGHT) - 1) / EXP_MAX;
|
38 | }
|
39 | var easingExponential = createEasing(expFn);
|
40 | var OVERSHOOT = 1.70158;
|
41 | var easingBack = createEasing(function (x) { return x * x * ((OVERSHOOT + 1) * x - OVERSHOOT); });
|
42 | var PARAM1 = 7.5625;
|
43 | var PARAM2 = 2.75;
|
44 | function 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 | }
|
59 | var easingBounce = createEasing(function (x) { return 1 - easeOutFn(1 - x); });
|
60 | var easingCirc = createEasing(function (x) { return -(Math.sqrt(1 - x * x) - 1); });
|
61 | var PERIOD = 0.3;
|
62 | var OVERSHOOT_ELASTIC = PERIOD / 4;
|
63 | var AMPLITUDE = 1;
|
64 | function 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 | }
|
78 | var easingElastic = createEasing(elasticIn);
|
79 | var HALF_PI = Math.PI * 0.5;
|
80 | var easingSine = createEasing(function (x) { return 1 - Math.cos(x * HALF_PI); });
|
81 | var 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 | */
|
161 | function 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 | }
|
169 | var tweenFactory = tween;
|
170 | tweenFactory.linear = { ease: interpolate };
|
171 | tweenFactory.power2 = easingPower2;
|
172 | tweenFactory.power3 = easingPower3;
|
173 | tweenFactory.power4 = easingPower4;
|
174 | tweenFactory.exponential = easingExponential;
|
175 | tweenFactory.back = easingBack;
|
176 | tweenFactory.bounce = easingBounce;
|
177 | tweenFactory.circular = easingCirc;
|
178 | tweenFactory.elastic = easingElastic;
|
179 | tweenFactory.sine = easingSine;
|
180 | exports.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 |