@vizor-vr/vue 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,494 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2016 Google Inc. All Rights Reserved.
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ (function() {
17
+ const s = {};
18
+ s.log = function() {
19
+ const A = `[Omnitone] ${Array.prototype.slice.call(arguments).join(" ")} (${performance.now().toFixed(2)}ms)`;
20
+ window.console.log(A);
21
+ }, s.throw = function() {
22
+ const A = `[Omnitone] ${Array.prototype.slice.call(arguments).join(" ")} (${performance.now().toFixed(2)}ms)`;
23
+ throw new Error(A);
24
+ };
25
+ let v, P, B, l, u, Q, _, C, d, E, p, M, I, m, b, x, H, F, R, G, z, L, U, Y, X, N, T, j, o;
26
+ s.invertMatrix4 = function(A, t) {
27
+ return v = t[0], P = t[1], B = t[2], l = t[3], u = t[4], Q = t[5], _ = t[6], C = t[7], d = t[8], E = t[9], p = t[10], M = t[11], I = t[12], m = t[13], b = t[14], x = t[15], H = v * Q - P * u, F = v * _ - B * u, R = v * C - l * u, G = P * _ - B * Q, z = P * C - l * Q, L = B * C - l * _, U = d * m - E * I, Y = d * b - p * I, X = d * x - M * I, N = E * b - p * m, T = E * x - M * m, j = p * x - M * b, o = H * j - F * T + R * N + G * X - z * Y + L * U, o ? (o = 1 / o, A[0] = (Q * j - _ * T + C * N) * o, A[1] = (B * T - P * j - l * N) * o, A[2] = (m * L - b * z + x * G) * o, A[3] = (p * z - E * L - M * G) * o, A[4] = (_ * X - u * j - C * Y) * o, A[5] = (v * j - B * X + l * Y) * o, A[6] = (b * R - I * L - x * F) * o, A[7] = (d * L - p * R + M * F) * o, A[8] = (u * T - Q * X + C * U) * o, A[9] = (P * X - v * T - l * U) * o, A[10] = (I * z - m * R + x * H) * o, A[11] = (E * R - d * z - M * H) * o, A[12] = (Q * Y - u * N - _ * U) * o, A[13] = (v * N - P * Y + B * U) * o, A[14] = (m * F - I * G - b * H) * o, A[15] = (d * G - E * F + p * H) * o, A) : null;
28
+ }, s.isDefinedENUMEntry = function(A, t) {
29
+ for (const e in A)
30
+ if (t === A[e])
31
+ return !0;
32
+ return !1;
33
+ }, s.isAudioContext = function(A) {
34
+ return A instanceof AudioContext || A instanceof OfflineAudioContext;
35
+ }, s.isAudioBuffer = function(A) {
36
+ return A instanceof AudioBuffer;
37
+ }, s.mergeBufferListByChannel = function(A, t) {
38
+ const e = t[0].length, n = t[0].sampleRate;
39
+ let i = 0;
40
+ for (let r = 0; r < t.length; ++r)
41
+ i > 32 && s.throw("Utils.mergeBuffer: Number of channels cannot exceed 32.(got " + i + ")"), e !== t[r].length && s.throw("Utils.mergeBuffer: AudioBuffer lengths are inconsistent. (expected " + e + " but got " + t[r].length + ")"), n !== t[r].sampleRate && s.throw("Utils.mergeBuffer: AudioBuffer sample rates are inconsistent. (expected " + n + " but got " + t[r].sampleRate + ")"), i += t[r].numberOfChannels;
42
+ const w = A.createBuffer(
43
+ i,
44
+ e,
45
+ n
46
+ );
47
+ let K = 0;
48
+ for (let r = 0; r < t.length; ++r)
49
+ for (let f = 0; f < t[r].numberOfChannels; ++f)
50
+ w.getChannelData(K++).set(
51
+ t[r].getChannelData(f)
52
+ );
53
+ return w;
54
+ }, s.splitBufferbyChannel = function(A, t, e) {
55
+ t.numberOfChannels <= e && s.throw("Utils.splitBuffer: Insufficient number of channels. (" + t.numberOfChannels + " splitted by " + e + ")");
56
+ let n = 0;
57
+ const i = Math.ceil(t.numberOfChannels / e);
58
+ for (let w = 0; w < i; ++w) {
59
+ const K = A.createBuffer(
60
+ e,
61
+ t.length,
62
+ t.sampleRate
63
+ );
64
+ for (let r = 0; r < e; ++r)
65
+ n < t.numberOfChannels && K.getChannelData(r).set(
66
+ t.getChannelData(n++)
67
+ );
68
+ }
69
+ return bufferList;
70
+ }, s.getArrayBufferFromBase64String = function(A) {
71
+ const t = window.atob(A), e = new Uint8Array(t.length);
72
+ return e.forEach(
73
+ (n, i) => e[i] = t.charCodeAt(i)
74
+ ), e.buffer;
75
+ };
76
+ const k = {
77
+ BASE64: "base64",
78
+ URL: "url"
79
+ };
80
+ function h(A, t, e) {
81
+ this._context = s.isAudioContext(A) ? A : s.throw("BufferList: Invalid BaseAudioContext."), this._options = {
82
+ dataType: k.BASE64,
83
+ verbose: !1
84
+ }, e && (e.dataType && s.isDefinedENUMEntry(k, e.dataType) && (this._options.dataType = e.dataType), e.verbose && (this._options.verbose = !!e.verbose)), this._bufferList = [], this._bufferData = this._options.dataType === k.BASE64 ? t : t.slice(0), this._numberOfTasks = this._bufferData.length, this._resolveHandler = null, this._rejectHandler = new Function();
85
+ }
86
+ h.prototype.load = function() {
87
+ return new Promise(this._promiseGenerator.bind(this));
88
+ }, h.prototype._promiseGenerator = function(A, t) {
89
+ typeof A != "function" ? s.throw("BufferList: Invalid Promise resolver.") : this._resolveHandler = A, typeof t == "function" && (this._rejectHandler = t);
90
+ for (let e = 0; e < this._bufferData.length; ++e)
91
+ this._options.dataType === k.BASE64 ? this._launchAsyncLoadTask(e) : this._launchAsyncLoadTaskXHR(e);
92
+ }, h.prototype._launchAsyncLoadTask = function(A) {
93
+ const t = this;
94
+ this._context.decodeAudioData(
95
+ s.getArrayBufferFromBase64String(this._bufferData[A]),
96
+ function(e) {
97
+ t._updateProgress(A, e);
98
+ },
99
+ function(e) {
100
+ t._updateProgress(A, null);
101
+ const n = 'BufferList: decoding ArrayByffer("' + A + '" from Base64-encoded data failed. (' + e + ")";
102
+ t._rejectHandler(n), s.throw(n);
103
+ }
104
+ );
105
+ }, h.prototype._launchAsyncLoadTaskXHR = function(A) {
106
+ const t = new XMLHttpRequest();
107
+ t.open("GET", this._bufferData[A]), t.responseType = "arraybuffer";
108
+ const e = this;
109
+ t.onload = function() {
110
+ if (t.status === 200)
111
+ e._context.decodeAudioData(
112
+ t.response,
113
+ function(n) {
114
+ e._updateProgress(A, n);
115
+ },
116
+ function(n) {
117
+ e._updateProgress(A, null);
118
+ const i = 'BufferList: decoding "' + e._bufferData[A] + '" failed. (' + n + ")";
119
+ e._rejectHandler(i), s.log(i);
120
+ }
121
+ );
122
+ else {
123
+ const n = 'BufferList: XHR error while loading "' + e._bufferData[A] + '". (' + t.status + " " + t.statusText + ")";
124
+ e._rejectHandler(n), s.log(n);
125
+ }
126
+ }, t.onerror = function(n) {
127
+ e._updateProgress(A, null), e._rejectHandler(), s.log(
128
+ 'BufferList: XHR network failed on loading "' + e._bufferData[A] + '".'
129
+ );
130
+ }, t.send();
131
+ }, h.prototype._updateProgress = function(A, t) {
132
+ if (this._bufferList[A] = t, this._options.verbose) {
133
+ const e = this._options.dataType === k.BASE64 ? "ArrayBuffer(" + A + ") from Base64-encoded HRIR" : '"' + this._bufferData[A] + '"';
134
+ s.log("BufferList: " + e + " successfully loaded.");
135
+ }
136
+ if (--this._numberOfTasks === 0) {
137
+ const e = this._options.dataType === k.BASE64 ? this._bufferData.length + " AudioBuffers from Base64-encoded HRIRs" : this._bufferData.length + " files via XHR";
138
+ s.log("BufferList: " + e + " loaded successfully."), this._resolveHandler(this._bufferList);
139
+ }
140
+ };
141
+ const nA = {
142
+ DEFAULT: [0, 1, 2, 3],
143
+ SAFARI: [2, 0, 1, 3],
144
+ FUMA: [0, 3, 1, 2]
145
+ };
146
+ function W(A, t) {
147
+ this._context = A, this._splitter = this._context.createChannelSplitter(4), this._merger = this._context.createChannelMerger(4), this.input = this._splitter, this.output = this._merger, this.setChannelMap(t || nA.DEFAULT);
148
+ }
149
+ W.prototype.setChannelMap = function(A) {
150
+ Array.isArray(A) && (this._channelMap = A, this._splitter.disconnect(), this._splitter.connect(this._merger, 0, this._channelMap[0]), this._splitter.connect(this._merger, 1, this._channelMap[1]), this._splitter.connect(this._merger, 2, this._channelMap[2]), this._splitter.connect(this._merger, 3, this._channelMap[3]));
151
+ }, W.ChannelMap = nA;
152
+ function Z(A) {
153
+ this._context = A, this._splitter = this._context.createChannelSplitter(4), this._inY = this._context.createGain(), this._inZ = this._context.createGain(), this._inX = this._context.createGain(), this._m0 = this._context.createGain(), this._m1 = this._context.createGain(), this._m2 = this._context.createGain(), this._m3 = this._context.createGain(), this._m4 = this._context.createGain(), this._m5 = this._context.createGain(), this._m6 = this._context.createGain(), this._m7 = this._context.createGain(), this._m8 = this._context.createGain(), this._outY = this._context.createGain(), this._outZ = this._context.createGain(), this._outX = this._context.createGain(), this._merger = this._context.createChannelMerger(4), this._splitter.connect(this._inY, 1), this._splitter.connect(this._inZ, 2), this._splitter.connect(this._inX, 3), this._inY.gain.value = -1, this._inX.gain.value = -1, this._inY.connect(this._m0), this._inY.connect(this._m1), this._inY.connect(this._m2), this._inZ.connect(this._m3), this._inZ.connect(this._m4), this._inZ.connect(this._m5), this._inX.connect(this._m6), this._inX.connect(this._m7), this._inX.connect(this._m8), this._m0.connect(this._outY), this._m1.connect(this._outZ), this._m2.connect(this._outX), this._m3.connect(this._outY), this._m4.connect(this._outZ), this._m5.connect(this._outX), this._m6.connect(this._outY), this._m7.connect(this._outZ), this._m8.connect(this._outX), this._splitter.connect(this._merger, 0, 0), this._outY.connect(this._merger, 0, 1), this._outZ.connect(this._merger, 0, 2), this._outX.connect(this._merger, 0, 3), this._outY.gain.value = -1, this._outX.gain.value = -1, this.setRotationMatrix3(new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1])), this.input = this._splitter, this.output = this._merger;
154
+ }
155
+ Z.prototype.setRotationMatrix3 = function(A) {
156
+ this._m0.gain.value = A[0], this._m1.gain.value = A[1], this._m2.gain.value = A[2], this._m3.gain.value = A[3], this._m4.gain.value = A[4], this._m5.gain.value = A[5], this._m6.gain.value = A[6], this._m7.gain.value = A[7], this._m8.gain.value = A[8];
157
+ }, Z.prototype.setRotationMatrix4 = function(A) {
158
+ this._m0.gain.value = A[0], this._m1.gain.value = A[1], this._m2.gain.value = A[2], this._m3.gain.value = A[4], this._m4.gain.value = A[5], this._m5.gain.value = A[6], this._m6.gain.value = A[8], this._m7.gain.value = A[9], this._m8.gain.value = A[10];
159
+ }, Z.prototype.getRotationMatrix3 = function() {
160
+ return [
161
+ this._m0.gain.value,
162
+ this._m1.gain.value,
163
+ this._m2.gain.value,
164
+ this._m3.gain.value,
165
+ this._m4.gain.value,
166
+ this._m5.gain.value,
167
+ this._m6.gain.value,
168
+ this._m7.gain.value,
169
+ this._m8.gain.value
170
+ ];
171
+ }, Z.prototype.getRotationMatrix4 = function() {
172
+ const A = new Float32Array(16);
173
+ return A[0] = this._m0.gain.value, A[1] = this._m1.gain.value, A[2] = this._m2.gain.value, A[4] = this._m3.gain.value, A[5] = this._m4.gain.value, A[6] = this._m5.gain.value, A[8] = this._m6.gain.value, A[9] = this._m7.gain.value, A[10] = this._m8.gain.value, A;
174
+ };
175
+ function S(A, t) {
176
+ this._context = A, this._active = !1, this._isBufferLoaded = !1, this._buildAudioGraph(), t && this.setHRIRBufferList(t), this.enable();
177
+ }
178
+ S.prototype._buildAudioGraph = function() {
179
+ this._splitterWYZX = this._context.createChannelSplitter(4), this._mergerWY = this._context.createChannelMerger(2), this._mergerZX = this._context.createChannelMerger(2), this._convolverWY = this._context.createConvolver(), this._convolverZX = this._context.createConvolver(), this._splitterWY = this._context.createChannelSplitter(2), this._splitterZX = this._context.createChannelSplitter(2), this._inverter = this._context.createGain(), this._mergerBinaural = this._context.createChannelMerger(2), this._summingBus = this._context.createGain(), this._splitterWYZX.connect(this._mergerWY, 0, 0), this._splitterWYZX.connect(this._mergerWY, 1, 1), this._splitterWYZX.connect(this._mergerZX, 2, 0), this._splitterWYZX.connect(this._mergerZX, 3, 1), this._mergerWY.connect(this._convolverWY), this._mergerZX.connect(this._convolverZX), this._convolverWY.connect(this._splitterWY), this._convolverZX.connect(this._splitterZX), this._splitterWY.connect(this._mergerBinaural, 0, 0), this._splitterWY.connect(this._mergerBinaural, 0, 1), this._splitterWY.connect(this._mergerBinaural, 1, 0), this._splitterWY.connect(this._inverter, 1, 0), this._inverter.connect(this._mergerBinaural, 0, 1), this._splitterZX.connect(this._mergerBinaural, 0, 0), this._splitterZX.connect(this._mergerBinaural, 0, 1), this._splitterZX.connect(this._mergerBinaural, 1, 0), this._splitterZX.connect(this._mergerBinaural, 1, 1), this._convolverWY.normalize = !1, this._convolverZX.normalize = !1, this._inverter.gain.value = -1, this.input = this._splitterWYZX, this.output = this._summingBus;
180
+ }, S.prototype.setHRIRBufferList = function(A) {
181
+ this._isBufferLoaded || (this._convolverWY.buffer = A[0], this._convolverZX.buffer = A[1], this._isBufferLoaded = !0);
182
+ }, S.prototype.enable = function() {
183
+ this._mergerBinaural.connect(this._summingBus), this._active = !0;
184
+ }, S.prototype.disable = function() {
185
+ this._mergerBinaural.disconnect(), this._active = !1;
186
+ };
187
+ const sA = [
188
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD+/wIA9v8QAPv/CwD+/wcA/v8MAP//AQD7/wEACAAEAPj/+v8YABAA7v/n//v/9P/M/8D//f34/R38EvzxAfEBtA2lDTcBJQFJ9T71FP0D/cD1tfVo/Wv9uPTO9PPmOufc/U/+agL3Aisc/RxuGKEZBv3j/iYMzQ2gAzsEQQUABiQFrASzA5cB2QmyCy0AtgR4AeYGtfgAA2j5OQHP+scArPsMBJgEggIEBtz6+QVq/pj/aPg8BPP3gQEi+jEAof0fA1v9+/7S+8IBjvwd/xD4IADL/Pf9zvs+/l3+wgB7/+L+7fzFADH9kf6A+n3+DP6+/TP9xP68/pn+w/26/i39YgA0/u790Pt9/kD+7v1s/Wb+8f4C/1P+pf/x/cT+6/3p/Xz9ff5F/0f9G/4r/6v/4P5L/sL+ff7c/pj+Ov7X/UT+9P5G/oz+6v6A/2D+9/6P/8r/bP7m/ij+C//e/tj/Gf4e/9v+FwDP/lz/sP7F/2H+rv/G/s7/Hf7y/4P+NAD9/k0AK/6w/zP/hACh/sX/gf44AOP+dgCm/iUAk/5qAOD+PwC+/jEAWP4CAAr/bQBw/vv/zf5iACD/OgCS/uD/Cv9oAAb/CgDK/kwA//5tACH/TgCg/h4AHP9aABP/JADP/hEAYv9gAAj/3f8m/ysAYv8gACX/8/8k/ysAXv8bABH//v8j/ygAa/8qAAD/9f9g/1YAWf8JACH/AgB2/z4AXP/w/z3/FgB2/ykAX//9/z//EwCV/zUAS//n/1T/GACK/x4ATv/0/4P/QQB4//v/WP/2/3X/HAB8//P/V//3/2f/AQBh/9v/Tf/x/5P/IwCI/wMAf/8hAKP/JACZ/xUAiv8nAK//HgCr/yMAm/8uAMz/OACi/yQAqf87AMT/MwCY/yUAtP9FAMH/KgCu/ycAyP85AMv/IwCz/xoA1f8qAMn/FgC8/xQA4/8nAMX/CwDJ/xQA4f8ZAMH/BgDO/xQA4f8WAMP/BwDU/xQA4P8QAMH/AQDb/xQA3P8JAMP/AgDh/xIA2v8EAMj/AgDk/w0A1f/+/8v/AwDm/wwA0v/+/9H/BgDl/wkAzv/8/9T/BwDk/wcAzv/8/9r/CQDi/wQAzf/8/9//CADf////0P/9/+L/BwDd//7/0////+T/BgDb//z/1f8AAOf/BQDZ//v/2v8CAOb/AwDY//v/3v8EAOb/AgDY//3/4f8FAOX/AQDZ//7/5P8GAOP/AADb/wAA5/8GAOH////d/wIA5/8FAOD////f/wMA6P8FAOD////h/wQA6P8EAN7////h/wUA4v8DANv/AQDd/wQA3P8CANn/AgDb/wMA2/8CANv/AgDd/wIA3v8CAOH/AQDj/wEA",
189
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAAAAAAA/f8CAP//AQD//wEA//8BAP3/AAACAP7/+f8AAAIA/P8FAAQA8/8AABoA+f/V/wQAHQDO/xoAQQBO/ocA0Px1/ucHW/4UCm8HLO6kAjv8/fCRDdAAYfPiBIgFXveUCM0GBvh6/nz7rf0J/QcQSRVdBgoBSgFR62r9NP8m+LoEAvriBVAAiAPmABEGMf2l+SwBjva6/G4A//8P/CYDMgXm/R0CKAE6/fcBBwAtAND+kQA0A5UDhwFs/8IB8fydAEP/A/8v/e7/mP8j/2YBIwE3Av0AYv+uAOD8lgAg/wwAIf/L/n0Ae//OAJMB3P/XAF//XwCM/08AB/8NAEf/rf4jAT3/lgAJAP4AHgDpAO8AUf9L/07/Qf8KAOD/x/+D/3sATQCDAMoA0f79/+L/EQDt/7EAqv+S/7IAuv/o/wgAc//X//H/SwCm/+3/Yf/B/yoAAADI/7X/AwBg/5EATgCX/xYA/P+q/00AVACY/6v/BADD/zwALQCN/8z/KQDu/ygAEgCZ/6f/VQDC//T/KQCs/7P/UgAfAO7/NgC8/57/awAZAPP/+P/V/8z/bQBBAL//DgD0/+T/TABBAMz/CwAxAPz/SQBqALn/BgALAPz/EAA7AIz/3/8iAAUA//8kALf/y/9VABQA+v81AOj/0P9cAB4A+f8WAOr/vv83ABgAw/8JAOj/4f8nACIAsf/y/w4A3v8gACQAxP/n/ycA7P8WAC0Ayf/U/ycA9v/7/yUA0P/P/zUABADc/xUA5P/J/zcACwDS/xUA9P/m/zAACQDX/+3/9v/2/yQACgDZ/+P/AwAKABYA///b/9j/EQALABkADgD6/+7/GwD4/w4A8P/w//j/EgAEAAUA9f/1/wQAGgD4/wAA5////wAAGQD1////7f8FAAUAFQDv/wAA6v8LAAcAFQDs/wEA9P8SAAYACwDr//7/AQASAAYABQDv/wIAAwAWAAIAAgDv/wAABgATAAEA/f/u/wQABgAQAPr/+P/z/wUACQALAPj/9//4/wgABwAKAPT/+f/5/w4ABwAIAPT/+//9/w4AAwADAPH//f///w8A//8BAPP///8BAA0A/f/+//X/AgACAA0A+//8//b/BAADAAoA+f/7//n/BgADAAcA+P/7//v/BwABAAQA+P/8//3/CQABAAIA9//9////CQD/////+P///wAACAD9//7/+f8AAAAABwD8//3/+v8CAAAABgD7//z//P8EAAAABAD6//3//P8FAP//AgD6//7//v8FAP7/AQD7//////8GAP7/AAD7/wEA//8EAP3/AAD9/wEA/v8DAP3/AAD9/wIA/v8CAP3/AQD9/wIA/v8CAP7/AQD+/wEA"
190
+ ], V = {
191
+ AMBISONIC: "ambisonic",
192
+ BYPASS: "bypass",
193
+ OFF: "off"
194
+ };
195
+ function c(A, t) {
196
+ this._context = s.isAudioContext(A) ? A : s.throw("FOARenderer: Invalid BaseAudioContext."), this._config = {
197
+ channelMap: W.ChannelMap.DEFAULT,
198
+ renderingMode: V.AMBISONIC
199
+ }, t && (t.channelMap && (Array.isArray(t.channelMap) && t.channelMap.length === 4 ? this._config.channelMap = t.channelMap : s.throw(
200
+ "FOARenderer: Invalid channel map. (got " + t.channelMap + ")"
201
+ )), t.hrirPathList && (Array.isArray(t.hrirPathList) && t.hrirPathList.length === 2 ? this._config.pathList = t.hrirPathList : s.throw(
202
+ "FOARenderer: Invalid HRIR URLs. It must be an array with 2 URLs to HRIR files. (got " + t.hrirPathList + ")"
203
+ )), t.renderingMode && (Object.values(V).includes(t.renderingMode) ? this._config.renderingMode = t.renderingMode : s.log(
204
+ "FOARenderer: Invalid rendering mode order. (got" + t.renderingMode + ') Fallbacks to the mode "ambisonic".'
205
+ ))), this._buildAudioGraph(), this._tempMatrix4 = new Float32Array(16), this._isRendererReady = !1;
206
+ }
207
+ c.prototype._buildAudioGraph = function() {
208
+ this.input = this._context.createGain(), this.output = this._context.createGain(), this._bypass = this._context.createGain(), this._foaRouter = new W(this._context, this._config.channelMap), this._foaRotator = new Z(this._context), this._foaConvolver = new S(this._context), this.input.connect(this._foaRouter.input), this.input.connect(this._bypass), this._foaRouter.output.connect(this._foaRotator.input), this._foaRotator.output.connect(this._foaConvolver.input), this._foaConvolver.output.connect(this.output), this.input.channelCount = 4, this.input.channelCountMode = "explicit", this.input.channelInterpretation = "discrete";
209
+ }, c.prototype._initializeCallback = function(A, t) {
210
+ (this._config.pathList ? new h(this._context, this._config.pathList, { dataType: "url" }) : new h(this._context, sA)).load().then(
211
+ (function(n) {
212
+ this._foaConvolver.setHRIRBufferList(n), this.setRenderingMode(this._config.renderingMode), this._isRendererReady = !0, s.log("FOARenderer: HRIRs loaded successfully. Ready."), A();
213
+ }).bind(this),
214
+ function() {
215
+ const n = "FOARenderer: HRIR loading/decoding failed.";
216
+ t(n), s.throw(n);
217
+ }
218
+ );
219
+ }, c.prototype.initialize = function() {
220
+ return s.log(
221
+ "FOARenderer: Initializing... (mode: " + this._config.renderingMode + ")"
222
+ ), new Promise(this._initializeCallback.bind(this));
223
+ }, c.prototype.setChannelMap = function(A) {
224
+ this._isRendererReady && A.toString() !== this._config.channelMap.toString() && (s.log(
225
+ "Remapping channels ([" + this._config.channelMap.toString() + "] -> [" + A.toString() + "])."
226
+ ), this._config.channelMap = A.slice(), this._foaRouter.setChannelMap(this._config.channelMap));
227
+ }, c.prototype.setRotationMatrix3 = function(A) {
228
+ this._isRendererReady && this._foaRotator.setRotationMatrix3(A);
229
+ }, c.prototype.setRotationMatrix4 = function(A) {
230
+ this._isRendererReady && this._foaRotator.setRotationMatrix4(A);
231
+ }, c.prototype.setRotationMatrixFromCamera = function(A) {
232
+ this._isRendererReady && (s.invertMatrix4(this._tempMatrix4, A.elements), this._foaRotator.setRotationMatrix4(this._tempMatrix4));
233
+ }, c.prototype.setRenderingMode = function(A) {
234
+ if (A !== this._config.renderingMode) {
235
+ switch (A) {
236
+ case V.AMBISONIC:
237
+ this._foaConvolver.enable(), this._bypass.disconnect();
238
+ break;
239
+ case V.BYPASS:
240
+ this._foaConvolver.disable(), this._bypass.connect(this.output);
241
+ break;
242
+ case V.OFF:
243
+ this._foaConvolver.disable(), this._bypass.disconnect();
244
+ break;
245
+ default:
246
+ s.log(
247
+ 'FOARenderer: Rendering mode "' + A + '" is not supported.'
248
+ );
249
+ return;
250
+ }
251
+ this._config.renderingMode = A, s.log("FOARenderer: Rendering mode changed. (" + A + ")");
252
+ }
253
+ };
254
+ function J(A, t, e) {
255
+ this._context = A, this._active = !1, this._isBufferLoaded = !1, this._ambisonicOrder = t, this._numberOfChannels = (this._ambisonicOrder + 1) * (this._ambisonicOrder + 1), this._buildAudioGraph(), e && this.setHRIRBufferList(e), this.enable();
256
+ }
257
+ J.prototype._buildAudioGraph = function() {
258
+ const A = Math.ceil(this._numberOfChannels / 2);
259
+ this._inputSplitter = this._context.createChannelSplitter(this._numberOfChannels), this._stereoMergers = [], this._convolvers = [], this._stereoSplitters = [], this._positiveIndexSphericalHarmonics = this._context.createGain(), this._negativeIndexSphericalHarmonics = this._context.createGain(), this._inverter = this._context.createGain(), this._binauralMerger = this._context.createChannelMerger(2), this._outputGain = this._context.createGain();
260
+ for (let t = 0; t < A; ++t)
261
+ this._stereoMergers[t] = this._context.createChannelMerger(2), this._convolvers[t] = this._context.createConvolver(), this._stereoSplitters[t] = this._context.createChannelSplitter(2), this._convolvers[t].normalize = !1;
262
+ for (let t = 0; t <= this._ambisonicOrder; ++t)
263
+ for (let e = -t; e <= t; e++) {
264
+ const n = t * t + t + e, i = Math.floor(n / 2);
265
+ this._inputSplitter.connect(
266
+ this._stereoMergers[i],
267
+ n,
268
+ n % 2
269
+ ), this._stereoMergers[i].connect(this._convolvers[i]), this._convolvers[i].connect(this._stereoSplitters[i]), e >= 0 ? this._stereoSplitters[i].connect(
270
+ this._positiveIndexSphericalHarmonics,
271
+ n % 2
272
+ ) : this._stereoSplitters[i].connect(
273
+ this._negativeIndexSphericalHarmonics,
274
+ n % 2
275
+ );
276
+ }
277
+ this._positiveIndexSphericalHarmonics.connect(this._binauralMerger, 0, 0), this._positiveIndexSphericalHarmonics.connect(this._binauralMerger, 0, 1), this._negativeIndexSphericalHarmonics.connect(this._binauralMerger, 0, 0), this._negativeIndexSphericalHarmonics.connect(this._inverter), this._inverter.connect(this._binauralMerger, 0, 1), this._inverter.gain.value = -1, this.input = this._inputSplitter, this.output = this._outputGain;
278
+ }, J.prototype.setHRIRBufferList = function(A) {
279
+ if (!this._isBufferLoaded) {
280
+ for (let t = 0; t < A.length; ++t)
281
+ this._convolvers[t].buffer = A[t];
282
+ this._isBufferLoaded = !0;
283
+ }
284
+ }, J.prototype.enable = function() {
285
+ this._binauralMerger.connect(this._outputGain), this._active = !0;
286
+ }, J.prototype.disable = function() {
287
+ this._binauralMerger.disconnect(), this._active = !1;
288
+ };
289
+ function eA(A, t) {
290
+ return A === t ? 1 : 0;
291
+ }
292
+ function rA(A, t, e, n, i) {
293
+ const w = (n + t) * (2 * t + 1) + (e + t);
294
+ A[t - 1][w].gain.value = i;
295
+ }
296
+ function g(A, t, e, n) {
297
+ const i = (n + t) * (2 * t + 1) + (e + t);
298
+ return A[t - 1][i].gain.value;
299
+ }
300
+ function D(A, t, e, n, i) {
301
+ return n === i ? g(A, 1, t, 1) * g(A, i - 1, e, i - 1) - g(A, 1, t, -1) * g(A, i - 1, e, -i + 1) : n === -i ? g(A, 1, t, 1) * g(A, i - 1, e, -i + 1) + g(A, 1, t, -1) * g(A, i - 1, e, i - 1) : g(A, 1, t, 0) * g(A, i - 1, e, n);
302
+ }
303
+ function oA(A, t, e, n) {
304
+ return D(A, 0, t, e, n);
305
+ }
306
+ function aA(A, t, e, n) {
307
+ if (t === 0)
308
+ return D(A, 1, 1, e, n) + D(A, -1, -1, e, n);
309
+ if (t > 0) {
310
+ const i = eA(t, 1);
311
+ return D(A, 1, t - 1, e, n) * Math.sqrt(1 + i) - D(A, -1, -t + 1, e, n) * (1 - i);
312
+ } else {
313
+ const i = eA(t, -1);
314
+ return D(A, 1, t + 1, e, n) * (1 - i) + D(A, -1, -t - 1, e, n) * Math.sqrt(1 + i);
315
+ }
316
+ }
317
+ function fA(A, t, e, n) {
318
+ return t === 0 ? 0 : t > 0 ? D(A, 1, t + 1, e, n) + D(A, -1, -t - 1, e, n) : D(A, 1, t - 1, e, n) - D(A, -1, -t + 1, e, n);
319
+ }
320
+ function hA(A, t, e) {
321
+ const n = eA(A, 0), i = Math.abs(t) === e ? 1 / (2 * e * (2 * e - 1)) : 1 / ((e + t) * (e - t));
322
+ return [
323
+ Math.sqrt((e + A) * (e - A) * i),
324
+ 0.5 * (1 - 2 * n) * Math.sqrt((1 + n) * (e + Math.abs(A) - 1) * (e + Math.abs(A)) * i),
325
+ -0.5 * (1 - n) * Math.sqrt((e - Math.abs(A) - 1) * (e - Math.abs(A))) * i
326
+ ];
327
+ }
328
+ function DA(A, t) {
329
+ for (let e = -t; e <= t; e++)
330
+ for (let n = -t; n <= t; n++) {
331
+ const i = hA(e, n, t);
332
+ Math.abs(i[0]) > 0 && (i[0] *= oA(A, e, n, t)), Math.abs(i[1]) > 0 && (i[1] *= aA(A, e, n, t)), Math.abs(i[2]) > 0 && (i[2] *= fA(A, e, n, t)), rA(
333
+ A,
334
+ t,
335
+ e,
336
+ n,
337
+ i[0] + i[1] + i[2]
338
+ );
339
+ }
340
+ }
341
+ function iA(A) {
342
+ for (let t = 2; t <= A.length; t++)
343
+ DA(A, t);
344
+ }
345
+ function O(A, t) {
346
+ this._context = A, this._ambisonicOrder = t;
347
+ const e = (t + 1) * (t + 1);
348
+ this._splitter = this._context.createChannelSplitter(e), this._merger = this._context.createChannelMerger(e), this._gainNodeMatrix = [];
349
+ let n, i, w, K, r;
350
+ for (let f = 1; f <= t; f++) {
351
+ n = f * f, i = 2 * f + 1, this._gainNodeMatrix[f - 1] = [];
352
+ for (let AA = 0; AA < i; AA++) {
353
+ w = n + AA;
354
+ for (let tA = 0; tA < i; tA++)
355
+ K = n + tA, r = AA * i + tA, this._gainNodeMatrix[f - 1][r] = this._context.createGain(), this._splitter.connect(
356
+ this._gainNodeMatrix[f - 1][r],
357
+ w
358
+ ), this._gainNodeMatrix[f - 1][r].connect(
359
+ this._merger,
360
+ 0,
361
+ K
362
+ );
363
+ }
364
+ }
365
+ this._splitter.connect(this._merger, 0, 0), this.setRotationMatrix3(new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1])), this.input = this._splitter, this.output = this._merger;
366
+ }
367
+ O.prototype.setRotationMatrix3 = function(A) {
368
+ this._gainNodeMatrix[0][0].gain.value = -A[0], this._gainNodeMatrix[0][1].gain.value = A[1], this._gainNodeMatrix[0][2].gain.value = -A[2], this._gainNodeMatrix[0][3].gain.value = -A[3], this._gainNodeMatrix[0][4].gain.value = A[4], this._gainNodeMatrix[0][5].gain.value = -A[5], this._gainNodeMatrix[0][6].gain.value = -A[6], this._gainNodeMatrix[0][7].gain.value = A[7], this._gainNodeMatrix[0][8].gain.value = -A[8], iA(this._gainNodeMatrix);
369
+ }, O.prototype.setRotationMatrix4 = function(A) {
370
+ this._gainNodeMatrix[0][0].gain.value = -A[0], this._gainNodeMatrix[0][1].gain.value = A[1], this._gainNodeMatrix[0][2].gain.value = -A[2], this._gainNodeMatrix[0][3].gain.value = -A[4], this._gainNodeMatrix[0][4].gain.value = A[5], this._gainNodeMatrix[0][5].gain.value = -A[6], this._gainNodeMatrix[0][6].gain.value = -A[8], this._gainNodeMatrix[0][7].gain.value = A[9], this._gainNodeMatrix[0][8].gain.value = -A[10], iA(this._gainNodeMatrix);
371
+ }, O.prototype.getRotationMatrix3 = function() {
372
+ const A = new Float32Array(9);
373
+ return A[0] = -this._gainNodeMatrix[0][0].gain.value, A[1] = this._gainNodeMatrix[0][1].gain.value, A[2] = -this._gainNodeMatrix[0][2].gain.value, A[4] = -this._gainNodeMatrix[0][3].gain.value, A[5] = this._gainNodeMatrix[0][4].gain.value, A[6] = -this._gainNodeMatrix[0][5].gain.value, A[8] = -this._gainNodeMatrix[0][6].gain.value, A[9] = this._gainNodeMatrix[0][7].gain.value, A[10] = -this._gainNodeMatrix[0][8].gain.value, A;
374
+ }, O.prototype.getRotationMatrix4 = function() {
375
+ const A = new Float32Array(16);
376
+ return A[0] = -this._gainNodeMatrix[0][0].gain.value, A[1] = this._gainNodeMatrix[0][1].gain.value, A[2] = -this._gainNodeMatrix[0][2].gain.value, A[4] = -this._gainNodeMatrix[0][3].gain.value, A[5] = this._gainNodeMatrix[0][4].gain.value, A[6] = -this._gainNodeMatrix[0][5].gain.value, A[8] = -this._gainNodeMatrix[0][6].gain.value, A[9] = this._gainNodeMatrix[0][7].gain.value, A[10] = -this._gainNodeMatrix[0][8].gain.value, A;
377
+ }, O.prototype.getAmbisonicOrder = function() {
378
+ return this._ambisonicOrder;
379
+ };
380
+ const gA = [
381
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD+/wQA8/8YAP3/CgACAAAA//8CAAYA8/8AAPH/CgDv/97/e/+y/9P+UQDwAHUBEwV7/pP8P/y09bsDwAfNBGYIFf/Y+736+fP890Hv8AGcC3T/vwYy+S70AAICA3AD4AagBw0R4w3ZEAcN8RVYAV8Q8P2z+kECHwdK/jIG0QNKAYUElf8IClj7BgjX+/f8j/l3/5f/6fkK+xz8FP0v/nj/Mf/n/FcBPfvH/1H3+gBP/Hf8cfiCAR/54QBh+UQAcvkzAWL8TP13+iD/V/73+wv9Kv+Y/hv+xPz7/UL83//a/z/9AP6R/5L+jf26/P3+rP26/tD8nP7B/Pv+WP1V/sP9gv91/3P9xP3J/nv/GP5S/sb+IP8v/9j/dv7U/pr+6v+u/Z3/sv5cAOr9Q/83/+n/zP5x/57+2//k/nwA/v01//L+SACB/sD/Ff81AJT+TgDp/ocAm/5dAFT+MgD+/pMAW/7o/yH/xQDA/kkA9P6LAL3+pAC0/iQAz/5UALD+UwAt/3UAhf4UAA//pwC+/joAz/5aAAv/fwDY/iMAIf+uAPP+ZAAc/0QAy/4xAB7/TgDs/goADP8wAEL/NwDo/ub/Uf9BAC3/+v9F/y4ARP9HAFP/EQA3/xMATP81AG3/HQAu/wgAaP9FACb/9f9B/y0AUP8rAED/CwBV/z4AW/8TAGH/BQBK/xsAfv8eAFn/AgB3/zwAff8RAGj//v+E/yAAb//0/3n/FwBz/xcAiv8PAHn/FQCJ/xgAg//x/3j/EQCa/ycAff/w/47/HwCI//X/iv/7/43/JQCM/+n/kP8AAJb/JACj//7/oP8ZAML/SwCo/w4Atv8tAMb/PACr/xcAwP9HAMP/OADF/y4A0f9IANL/NwC//zEA0f9LAMb/MAC8/y4A3f9GAMH/FQDQ/yYA2/8sAMT/AwDX/xkA3v8SAM3/9v/c/w8A4f8LAMj/8f/h/xQA2P8CAMn/8//j/xQA0v/7/9H//P/i/xEA0v/1/9L//f/j/w0A0f/x/9f//v/k/wgAz//u/9z/AwDg/wMA0P/v/9//BQDf////0v/y/+D/CADc//3/0v/2/+L/CgDa//r/1v/5/+T/CgDY//j/2f/9/+T/CADY//f/3P8AAOT/BwDY//f/4P8EAOP/BADZ//j/4v8GAOL/AwDa//r/5f8IAOH/AQDc//3/5v8JAOD//v/f////5v8IAOD//v/h/wIA5/8HAOD//f/j/wMA5/8GAOD//f/l/wYA5v8EAOD//v/m/wYA5f8CAOL////n/wYA5P8BAOH/AADl/wUA4f///+H/AQDk/wMA4f///+T/AQDm/wEA5////+r/AADt/wAA7/////P/AAD1////",
382
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD//////v///wAAAAAAAAAAAQAAAAAA///9/wAABAD+//n/AgAJAAAA+v/+//f/DAAdAPv/+v+l/8L+jf/4/vgAdwVPAQACLQBo+Qj/Ev7o/N3/VgCbA08Bxf+L+yn9J/2HCU8FmgBvDe30Rv5h/LT09gi5CxkA5gOi8/30kwEM+4YJMf2nBmkJJAQQBLoFtvvv+m4A7PF6/R0Bif3qAuf8WARAAf4GyABG/BIAwvr4Acv8U//c/yIC8AEn/B8Daf2CAgMBAf3MAN38vgLK/UT/QwCyAPYClPyvAW/+pQAoASD+zP+R/IYC1f7C/nEBQP96AZb+1QAIAM//yQE7/tkAZ/7TAXL/w/8+AIsAtwB7/24A4v9a/z4A7v4iADb/dwCj/23/kgBOANUAIv8lAKEAxP9gAK7/BwCP/5kA7/9v/0wAzv9DAGT/3/9vAHv/6P+q/xUA7P8XAO//uv/g/2UAEgCV/wEATADM/+7/+//j/+D/9v/i//j/IgD+/xoAxf/6/z4A5/+8/9D/QwDq/+3/OQDT/zUAIgA/APP/PgAjAPD/BwAGACAADAC3//b/HAA3AN//RgDN/w8AIAACAN//GQBDACEAIwA+ACoAJQAeAPz/KgAYAPr/DgAEABYAIgAcAMT/7f8OAOL/5P/2//L/9P8GAPT/7v/8/+7/6v/t//z/AgAUAOL//P8VAAMA4/8IAPb/+P8MAAoA5v8NAAsA9v///wEAAAD9//n/9/8JAAYA7v/6/wMA+f8GAAEA7f/7/xgACAD4/w8A///3/w0A+f8BAAIA/P/5/xIA///9//r/7v/+/xYACQD///H/CwDz/wEADgAHAPP/FADn/+3/AQD5//f/AgD7/wEABwAMAAEADQD8//n/8f8OAPX/BAD+//X/+v8WAAQA+f8CAAEA7/8QAAEA/P8DAAUA9f8KAAwA9v8DAAUA+f8OAAoA9f/7/w0A+v8EAAgA8P/6/woA+//8/wkA+P/3/woA+//8/wcA9//1/woAAwD5/wcA/P/3/w0AAwD3/wEABAD2/wkABgD3/wEABQD3/wUABQD3//v/BwD3/wMABQD3//r/CQD7////BQD6//n/CQD9//3/BAD9//j/BwAAAPv/AwD///j/BwABAPn/AQABAPn/BQACAPn///8DAPr/AwADAPr//v8EAPv/AQADAPv//P8FAP3///8DAPz/+/8FAP7//f8CAP7/+/8EAP///P8BAP//+/8DAAEA+/8AAAEA+/8CAAIA+////wIA/f8AAAIA/P/+/wIA/f8AAAIA/f/9/wMA/////wEA///+/wIA/////wAAAAD+/wAAAAD/////AAD//wAA//8AAP//AAD//wAA",
383
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD////////+//////8AAP////8AAP//AAAAAPz//f8IAAMA9////w4AAQD6/wwA8//+/y8Afv/0/2H/UP5gAbH+2QG1B2cAVAIh/l32FPyM/nACPQDV/+UEo/Q6AQwCu/oLD9kF8QJA/Uz+Wf2KCOcC+wUKBsL5aQBQ97rwOPiPAvn5CAl8AHEDkQPcAA8Bn/lIAdz7HQF1+xz9cAM4/94E4gDKAun+cgPYAYr9JgJr/bf+ivxz/MoBgv5UA8EBSgAQAJ7/UgEk/cQB7f63/sD/vf4XAhT/BQFCADYAnQGI/9EBtv3hALD/vP+c/3H/TgIN/1sBpf8yAP3/4f8qABr+1f8OAJ3/dwAGADEBnv9JAPz/IQBwAIH/jgAS/4wAsACTAOn/DQDCALn/ZQCSAAIAAwD1/9//jv9aADQA/v9EAB0AfgA8AAQACgB9APr/IAARAPT/5v9xACAABAAHAGUAt/89AC4ACgAjAMP/+v/9/xYA7f/1/+D/7P87AC0Auv8RAAcA9/8FAC8A2//y/xIAEwAaADQAJADp/zoAAgAfABIA2f/e/zUA+P/6/w4A9//A/zcA4//P//T/5f/R////EwDb/w4A8/8BABkANADh/xEA+f/0/wIAHADc//j/GwD1//f/GADs/+v/EAAAAPz/EgD3/+r/FgAMAAkAGAD9/+z/IQAQAPH/GQD3//z/CgAfAOX/AgD8//H/BAATAOv/+v///wIABAAdAOj/BQAPAAcAAQATAOz/8/8JAAkA6f8VAOv/+f8QABUA/v8OAO3/+P8KABUA9f8FAPv/5/8TAA0A7f8XAAkAAQAJABYA4/8WAAcACgANABEA7v8EAP7/AAD+/wMA9//7/xAAAQD8/wQA+f/7/wMABgDq/wAA+v/3/wYACQD1//3/BAD9/wgADgDw//r/AgD6/wEACADv//j/BQD///X/BwDu//j/AgACAPP/BAD2//n/BAAGAPb/BAD8//3/BQAJAPL/AwD+//3/BAAIAPP//f8DAPz/AAAGAPP/+/8CAP7//f8FAPX/+f8DAAAA/P8EAPf/+v8GAAMA+/8EAPv/+/8GAAQA+v8CAP///P8EAAUA+f8AAP///f8CAAUA+P///wEA/v8BAAUA+f/+/wIAAAD//wUA+v/9/wMAAQD9/wQA+//9/wMAAgD8/wMA/P/9/wMAAwD7/wEA/v/+/wIAAwD6/wEA///+/wAABAD6/wAAAQD//wAAAwD7////AQAAAP//AwD8//7/AgABAP3/AgD9//7/AQABAP3/AQD+//7/AAACAPz/AAD+//////8BAP3/AAD//wAA//8BAP7/AAD//wAA/v8AAP7/AAD//wAA//8AAP//",
384
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD//////P/9//3//////wAAAAAAAAIAAgACAP//CAAEAEEA//+cAAUAb/8HAAH9+P9eARkAogQUAJn8BwCd/gX/+QQNAKoC9gFdAtb/b/vd/936TP/6AsD/nfqn/un1W/0dA8IEsQLvAJv2bP72+WMAkP8dAcX+nQO2AIr6bP/EABX+NgK/Bdj2IQv2AE4EUAiD/xQAnwIm/B0B/wGNAoH7sQaP/b8CiQakAqD+R/9xA477KQL//6r75v/O/pcCgQCtAiMCBQAkANAARwHf//39hgBl/kUAJgEtAUEATgA/AgoASADK/zUAJv29/vL+l/9c/0cAUwBBAE8A6QE5/87/Wv9NAOf+5v7P/5P/4/9BAKYAQwDD/zYB5v+r/zYATwAp/1v/WQAEAB0AhwA0AA0AIAA3AAEAzv/u/+//5v9m/zwAIADQ/8T/SABiANb/SwAbAFf/MQDX/7L/hP8TAPr/AgAMAAsAHwAZAI3/VgDC/9v/5//x/6P/AwBlAMv/yf82AB4A+P9WAPj/NwDi/1EA0v9JANj/JwAcAAEADABYANj/4f8MAEwAmP82AN//3P8UADYA7//6/wIACADU/ygAyv82AN7/9v/2/ygAxv/9/+3/5//n/zUA6//g/y4ADgD5/wsABwDv/xIADwAGACoAJQD3/zIA+/8FABsAFgDO/zAAHAAIABQALADp/xcACAAAAPH/GADs/wkACQAFAAgAFQDp/wIAHAD1//P/EQDw/+3/GAD9/+f/HAD8//T/DAAQAPH/HwD4//r/DwAPAOj/EQACAOn/DAAXAOX/BAAOANH/9/8MAO//9f8LANT/9f8EAO//6f8NANb/+P8KAOz/5v8MAOD/7f8UAO//7//+//7/9v8YAPj/9f/z/wsA+v8SAPD/+v/x/xYA+f8SAPb/9//3/xEABQACAPn/9//y/xQACQD///b//v/7/xIACQD9//H/AAD7/xEAAgD5//P/AwD9/w8AAgD3//D/BAD//wUA/v/0//D/BgADAAMA/P/2//f/BwAGAP7/+//2//j/CAAFAPv/+f/5//v/BwAHAPn/9//7//7/BQAFAPf/9//+/wEABAACAPf/+P8BAAIAAgAAAPj/9/8CAAMAAAD+//n/+f8EAAQA/v/8//r/+/8EAAMA/P/7//z//P8EAAIA/P/5//7//v8DAAEA+//5//////8CAAAA+//5/wEAAAABAP//+//6/wIAAQD///3//P/7/wMAAQD///3//f/9/wIAAQD9//3//v/9/wMAAQD9//z/AAD//wEAAAD9//z/AAAAAAAA///9//3/AAD//wAA/v////7/AAD//wAA////////AAD//wAA//8AAP//",
385
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD+////+f////v//v///wAA/////wUAAQAIAAIABwACAHkATAAOAaMAAf9C/9X6QvwhArAAtghABW37nv/y+0wAWQNcAE8JRwSOC6AEJe8P8S/zrPWaBI/+LQA/+0L+P/4K8AgAb/8uCh78BQtC614GaQWfAin5UfzN8Tf+GQizAZ4MCQMbGJ4BoRS7AvcHyQARA6n9ZwHZ/z4DvwAZAlAB6gbNAS4GFADFATL7E/2K+j37C/xp/SD9Uv0VAOsDs//WAd3+bv7F/f79mP2X/KH+FwC0/1n+VgFcATABHQGaAET+nf8Y/hoAovpqAXj9CQKW/lsCl/4RApj+bAHk/RcAlv4BAG/+DgDi//3/GwAOAEIAq/+y/3z/8v8+/7T/Tv8//27/mgDZ/1sA+P+cAAAA/P/i/yMAi/85AMP/KgDM/9MA9P+QABoA4QAiACwACwBdAP7/TQDb/y0Ayf+SAA0AZwDg/4wA+/8/AAMAgQDp/w0ADAAQAAoANgAgAA4AKABIAB4A4v/3/+f/+v/c/+n/EADn/wgAFAAqAOz/IwDc/9//3f8XAND/2v/a/w0A5v8BANb/9P/m/wAA8P8ZAN3/RwAGAEsABgB/AP7/NAASAEgABAA3AP3/KgD9/1sA8P8lAOr/FgD1/xAA4/8kAOv/AwD4/xEA5f8NAPT/+v/3/x8A7f8PAPj/IwD5/yAA9/8ZAAEAGgD4/xoA9f8HAAMACAD0/xgA+P8AAPr/IQDp/w4A8v8HAPX/IgD1/wYA+P8GAPX/GgD3/woABQASAAcAGQDw/+v/9P8bAP3/HADs/+f/7/8LAPr//v/0//T/AgD2/wsA6P///+P/CADY//7/5v/3/wQA/v8LAPD/GgD1/yMA/P8QAOv/LADw/yQA+P8XAO7/MQD9/yEAAQAcAPD/IgD9/xMA+/8OAO//FQABAAoA+/8PAPP/FQABAAQA9/8PAPX/CAADAAEA+P8NAPv/CAAGAAUA9/8JAP//AAAFAPz/+f8HAAQA/f8FAP3//P8FAAYA+P8DAP7/+/8AAAcA9/8BAP///f///wgA9//+/wAA/v/8/wUA9//8/wIA///7/wUA+v/7/wIAAAD6/wMA/P/6/wEAAQD6/wEA/v/7/wIAAgD6////AAD7/wEAAgD7//7/AQD8/wAAAwD8//3/AwD9/wAAAgD9//z/AwD/////AgD+//z/AwAAAP7/AQD///3/AgABAP3/AAAAAP3/AgACAPz///8BAP3/AQACAP3//v8BAP7/AAABAP3//v8CAP7///8BAP7//f8CAP////8AAAAA/v8CAAAAAAAAAAAA/v8BAAAAAAD//wAA//8AAP//AAD//wAA//8AAP//",
386
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAAAAP//AAD//wAA//8AAAAA/////wAAAQD+////AAAGAP3/OAABAIIAAwBv//f/E/0QAK0ADQCzA/7/8P4u/0cBDQCJA6ABbQDg/w7/z/9o+Vn/SPnL/1//Ef+2+jr9RfZgA5QFZwILDFj+PAb2/nEFKgKk/R0Dlv6b/FUDsP6YAoj9SgAT/iL/tAPwAv8A0P6zAr7/dwAnAf39uP22/skA2v///2YCoP4UAUsAZgF2AJH+4P70/rz9+f+U/Xv/8v7CAcb+TACS/kwAv/+x/tX9oP71/oL/1f8nAEUAZwGtAAgAIgC/AD4BaP8GAGH/dQDF/64Arf8nAakAhAH9/+kAQQD3AFb/q/8p/yIAR/8FAPD/ZAA/AIYA3v8tADQADQBp/3f/CwABAP3/Wf8OANj/WwDH/xoAe/8DAKz/zv96/z8A3f/J/5X/IAD5//j/q//c/+//RADq//D/vv8pADUAFQDI/y8ACAAbANb/OwD3/+3/9f/e/wcAIAAeAMH/8/8xAC0AEADW/+3/HAADAPv/8P8DAOL/OwD3/xcACQAHAM//5f8XAAcAz//T/9D/HgD9////yf/e//v/AgD//9H/6/////H/+/8hAAIA9//7/w0AFgAQAPL/2v/8/xsAGQABANz/9P8YAAQA/v/y/wMA5v8YAAkAAAAAAAMA7/8KABgADwDs//j/BwATABsA8P/1//z/BAAMAAAA9P/s/xAA/v8GAAkA/v/p/wMACwALAP7/9P/p/wcADQAFAPb/7//4/w0ACAD8//b//v/1/wMACwD1//T/8P/8/wAACQDz/+f/5P8GAAkABQD5//D/+v8FAA0AAwD///T/AgACABAA/v8CAPD/+/8FAAoA9f/3//f//v8GAP7/9v/t//z/+f8AAPj/+v/3/wEA+v8HAPr//P/5/wQA//8DAPr/+P/3/wYA///+//X/+//5/wQA/f/7//X/+//4/wMA/f/8//j//v/9/wYA///8//f/AgAAAAUA/f/6//n/AwACAAIA/f/7//z/AwACAAAA/f/6//3/AgADAP7//f/7/wAAAwAFAPz////8/wMAAgAEAPv//v/+/wMAAgADAPv//v///wMAAQABAPv//f8AAAIAAAD///v//f8BAAIA///+//z//v8CAAIA/v/9//3///8CAAEA/v/9//7/AAACAAAA/v/9////AAABAAAA/f/9/wAAAQABAP///f/+/wEAAQAAAP///v/+/wEAAQD///7//v///wEAAQD///7//v///wEAAAD+//7///8AAAAAAAD+//7///8AAAAA///+//7///8AAAAA////////AAAAAP////////////8AAP//////////",
387
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAAAAAAAAAABAAAAAAD//////////////v////3/////////+//8////AQD9//z/9f8BAAIA+f8dACgAWQBxAJX/qv+Y/uz9aP9k/7UDUQQBAiQA4Pgi/AkB0gKaBsD/+fxp/vz9CQSp/I/+ywDO+vMD0fzK/PABcgBeBfoBv/+uAuH9Sf5gAy39awMmBWUBuP9fA9/9fgDj/2/+EACaACcCSv9Z/2j/rv7hAA0AWf55/7L84P7E/SIAT/67AMv/tf+FAA7/1v+7/gv/IP+E/sQA+P5aAXz/tP9XAFX/tP8o/4r/j//e/yQAMv9mAJT/rgCr/9X/EwCb//H/9f7F/6D/EAAoAK3//v+e/zsAh/+B/7r/if/C/2r/4P/z/6//HwCy/0IA7/9ZALT/y/80ACgA9v/J/9//DgA5ADUALQARADIACwAfAOf/NgArACMACQBBAEcAGAAjAC4AWQBUAHcAAAAfACEAIAAcAPj/CADk/yQA7v89AEEAFwD5/xYA6f8aAOX/AADF/zQADwAUAOT/BQDr/yUA6P8XAOf/HADR/0AA8P8nAAgACQDt/ycAKAAHAPH/IQDz/xsACADn//n/DgADAA4A8P///8z/GgDN/yMA/f8QANj/MwACAC0ACwAOAO3/JgAZAAUACgAAAA4AIgAaAAkADwACAAAAHQATAAUABQACAAgACwAjAO////8AAA8ABQAPAPL//f8GAAsABgAGAPD/8v8GAPz/CAD6//H/6v8PAAgABgD4//3/9v8aAAgABwD1//7//v8QAAoACAD//wUA9v8QAAoABAAFAAgAAgAJAAoAAwD//w0AAgD//wcA/v8DAAoABQAFABUABAAKAAYABwAHAA8ACgAGAAwADwAMAAkAEAAJAAgADwAMAAgADgAJAAUACQAPAAUACwAHAAEABgAIAAEABAAGAP//AgAJAAAAAgAEAP7///8IAAIA//8GAAEAAQAJAAIA/v8EAAMA//8JAAEA/v8DAAMA/v8HAAMA/f8BAAUA/v8FAAMA/v8BAAcA//8DAAMA/v8BAAYA//8CAAMA/////wcAAAAAAAMAAAD//wYAAQD+/wMAAQD//wUAAQD+/wIAAgD//wQAAgD+/wEAAwD//wMAAwD+/wEAAwD//wIAAwD//wEABAAAAAEABAD//wAABAABAAAAAwAAAAAABAABAP//AwABAAAAAwACAP//AgACAAAAAwACAP//AgACAAAAAgACAAAAAQADAAAAAQACAAAAAQADAAAAAQACAAAAAAACAAEAAAACAAEAAAACAAEAAAABAAEAAAABAAEAAAABAAEAAAABAAEAAAABAAEAAAABAAEAAAAAAAAAAAAAAAAA",
388
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAAAAP//AAD//wAA//8AAAAA//8AAP//AAACAAAA+f8BAAYA///4/wIA//8AAA8A/v/V/wEAEwA9AAEBRwA2AF7/kfog/3gBwv99CDYBU/qtAUX/AP7OAfkAX/o9B38FSfwaAuT14/60BAr8CQAI/tfyIQTzAXP+egdUBBwBof7TBMT8bAWi/5EEWwBRAAAKyfxE/8b88vp6ACP+PAF4/qD8MQNM/ygCJ/2XAPD9kP5gAVT/iP9I/lEB4P8qAD0BFAGa/+7/DgB2AOP98gFm/u/+Vv5/AG8ASP9gAM//qv9w//oAcv+2/jIBHgA7/6D/oAAGAKH/lADT/wAAggC8AAYAkP9yAEcAkf8BAOD/RAAr/zUANwDt/xQAJQAkAMT/zwA/AOH/xv9zAGsANQBTAIcALAAvACIATACy/xMADADg/xcAWABvAJL/7f9VAPb/EgDt/wcA4f8kAPP/5P+h/wgACQDy//r/LgAQAMn/8/9CAOX/5v/S/9//3P8pABYAuP/s/w8AFgDt/+3/7v/w/9j/5/8GAOf/2P/2//P//v8kABMAuf/m/xoADADZ/+r/3P8KAAUAKwDe/wsA3P8VAAAADgAfAB0ACAAMAF4AGgAhAPL/MwDz/0kABAAKAPX/LwAbAAkA9v/s/+3/8/8CABAAAADm//n/BQALAAUAAQDj//n/JQAVAPX/9v/+/wIAEQABAPP/8P/1/wAABgD6/+3/7//o//j/DAD8/+b/8P8IAAkABgD4//D/8P8UAAoAAwD4/wAA+f8OAAcAAAAFAPX/9v8TAAkA8v8EAPb/9/8dAA0A7/8CAPn/+f8SAAQA8/8CAOf/+v8DAAgA9P////H//P8IAAUA8//0/wIAAQAGAAgA9//7/wAA+/8EAP//+P/+////AgACAAsA8v/+/wIABQD7/wgA9v/7/wMABAD5/wAA/P/3/wEAAQD7//7//P/1/wQA///3//r////3/wMAAwD1//r/AwD6////AgD4//n/AwD8//7/AgD4//n/AwD+//3/AQD4//n/BQD///n/AAD6//j/BAABAPj/AAD9//v/AwADAPj//v/+//z/AwAEAPj//v8BAP7/AQADAPj//f8CAP////8EAPr//P8DAAAA/v8CAPv//P8DAAEA/f8BAP3//f8DAAIA/P8AAP7//f8DAAIA/P///wAA/f8BAAIA+//+/wEA//8AAAEA+//+/wEA/////wEA/P/+/wEA///+/wAA/f/9/wEAAAD9/wAA/f/+/wEAAQD8/////v/+/wAAAQD8////////////AQD9////AAD/////AAD+////AAAAAP//AAD///////8AAP//AAD//wAA//8AAP//"
389
+ ], wA = [
390
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD+/wQA8/8ZAPr/DAD+/wMA/v8KAAQA/f8DAAMABADs//z/8v/z/8f/R/90/ob+//zAAWsDAwY3DKn9//tu93DvkwI6An4CuwJ0/BH7VPux92X0Gu7N/EX9mgfqCkkIiRMgBd4NQQGL/c0G/xBxAKELZATUA/sIHRSx+fkCyAUmBNEJIARlAdHz2AjNACcIsAW4AlECsvtJ/P/7K/tf++n8aP4W+g0FXAElAMn8nQHn/sT+Zv7N+9X2xvzM/O3+EvpqBBD7SQLd+vb/sPlw/JD72/3n+Rr+L/wS/vz6UQGg/Nf+Av5L/5X9Gv2//SP+mf3j/lf+v/2B/ZH/5P05/iL9MP9F/uf9UP4v/qv9mv7o/Xn+wP2k/8L+uP5J/tD+Dv/Y/bL+mP72/n3+pP+7/hAA+/5zAGH+Z/+u/g8Azv2y/6L+//9o/iIADP8VACz/CwCN/pb/1v4yAFP+wf+4/jsAcf5VAP3+bADa/nMA6f4sAOT+IQBd/v7/7v6aAIL+QADe/nEA0P4yAKz+CQCo/moAuf5xAN7+mAC8/jcANf9eAPX+IAA1/1kAAP9hAMz+PQD5/m0A2/4gAPr+UQDh/jQAEv9BAPH+FABN/zkASv9DADP/BABe/1IAGf8oAE3/RQAw/zIAQf8mADn/GgBE/xIAR/8hAD7/BABy/zEAKP/0/07/GwBX/z4ARf8mAFr/QQBV/zUAVP8eAFz/JABt/0EAUP8MAHz/KgBr/ycAYv8EAH3/MABl/x8Agv8bAIj/GgBv//z/ff8AAJX/IABu/+T/jv/r/4z/9/9n/77/pP8JAJD/EQCJ//r/q/8WAJ//GQCU/xYAtv8qAKr/PQCW/ysAwf8+ALb/OgC3/ygAz/8uAM7/OgDH/ygAz/8kAMz/OgC//xsA1f8qAMn/LwDN/xcA1f8oAMv/JQDR/xMAzf8bAM//HgDU/wUA2v8ZANL/EwDW/wEA1f8ZAMz/BwDX/wIA0v8SANT/BQDW/wMA0/8PANT/AADY/wIA1f8MANX/+f/a/wUA0v8IANf/+//Y/wUA0/8DANr/+f/Y/wQA1v8BANr/+f/Z/wUA1//8/9z/+v/Y/wYA2f/8/93//v/Y/wUA2v/9/93////Z/wUA3P/8/97/AgDa/wMA3v/8/97/AwDb/wIA3//9/97/BADd/wEA4f///9//BQDf/wAA4v8AAN//BQDf/wAA4/8CAN//BADh/wAA4/8DAOD/BADi////4/8DAOH/AwDk/wAA5P8FAOL/AgDl/wEA5P8FAOL/AQDl/wEA4/8EAOL/AQDj/wIA4P8DAN//AADg/wIA3v8CAOD/AADh/wEA4v8AAOP/AADm/wAA6P8AAOz/AADu/wAA",
391
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD//////f/+//7///8AAP////8BAAEA/f8AAAEAAQAFAAUA9//6/x0A2f/9/xMA3P+jAE//of9HAKP//gCj/77/Z/vi/28D9/ywDJAJIvr6AsX0Xec4BhcGzf23DZP7yfZ6C1//nwBDBIHyYgob/Tf3sQ41ANoKRA/A+E7yffAa9gD5EQUBDMwMygiqAHMAqPqhAGUB2/gE+a78H/+4APT6DwIUAA0HNwMhBfL8E/90A5n7dP9cALIC+v5C/q0AOv9kAogBHv01/+3/qAQD/ub8T/4vAOUA5P6KATv+ywEYAeT+KP6i/3gCFP6h/hr/+P83ACL/VADn/8UARQJI/4MAu/8qAlj+wf4iAPb/LgFJ/8QAUABAAI4ABf+k/3X/YgFK/ij/j/9HADoAi/+WAA0BVwC/ACL/LACe//cARv9i/xgAUgA0ACj/FgBgAIj/5P9M/7z/zv8/AKz/gv8sAEQA6/+I/yYAawDL/7T/xf8qAOv/FQCu/5n/EgAyAO3/i/9LAE4A+//R//P/FgDe/8z/u/8DADIALAAZALL/TAA8ABwAo//1/xwA/P/L/z0A6P8jAN7/7v+a/zAAwf/7/3//KQAuACwA9v8RAGYAIwBNADgAKgASAF0ADgANACEAMQDH//H/LQACAB0Ay////x0APAABAAQA2v8iAAcAEgDE/+v/FQD+/+P/DAD1/97/6v/4//X/EwD4/+7/5P8cAA0ACQDH//7/CQAXAAEA/P/5//j/CwAWAAEABQD9//n/AQAWAB0A7v/k/wAACQAmAP//9/8AAPn/8/8aAO//6/8fAOv/5v8hAP//5/8PAOf/AAAGAPn/6v8JAAYABgABAOv/1//1//L/+P8DABcA6f/8/wMACgD7/xAA3v/2//z/DADu//z/5v/5/wEA/P/6//7/7v/x/wQABgD5/wAA8v/w/wkAEQD2//j/+v8EAAcAEAD3//v/+v8CAAAACQD3//v//v/9/wUADAD2//X/AgAHAAAABwD2//T/BgAKAP7/AQD4//r/BAAIAPn/AAD3//f/BQAHAPv//v/7//n/BQAJAPj/+v/9//7/AgAGAPj/+f8BAAEAAgAFAPn/+v8BAAIAAAAEAPn/+f8CAAQA/v8BAPr/+v8CAAQA/P////v//P8CAAQA+//+//3//f8CAAUA+v/9//////8AAAQA+v/8////AAD//wIA+//8/wAAAQD+/wEA+//8/wAAAgD9/////P/9/wEAAgD8//7//f/9/wAAAgD8//3//v/+////AQD8//z/////////AAD8//3///8AAP7/AAD9//7///8AAP7////+//////8AAP7////+////////////////////",
392
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD//////v8AAP///////wAAAAAAAP7/AQABAAAABwD///X/BQAjAPL/CQDb/9D/GAAb/7sAYwCW/z0BcP/X/7T/2QDW+wH8yANCCCUJ5QT++UXmhPwhA78FuAxH+p78ifudBlAG9vmu/lAK2fdlB///cfjoCa0E7Akn9Yb/zvba+AkAHPywBGEBFwUNAL8AXAAGA20DFvmR/kz+F/06Ag/+GwHl/5EEKgJd/q0AP/ym/9n6EfxY/2H+/QFtAC4C6QBDAaMCo/20/+3/3f/p/fL9rv9V/6cBhQHuAX4AcwJYAaH/IP/P/gsApP0LAe7/sQBuAI0AAgGDAE4BzACe/5X//v+v/+f+Zf+gAOv/5QBhAOIApAANASYAuP+h/8b/HQBr/9//bACWAGEAFAB5AD0AWQDU/+D/Yf/p//D/s/+R/4QAMQBvABEAkQBfABQAJgDW/wwA8/8XALz/vf8zAFAAKwD1/zEAPwDJ/x0A7/8LAOX/FwDR//H/EQAdAO//6P8QAFEA2f8WABEAMgDy/xIA+f/s/xAALgDv////HQAvAPT/+f8iAAYAEgAFABoAGgD//w0A+f/0/xsAHgDx/9f/GAACAPH/8f8JAPf/GwALABEA7/8cAPT/CgD2//j/BQD8/+3/OgAgAAYA9f8PAN7/DgD9/9r/1//3/+3/9//1//b/8//5//f/AgAJAOf/+v8OAAMACwD9/+7/5f8eAAEA9//q//7/8P8WAP7/+//4/wIA+f8TAAIA9f/5/wcA+P8iAAgA9v/n/xoA//8gAAUABwDj/wAA9v8BAAUAFQDn/wMA7v8QABAAEQDm/wwA8f8aAAAABwDu/wcACgASAAEA7//w//f/BgARAAkA6P/3/wcADgAKAAYA4f/4/wYADgAAAPr/8P/9/xQACgAHAPn/7//9/xEAAgD+//L/8v/8/xUAAwDw//H/9f8CAAsA/v/q//L/+f8FAAYA/P/r//j///8GAAkA+//o//j/AQAIAP//+v/o//v/CAAIAPv/+P/w/wEACQAHAPj/+f/0/wIACwAFAPb/+f/4/wQACwACAPP/+f/+/wYACAD///L/+/8BAAYABQD9//P//P8FAAUAAgD7//T//f8HAAQA///7//f///8IAAMA/P/6//r/AQAIAAEA+v/6//3/AgAHAAAA+f/7/wAAAwAFAP7/+P/8/wIAAgACAP3/+f/9/wMAAwAAAPz/+v/+/wQAAgD+//z/+/8AAAQAAQD8//z//f8BAAQAAAD7//3///8BAAMA///7//3/AAACAAEA/v/7//7/AQABAAAA/v/9////AQAAAP///v/+////AAD/////////////////////////////",
393
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD////////+//////8AAAAA/v/+/wAAAQD8//3/CQAJAP3/+v8PAAcApABlABkBkwCO/i//lfqa/HQAcf/3BdkCzwJcBCMC0wMN/9/9wgI7AaECYfxV/Tf83vhn/xrt8Owx/8n7cgHABYb43QcZDh4WugNrA7P74gHu/9z/zv0t/acCiQHY/iv4qQOl/ysCE/0//XT9Sf4O//j9xfupAn394gHO+rsCXAFIAxQC9wIXBgcD2AQuAnb/9gJh/6wAVfxEAI4Bvf7oAFv/bALsAMQBe/88/joAT/4dAH39/v9LAXn/gwDI//QBdABcAA0A7f4lAMn///+9/tv/iABp/13/pP/dALv/w/8MAHv//f+y/6////7U/5AAZP+Z/8r/nQDR/5r/DwDr/xAA4v+s/3z/+P9uAOv/t/82AGcAHgCb/yQAFQBGAM7/CgD3/xoAegAaAOz/CgBHAA8Adv8/AAAABQC2/xIAAAA7ABQAKgCj/z4AAQAXAJz/JAADAAcA8f/1/2AAAQAlAPD/NgDx/1wA7v/4/wMAZADv//3/HQAkAFoA8P9FAPv/FgBIAPf/WQAHAEUACQD0/xIAQwDu/wMAwP9VALn/XwCw/yEA5f8sAPj/FgDD/1YAyv8rAOX/HQDo//j/IQAQACAAHwD9/yQAHQBAABgABQAiAAUAKAD3/wkACwAKAAMABwAJAPb/+f8GAOr/JQAHABMA6P8TAA4AGgD//woA8/8ZAP//GADu/w0A9v8SAAMABwD4/wQA5P8XAAQACgDq/wUA+/8VAAcACADs/xIAAAATAPH/+v/1//T/7f///+z/+v/y/+//9/8KAAcACgAJAPT/BAAKAAAABgAIAPL/9v8KAAMABAACAPr/9v8OAAIA+P/x//v/+f8MAPb/+P/w/wQA9f8MAPn////7/woA/v8PAAEAAgD1/xAAAQAPAP//AwD//xQABwALAAAABgADABAAAgAHAAAACAABAA8ABQAFAAMABwAEAA4ABwADAAEACQAFAAoAAwD//wAACQADAAUAAQD/////CAABAAMAAAD/////BwACAAEAAAD/////BwACAP7///8BAAAABgABAP7///8CAAAABAAAAP7///8DAAAAAwAAAP3///8DAAAAAQAAAP3//v8EAAAAAAD+//////8EAP/////+/wAA/v8EAP/////+/wEA/v8EAP///v/+/wIA//8DAP///v/+/wIA//8BAP///v/+/wMA//8BAP/////+/wMA//8AAP//AAD+/wQA//8AAP7/AQD//wIA////////AQD//wIA////////AQAAAAEAAAAAAP//AQD//wEAAAAAAP//AQAAAAEAAAAAAAAA",
394
+ "UklGRiQEAABXQVZFZm10IBAAAAABAAIAgLsAAADuAgAEABAAZGF0YQAEAAD+/wAA+v8AAPz/AAD//wAA/f8AAAEAAAD+/wAACQAAAAQAAAAZAAAAtgAAAFsBAABW/gAAH/oAAGcBAABoBwAAlAAAAO3/AAARAQAA+wIAAEoEAACe/gAAiv4AALD0AADJ8wAAkQQAAF34AABi8QAAPQAAAAH2AAD19AAADAMAAJwGAACTEAAA0AwAAJkHAACOBwAAuQEAANcDAAC6AgAAHwUAAHEFAAB0AwAAbgEAADz+AADYAQAAGAAAAJwCAADgAAAA//0AAMn+AAAT/AAAwP8AAOn9AAAJAAAAewEAAOn+AACN/wAAOv0AAO3+AADN/gAAcP8AACj/AACq/gAA+f4AAML9AACa/wAA/f4AAN7/AABo/wAA6/4AAE//AAAC/wAAEQAAAHX/AAB0AAAA5f8AAEwAAAB3AAAA5/8AAMIAAABCAAAAzgAAAE8AAAB3AAAAKAAAADMAAACqAAAALwAAAK4AAAASAAAAVgAAACgAAAAtAAAATAAAAP3/AAA7AAAA2/8AACQAAADw/wAALQAAADEAAAAlAAAAbAAAADMAAABUAAAAEAAAACgAAAD1/wAA9v8AAPr/AADu/wAALgAAABIAAABUAAAARAAAAGUAAABGAAAAOAAAAGAAAAAuAAAARQAAACEAAAAfAAAAAAAAAAkAAAAQAAAAAwAAABIAAADs/wAAEAAAAAYAAAASAAAAIgAAABEAAAADAAAABAAAAA8AAAD4/wAAHQAAAAsAAAAIAAAADgAAAP//AAAcAAAADwAAAAYAAAASAAAAFwAAAAMAAAAYAAAAEgAAAPr/AAAQAAAADQAAAAoAAAD3/wAABgAAAPb/AADf/wAA/v8AAPL/AAD6/wAAFAAAAAQAAAAEAAAAGwAAAAEAAAAMAAAAIAAAAAIAAAAdAAAAGAAAAAIAAAAcAAAAEgAAAAcAAAAeAAAADwAAAAQAAAAeAAAABAAAAAYAAAAZAAAAAQAAAA4AAAATAAAA/v8AAAoAAAAOAAAA+/8AAAsAAAAJAAAA+f8AAAsAAAABAAAA+f8AAAoAAAD9/wAA+v8AAAcAAAD5/wAA+v8AAAUAAAD3/wAA/f8AAAQAAAD2/wAAAAAAAAEAAAD3/wAAAgAAAAAAAAD4/wAAAwAAAP7/AAD6/wAABAAAAP3/AAD8/wAABAAAAPv/AAD+/wAAAwAAAPv/AAD//wAAAQAAAPv/AAAAAAAAAAAAAPv/AAACAAAA//8AAPz/AAACAAAA/v8AAP3/AAACAAAA/f8AAP7/AAABAAAA/f8AAP//AAABAAAA/f8AAAAAAAAAAAAA/v8AAAEAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
395
+ ], q = {
396
+ AMBISONIC: "ambisonic",
397
+ BYPASS: "bypass",
398
+ OFF: "off"
399
+ }, cA = [2, 3];
400
+ function y(A, t) {
401
+ this._context = s.isAudioContext(A) ? A : s.throw("HOARenderer: Invalid BaseAudioContext."), this._config = {
402
+ ambisonicOrder: 3,
403
+ renderingMode: q.AMBISONIC
404
+ }, t && t.ambisonicOrder && (cA.includes(t.ambisonicOrder) ? this._config.ambisonicOrder = t.ambisonicOrder : s.log(
405
+ "HOARenderer: Invalid ambisonic order. (got " + t.ambisonicOrder + ") Fallbacks to 3rd-order ambisonic."
406
+ )), this._config.numberOfChannels = (this._config.ambisonicOrder + 1) * (this._config.ambisonicOrder + 1), this._config.numberOfStereoChannels = Math.ceil(this._config.numberOfChannels / 2), t && t.hrirPathList && (Array.isArray(t.hrirPathList) && t.hrirPathList.length === this._config.numberOfStereoChannels ? this._config.pathList = t.hrirPathList : s.throw(
407
+ "HOARenderer: Invalid HRIR URLs. It must be an array with " + this._config.numberOfStereoChannels + " URLs to HRIR files. (got " + t.hrirPathList + ")"
408
+ )), t && t.renderingMode && (Object.values(q).includes(t.renderingMode) ? this._config.renderingMode = t.renderingMode : s.log(
409
+ "HOARenderer: Invalid rendering mode. (got " + t.renderingMode + ') Fallbacks to "ambisonic".'
410
+ )), this._buildAudioGraph(), this._isRendererReady = !1;
411
+ }
412
+ y.prototype._buildAudioGraph = function() {
413
+ this.input = this._context.createGain(), this.output = this._context.createGain(), this._bypass = this._context.createGain(), this._hoaRotator = new O(this._context, this._config.ambisonicOrder), this._hoaConvolver = new J(this._context, this._config.ambisonicOrder), this.input.connect(this._hoaRotator.input), this.input.connect(this._bypass), this._hoaRotator.output.connect(this._hoaConvolver.input), this._hoaConvolver.output.connect(this.output), this.input.channelCount = this._config.numberOfChannels, this.input.channelCountMode = "explicit", this.input.channelInterpretation = "discrete";
414
+ }, y.prototype._initializeCallback = function(A, t) {
415
+ let e;
416
+ this._config.pathList ? e = new h(this._context, this._config.pathList, { dataType: "url" }) : e = this._config.ambisonicOrder === 2 ? new h(this._context, wA) : new h(this._context, gA), e.load().then(
417
+ (function(n) {
418
+ this._hoaConvolver.setHRIRBufferList(n), this.setRenderingMode(this._config.renderingMode), this._isRendererReady = !0, s.log("HOARenderer: HRIRs loaded successfully. Ready."), A();
419
+ }).bind(this),
420
+ function() {
421
+ const n = "HOARenderer: HRIR loading/decoding failed.";
422
+ t(n), s.throw(n);
423
+ }
424
+ );
425
+ }, y.prototype.initialize = function() {
426
+ return s.log(
427
+ "HOARenderer: Initializing... (mode: " + this._config.renderingMode + ", ambisonic order: " + this._config.ambisonicOrder + ")"
428
+ ), new Promise(this._initializeCallback.bind(this));
429
+ }, y.prototype.setRotationMatrix3 = function(A) {
430
+ this._isRendererReady && this._hoaRotator.setRotationMatrix3(A);
431
+ }, y.prototype.setRotationMatrix4 = function(A) {
432
+ this._isRendererReady && this._hoaRotator.setRotationMatrix4(A);
433
+ }, y.prototype.setRenderingMode = function(A) {
434
+ if (A !== this._config.renderingMode) {
435
+ switch (A) {
436
+ case q.AMBISONIC:
437
+ this._hoaConvolver.enable(), this._bypass.disconnect();
438
+ break;
439
+ case q.BYPASS:
440
+ this._hoaConvolver.disable(), this._bypass.connect(this.output);
441
+ break;
442
+ case q.OFF:
443
+ this._hoaConvolver.disable(), this._bypass.disconnect();
444
+ break;
445
+ default:
446
+ s.log(
447
+ 'HOARenderer: Rendering mode "' + A + '" is not supported.'
448
+ );
449
+ return;
450
+ }
451
+ this._config.renderingMode = A, s.log("HOARenderer: Rendering mode changed. (" + A + ")");
452
+ }
453
+ };
454
+ const $ = {};
455
+ $.getBrowserInfo = function() {
456
+ const A = navigator.userAgent;
457
+ let t = A.match(
458
+ /(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*([\d\.]+)/i
459
+ ) || [], e;
460
+ if (/trident/i.test(t[1]))
461
+ return e = /\brv[ :]+(\d+)/g.exec(A) || [], { name: "IE", version: e[1] || "" };
462
+ if (t[1] === "Chrome" && (e = A.match(/\bOPR|Edge\/(\d+)/), e != null))
463
+ return { name: "Opera", version: e[1] };
464
+ t = t[2] ? [t[1], t[2]] : [navigator.appName, navigator.appVersion, "-?"], (e = A.match(/version\/([\d.]+)/i)) != null && t.splice(1, 1, e[1]);
465
+ let n = A.match(/android|ipad|iphone/i);
466
+ return n || (n = A.match(/cros|linux|mac os x|windows/i)), {
467
+ name: t[0],
468
+ version: t[1],
469
+ platform: n ? n[0] : "unknown"
470
+ };
471
+ }, $.patchSafari = function() {
472
+ window.webkitAudioContext && window.webkitOfflineAudioContext && (window.AudioContext = window.webkitAudioContext, window.OfflineAudioContext = window.webkitOfflineAudioContext);
473
+ };
474
+ const vA = "1.3.0", a = {};
475
+ return a.browserInfo = $.getBrowserInfo(), a.createBufferList = function(A, t, e) {
476
+ return new h(A, t, e || { dataType: "url" }).load();
477
+ }, a.mergeBufferListByChannel = s.mergeBufferListByChannel, a.splitBufferbyChannel = s.splitBufferbyChannel, a.createFOAConvolver = function(A, t) {
478
+ return new S(A, t);
479
+ }, a.createFOARouter = function(A, t) {
480
+ return new W(A, t);
481
+ }, a.createFOARotator = function(A) {
482
+ return new Z(A);
483
+ }, a.createHOARotator = function(A, t) {
484
+ return new O(A, t);
485
+ }, a.createHOAConvolver = function(A, t, e) {
486
+ return new J(A, t, e);
487
+ }, a.createFOARenderer = function(A, t) {
488
+ return new c(A, t);
489
+ }, a.createHOARenderer = function(A, t) {
490
+ return new y(A, t);
491
+ }, (function() {
492
+ s.log(`Version ${vA} (running ${a.browserInfo.name} ${a.browserInfo.version} on ${a.browserInfo.platform})`), a.browserInfo.name.toLowerCase() === "safari" && ($.patchSafari(), s.log(`${a.browserInfo.name} detected. Polyfill applied.`));
493
+ })(), a;
494
+ })();