PageSourceSearch

https://stridenavigation.com/chunk-LGFPPBCT.js

js stridenavigation.com collected 2026-09-24 14:53:56 UTC 385,845 bytes, 6,274 lines download raw bytes

1import {
2  buildAdminBreadcrumbs
3} from "./chunk-B57R6CYU.js";
4import {
5  RigaDateTimeService
6} from "./chunk-RAL4KSWL.js";
7import {
8  BreadcrumbNavigationComponent
9} from "./chunk-C5APCOMN.js";
10import {
11  addCircleOutline,
12  addIcons,
13  alertCircleOutline,
14  analyticsOutline,
15  archiveOutline,
16  bluetoothOutline,
17  bugOutline,
18  businessOutline,
19  checkmarkCircleOutline,
20  checkmarkOutline,
21  chevronDownOutline,
22  chevronUpOutline,
23  closeCircleOutline,
24  closeOutline,
25  closeSharp,
26  codeSlashOutline,
27  documentOutline,
28  documentTextOutline,
29  downloadOutline,
30  ellipsisVerticalOutline,
31  eyeOutline,
32  filterOutline,
33  imageOutline,
34  locationOutline,
35  navigateOutline,
36  phonePortraitOutline,
37  pulseOutline,
38  radioOutline,
39  refreshOutline,
40  searchCircleOutline,
41  searchOutline,
42  settingsOutline,
43  syncOutline,
44  timeOutline,
45  trashOutline
46} from "./chunk-5VZGNM5O.js";
47import {
48  BUG_REPORT_CATEGORIES,
49  BUG_REPORT_STATUSES,
50  BugReportService
51} from "./chunk-NM2GQ3VU.js";
52import "./chunk-4Y5EMHGE.js";
53import "./chunk-GEY5NERW.js";
54import "./chunk-CZMIP4ZQ.js";
55import "./chunk-ODH7QDZO.js";
56import "./chunk-4UEQF233.js";
57import "./chunk-K52XM66R.js";
58import "./chunk-PYYASMRY.js";
59import {
60  UserCampusService
61} from "./chunk-63DLEHZF.js";
62import "./chunk-PFRFKH6U.js";
63import "./chunk-UZKEIBGO.js";
64import "./chunk-2E4THSOE.js";
65import "./chunk-JISY7VJD.js";
66import "./chunk-KP4RHBP7.js";
67import "./chunk-QI7JV4VS.js";
68import "./chunk-OTQ6GTAJ.js";
69import "./chunk-RLZ522BW.js";
70import "./chunk-RLJCY5HS.js";
71import {
72  TranslateModule,
73  TranslatePipe,
74  TranslateService
75} from "./chunk-O5XYYQCR.js";
76import "./chunk-QGEJYSW7.js";
77import {
78  ApiUrlService
79} from "./chunk-MAIAEXGG.js";
80import "./chunk-L4O6SE3A.js";
81import {
82  AlertController,
83  IonBadge,
84  IonButton,
85  IonCard,
86  IonCardContent,
87  IonCardHeader,
88  IonContent,
89  IonIcon,
90  IonList,
91  IonSelect,
92  IonSelectOption,
93  IonSpinner,
94  IonicModule,
95  LoadingController,
96  SelectValueAccessorDirective,
97  ToastController
98} from "./chunk-INK5THDW.js";
99import "./chunk-GMPIA5L4.js";
100import {
101  ActivatedRoute,
102  CommonModule,
103  Component,
104  FormsModule,
105  NgClass,
106  NgControlStatus,
107  NgModel,
108  Subject,
109  UpperCasePipe,
110  finalize,
111  setClassMetadata,
112  takeUntil,
113  ɵsetClassDebugInfo,
114  ɵɵadvance,
115  ɵɵattribute,
116  ɵɵclassProp,
117  ɵɵconditional,
118  ɵɵdefineComponent,
119  ɵɵdirectiveInject,
120  ɵɵelement,
121  ɵɵelementEnd,
122  ɵɵelementStart,
123  ɵɵgetCurrentView,
124  ɵɵlistener,
125  ɵɵnextContext,
126  ɵɵpipe,
127  ɵɵpipeBind1,
128  ɵɵpipeBind2,
129  ɵɵproperty,
130  ɵɵpureFunction2,
131  ɵɵrepeater,
132  ɵɵrepeaterCreate,
133  ɵɵresetView,
134  ɵɵrestoreView,
135  ɵɵsanitizeUrl,
136  ɵɵtemplate,
137  ɵɵtext,
138  ɵɵtextInterpolate,
139  ɵɵtextInterpolate1,
140  ɵɵtextInterpolate2,
141  ɵɵtextInterpolate3,
142  ɵɵtextInterpolate6,
143  ɵɵtwoWayBindingSet,
144  ɵɵtwoWayListener,
145  ɵɵtwoWayProperty
146} from "./chunk-UQ6LLOJ6.js";
147import "./chunk-BD3NMR2S.js";
148import "./chunk-6HPUB4U6.js";
149import "./chunk-JTG2GCS6.js";
150import "./chunk-WGFJL45C.js";
151import "./chunk-7WVISTDL.js";
152import "./chunk-2S57T3GS.js";
153import "./chunk-R4QHACMO.js";
154import "./chunk-4MEJEBWM.js";
155import "./chunk-RIBVNXHQ.js";
156import "./chunk-Z42OVMMO.js";
157import "./chunk-O5S42IXR.js";
158import "./chunk-QBR2RTFG.js";
159import "./chunk-MIOLVGSM.js";
160import "./chunk-V3YFOG6Q.js";
161import "./chunk-LPMBLWVS.js";
162import "./chunk-5LKHIIQE.js";
163import "./chunk-ITE2OHLM.js";
164import "./chunk-C46CB72A.js";
165import "./chunk-SRPSML5O.js";
166import "./chunk-NRSVX4KN.js";
167import "./chunk-T4GYAOTA.js";
168import "./chunk-2VHYZHLL.js";
169import "./chunk-S6LHOZ5A.js";
170import "./chunk-Y6HZOH3Q.js";
171import "./chunk-TWQHADEW.js";
172import "./chunk-3J4L7S6G.js";
173import "./chunk-IL42VKT6.js";
174import "./chunk-LONO5O5R.js";
175import "./chunk-KFBF5L4X.js";
176import "./chunk-PWC4K6CW.js";
177import "./chunk-R6JLIESI.js";
178import "./chunk-UG6K57PI.js";
179import "./chunk-UR6VIRNL.js";
180import "./chunk-OJO5RD3M.js";
181import {
182  __async,
183  __commonJS,
184  __require,
185  __toESM
186} from "./chunk-CO64IJQE.js";
187
vendor: 162,773 bytes, lines 188-3106
188// node_modules/jszip/dist/jszip.min.js
189var require_jszip_min = __commonJS({
190  "node_modules/jszip/dist/jszip.min.js"(exports, module) {
191    "use strict";
192    !function(e) {
193      if ("object" == typeof exports && "undefined" != typeof module) module.exports = e();
194      else if ("function" == typeof define && define.amd) define([], e);
195      else {
196        ("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this).JSZip = e();
197      }
198    }(function() {
199      return function s(a, o, h) {
200        function u(r, e2) {
201          if (!o[r]) {
202            if (!a[r]) {
203              var t = "function" == typeof __require && __require;
204              if (!e2 && t) return t(r, true);
205              if (l) return l(r, true);
206              var n = new Error("Cannot find module '" + r + "'");
207              throw n.code = "MODULE_NOT_FOUND", n;
208            }
209            var i = o[r] = {
210              exports: {}
211            };
212            a[r][0].call(i.exports, function(e3) {
213              var t2 = a[r][1][e3];
214              return u(t2 || e3);
215            }, i, i.exports, s, a, o, h);
216          }
217          return o[r].exports;
218        }
219        for (var l = "function" == typeof __require && __require, e = 0; e < h.length; e++) u(h[e]);
220        return u;
221      }({
222        1: [function(e, t, r) {
223          "use strict";
224          var d = e("./utils"), c = e("./support"), p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
225          r.encode = function(e2) {
226            for (var t2, r2, n, i, s, a, o, h = [], u = 0, l = e2.length, f = l, c2 = "string" !== d.getTypeOf(e2); u < e2.length; ) f = l - u, n = c2 ? (t2 = e2[u++], r2 = u < l ? e2[u++] : 0, u < l ? e2[u++] : 0) : (t2 = e2.charCodeAt(u++), r2 = u < l ? e2.charCodeAt(u++) : 0, u < l ? e2.charCodeAt(u++) : 0), i = t2 >> 2, s = (3 & t2) << 4 | r2 >> 4, a = 1 < f ? (15 & r2) << 2 | n >> 6 : 64, o = 2 < f ? 63 & n : 64, h.push(p.charAt(i) + p.charAt(s) + p.charAt(a) + p.charAt(o));
227            return h.join("");
228          }, r.decode = function(e2) {
229            var t2, r2, n, i, s, a, o = 0, h = 0, u = "data:";
230            if (e2.substr(0, u.length) === u) throw new Error("Invalid base64 input, it looks like a data url.");
231            var l, f = 3 * (e2 = e2.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4;
232            if (e2.charAt(e2.length - 1) === p.charAt(64) && f--, e2.charAt(e2.length - 2) === p.charAt(64) && f--, f % 1 != 0) throw new Error("Invalid base64 input, bad content length.");
233            for (l = c.uint8array ? new Uint8Array(0 | f) : new Array(0 | f); o < e2.length; ) t2 = p.indexOf(e2.charAt(o++)) << 2 | (i = p.indexOf(e2.charAt(o++))) >> 4, r2 = (15 & i) << 4 | (s = p.indexOf(e2.charAt(o++))) >> 2, n = (3 & s) << 6 | (a = p.indexOf(e2.charAt(o++))), l[h++] = t2, 64 !== s && (l[h++] = r2), 64 !== a && (l[h++] = n);
234            return l;
235          };
236        }, {
237          "./support": 30,
238          "./utils": 32
239        }],
240        2: [function(e, t, r) {
241          "use strict";
242          var n = e("./external"), i = e("./stream/DataWorker"), s = e("./stream/Crc32Probe"), a = e("./stream/DataLengthProbe");
243          function o(e2, t2, r2, n2, i2) {
244            this.compressedSize = e2, this.uncompressedSize = t2, this.crc32 = r2, this.compression = n2, this.compressedContent = i2;
245          }
246          o.prototype = {
247            getContentWorker: function() {
248              var e2 = new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a("data_length")), t2 = this;
249              return e2.on("end", function() {
250                if (this.streamInfo.data_length !== t2.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");
251              }), e2;
252            },
253            getCompressedWorker: function() {
254              return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);
255            }
256          }, o.createWorkerFrom = function(e2, t2, r2) {
257            return e2.pipe(new s()).pipe(new a("uncompressedSize")).pipe(t2.compressWorker(r2)).pipe(new a("compressedSize")).withStreamInfo("compression", t2);
258          }, t.exports = o;
259        }, {
260          "./external": 6,
261          "./stream/Crc32Probe": 25,
262          "./stream/DataLengthProbe": 26,
263          "./stream/DataWorker": 27
264        }],
265        3: [function(e, t, r) {
266          "use strict";
267          var n = e("./stream/GenericWorker");
268          r.STORE = {
269            magic: "\0\0",
270            compressWorker: function() {
271              return new n("STORE compression");
272            },
273            uncompressWorker: function() {
274              return new n("STORE decompression");
275            }
276          }, r.DEFLATE = e("./flate");
277        }, {
278          "./flate": 7,
279          "./stream/GenericWorker": 28
280        }],
281        4: [function(e, t, r) {
282          "use strict";
283          var n = e("./utils");
284          var o = function() {
285            for (var e2, t2 = [], r2 = 0; r2 < 256; r2++) {
286              e2 = r2;
287              for (var n2 = 0; n2 < 8; n2++) e2 = 1 & e2 ? 3988292384 ^ e2 >>> 1 : e2 >>> 1;
288              t2[r2] = e2;
289            }
290            return t2;
291          }();
292          t.exports = function(e2, t2) {
293            return void 0 !== e2 && e2.length ? "string" !== n.getTypeOf(e2) ? function(e3, t3, r2, n2) {
294              var i = o, s = n2 + r2;
295              e3 ^= -1;
296              for (var a = n2; a < s; a++) e3 = e3 >>> 8 ^ i[255 & (e3 ^ t3[a])];
297              return -1 ^ e3;
298            }(0 | t2, e2, e2.length, 0) : function(e3, t3, r2, n2) {
299              var i = o, s = n2 + r2;
300              e3 ^= -1;
301              for (var a = n2; a < s; a++) e3 = e3 >>> 8 ^ i[255 & (e3 ^ t3.charCodeAt(a))];
302              return -1 ^ e3;
303            }(0 | t2, e2, e2.length, 0) : 0;
304          };
305        }, {
306          "./utils": 32
307        }],
308        5: [function(e, t, r) {
309          "use strict";
310          r.base64 = false, r.binary = false, r.dir = false, r.createFolders = true, r.date = null, r.compression = null, r.compressionOptions = null, r.comment = null, r.unixPermissions = null, r.dosPermissions = null;
311        }, {}],
312        6: [function(e, t, r) {
313          "use strict";
314          var n = null;
315          n = "undefined" != typeof Promise ? Promise : e("lie"), t.exports = {
316            Promise: n
317          };
318        }, {
319          lie: 37
320        }],
321        7: [function(e, t, r) {
322          "use strict";
323          var n = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array && "undefined" != typeof Uint32Array, i = e("pako"), s = e("./utils"), a = e("./stream/GenericWorker"), o = n ? "uint8array" : "array";
324          function h(e2, t2) {
325            a.call(this, "FlateWorker/" + e2), this._pako = null, this._pakoAction = e2, this._pakoOptions = t2, this.meta = {};
326          }
327          r.magic = "\b\0", s.inherits(h, a), h.prototype.processChunk = function(e2) {
328            this.meta = e2.meta, null === this._pako && this._createPako(), this._pako.push(s.transformTo(o, e2.data), false);
329          }, h.prototype.flush = function() {
330            a.prototype.flush.call(this), null === this._pako && this._createPako(), this._pako.push([], true);
331          }, h.prototype.cleanUp = function() {
332            a.prototype.cleanUp.call(this), this._pako = null;
333          }, h.prototype._createPako = function() {
334            this._pako = new i[this._pakoAction]({
335              raw: true,
336              level: this._pakoOptions.level || -1
337            });
338            var t2 = this;
339            this._pako.onData = function(e2) {
340              t2.push({
341                data: e2,
342                meta: t2.meta
343              });
344            };
345          }, r.compressWorker = function(e2) {
346            return new h("Deflate", e2);
347          }, r.uncompressWorker = function() {
348            return new h("Inflate", {});
349          };
350        }, {
351          "./stream/GenericWorker": 28,
352          "./utils": 32,
353          pako: 38
354        }],
355        8: [function(e, t, r) {
356          "use strict";
357          function A(e2, t2) {
358            var r2, n2 = "";
359            for (r2 = 0; r2 < t2; r2++) n2 += String.fromCharCode(255 & e2), e2 >>>= 8;
360            return n2;
361          }
362          function n(e2, t2, r2, n2, i2, s2) {
363            var a, o, h = e2.file, u = e2.compression, l = s2 !== O.utf8encode, f = I.transformTo("string", s2(h.name)), c = I.transformTo("string", O.utf8encode(h.name)), d = h.comment, p = I.transformTo("string", s2(d)), m = I.transformTo("string", O.utf8encode(d)), _ = c.length !== h.name.length, g = m.length !== d.length, b = "", v = "", y = "", w = h.dir, k = h.date, x = {
364              crc32: 0,
365              compressedSize: 0,
366              uncompressedSize: 0
367            };
368            t2 && !r2 || (x.crc32 = e2.crc32, x.compressedSize = e2.compressedSize, x.uncompressedSize = e2.uncompressedSize);
369            var S = 0;
370            t2 && (S |= 8), l || !_ && !g || (S |= 2048);
371            var z = 0, C = 0;
372            w && (z |= 16), "UNIX" === i2 ? (C = 798, z |= function(e3, t3) {
373              var r3 = e3;
374              return e3 || (r3 = t3 ? 16893 : 33204), (65535 & r3) << 16;
375            }(h.unixPermissions, w)) : (C = 20, z |= function(e3) {
376              return 63 & (e3 || 0);
377            }(h.dosPermissions)), a = k.getUTCHours(), a <<= 6, a |= k.getUTCMinutes(), a <<= 5, a |= k.getUTCSeconds() / 2, o = k.getUTCFullYear() - 1980, o <<= 4, o |= k.getUTCMonth() + 1, o <<= 5, o |= k.getUTCDate(), _ && (v = A(1, 1) + A(B(f), 4) + c, b += "up" + A(v.length, 2) + v), g && (y = A(1, 1) + A(B(p), 4) + m, b += "uc" + A(y.length, 2) + y);
378            var E = "";
379            return E += "\n\0", E += A(S, 2), E += u.magic, E += A(a, 2), E += A(o, 2), E += A(x.crc32, 4), E += A(x.compressedSize, 4), E += A(x.uncompressedSize, 4), E += A(f.length, 2), E += A(b.length, 2), {
380              fileRecord: R.LOCAL_FILE_HEADER + E + f + b,
381              dirRecord: R.CENTRAL_FILE_HEADER + A(C, 2) + E + A(p.length, 2) + "\0\0\0\0" + A(z, 4) + A(n2, 4) + f + b + p
382            };
383          }
384          var I = e("../utils"), i = e("../stream/GenericWorker"), O = e("../utf8"), B = e("../crc32"), R = e("../signature");
385          function s(e2, t2, r2, n2) {
386            i.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = t2, this.zipPlatform = r2, this.encodeFileName = n2, this.streamFiles = e2, this.accumulate = false, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];
387          }
388          I.inherits(s, i), s.prototype.push = function(e2) {
389            var t2 = e2.meta.percent || 0, r2 = this.entriesCount, n2 = this._sources.length;
390            this.accumulate ? this.contentBuffer.push(e2) : (this.bytesWritten += e2.data.length, i.prototype.push.call(this, {
391              data: e2.data,
392              meta: {
393                currentFile: this.currentFile,
394                percent: r2 ? (t2 + 100 * (r2 - n2 - 1)) / r2 : 100
395              }
396            }));
397          }, s.prototype.openedSource = function(e2) {
398            this.currentSourceOffset = this.bytesWritten, this.currentFile = e2.file.name;
399            var t2 = this.streamFiles && !e2.file.dir;
400            if (t2) {
401              var r2 = n(e2, t2, false, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
402              this.push({
403                data: r2.fileRecord,
404                meta: {
405                  percent: 0
406                }
407              });
408            } else this.accumulate = true;
409          }, s.prototype.closedSource = function(e2) {
410            this.accumulate = false;
411            var t2 = this.streamFiles && !e2.file.dir, r2 = n(e2, t2, true, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
412            if (this.dirRecords.push(r2.dirRecord), t2) this.push({
413              data: function(e3) {
414                return R.DATA_DESCRIPTOR + A(e3.crc32, 4) + A(e3.compressedSize, 4) + A(e3.uncompressedSize, 4);
415              }(e2),
416              meta: {
417                percent: 100
418              }
419            });
420            else for (this.push({
421              data: r2.fileRecord,
422              meta: {
423                percent: 0
424              }
425            }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());
426            this.currentFile = null;
427          }, s.prototype.flush = function() {
428            for (var e2 = this.bytesWritten, t2 = 0; t2 < this.dirRecords.length; t2++) this.push({
429              data: this.dirRecords[t2],
430              meta: {
431                percent: 100
432              }
433            });
434            var r2 = this.bytesWritten - e2, n2 = function(e3, t3, r3, n3, i2) {
435              var s2 = I.transformTo("string", i2(n3));
436              return R.CENTRAL_DIRECTORY_END + "\0\0\0\0" + A(e3, 2) + A(e3, 2) + A(t3, 4) + A(r3, 4) + A(s2.length, 2) + s2;
437            }(this.dirRecords.length, r2, e2, this.zipComment, this.encodeFileName);
438            this.push({
439              data: n2,
440              meta: {
441                percent: 100
442              }
443            });
444          }, s.prototype.prepareNextSource = function() {
445            this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();
446          }, s.prototype.registerPrevious = function(e2) {
447            this._sources.push(e2);
448            var t2 = this;
449            return e2.on("data", function(e3) {
450              t2.processChunk(e3);
451            }), e2.on("end", function() {
452              t2.closedSource(t2.previous.streamInfo), t2._sources.length ? t2.prepareNextSource() : t2.end();
453            }), e2.on("error", function(e3) {
454              t2.error(e3);
455            }), this;
456          }, s.prototype.resume = function() {
457            return !!i.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), true) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), true));
458          }, s.prototype.error = function(e2) {
459            var t2 = this._sources;
460            if (!i.prototype.error.call(this, e2)) return false;
461            for (var r2 = 0; r2 < t2.length; r2++) try {
462              t2[r2].error(e2);
463            } catch (e3) {
464            }
465            return true;
466          }, s.prototype.lock = function() {
467            i.prototype.lock.call(this);
468            for (var e2 = this._sources, t2 = 0; t2 < e2.length; t2++) e2[t2].lock();
469          }, t.exports = s;
470        }, {
471          "../crc32": 4,
472          "../signature": 23,
473          "../stream/GenericWorker": 28,
474          "../utf8": 31,
475          "../utils": 32
476        }],
477        9: [function(e, t, r) {
478          "use strict";
479          var u = e("../compressions"), n = e("./ZipFileWorker");
480          r.generateWorker = function(e2, a, t2) {
481            var o = new n(a.streamFiles, t2, a.platform, a.encodeFileName), h = 0;
482            try {
483              e2.forEach(function(e3, t3) {
484                h++;
485                var r2 = function(e4, t4) {
486                  var r3 = e4 || t4, n3 = u[r3];
487                  if (!n3) throw new Error(r3 + " is not a valid compression method !");
488                  return n3;
489                }(t3.options.compression, a.compression), n2 = t3.options.compressionOptions || a.compressionOptions || {}, i = t3.dir, s = t3.date;
490                t3._compressWorker(r2, n2).withStreamInfo("file", {
491                  name: e3,
492                  dir: i,
493                  date: s,
494                  comment: t3.comment || "",
495                  unixPermissions: t3.unixPermissions,
496                  dosPermissions: t3.dosPermissions
497                }).pipe(o);
498              }), o.entriesCount = h;
499            } catch (e3) {
500              o.error(e3);
501            }
502            return o;
503          };
504        }, {
505          "../compressions": 3,
506          "./ZipFileWorker": 8
507        }],
508        10: [function(e, t, r) {
509          "use strict";
510          function n() {
511            if (!(this instanceof n)) return new n();
512            if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
513            this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = "", this.clone = function() {
514              var e2 = new n();
515              for (var t2 in this) "function" != typeof this[t2] && (e2[t2] = this[t2]);
516              return e2;
517            };
518          }
519          (n.prototype = e("./object")).loadAsync = e("./load"), n.support = e("./support"), n.defaults = e("./defaults"), n.version = "3.10.1", n.loadAsync = function(e2, t2) {
520            return new n().loadAsync(e2, t2);
521          }, n.external = e("./external"), t.exports = n;
522        }, {
523          "./defaults": 5,
524          "./external": 6,
525          "./load": 11,
526          "./object": 15,
527          "./support": 30
528        }],
529        11: [function(e, t, r) {
530          "use strict";
531          var u = e("./utils"), i = e("./external"), n = e("./utf8"), s = e("./zipEntries"), a = e("./stream/Crc32Probe"), l = e("./nodejsUtils");
532          function f(n2) {
533            return new i.Promise(function(e2, t2) {
534              var r2 = n2.decompressed.getContentWorker().pipe(new a());
535              r2.on("error", function(e3) {
536                t2(e3);
537              }).on("end", function() {
538                r2.streamInfo.crc32 !== n2.decompressed.crc32 ? t2(new Error("Corrupted zip : CRC32 mismatch")) : e2();
539              }).resume();
540            });
541          }
542          t.exports = function(e2, o) {
543            var h = this;
544            return o = u.extend(o || {}, {
545              base64: false,
546              checkCRC32: false,
547              optimizedBinaryString: false,
548              createFolders: false,
549              decodeFileName: n.utf8decode
550            }), l.isNode && l.isStream(e2) ? i.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : u.prepareContent("the loaded zip file", e2, true, o.optimizedBinaryString, o.base64).then(function(e3) {
551              var t2 = new s(o);
552              return t2.load(e3), t2;
553            }).then(function(e3) {
554              var t2 = [i.Promise.resolve(e3)], r2 = e3.files;
555              if (o.checkCRC32) for (var n2 = 0; n2 < r2.length; n2++) t2.push(f(r2[n2]));
556              return i.Promise.all(t2);
557            }).then(function(e3) {
558              for (var t2 = e3.shift(), r2 = t2.files, n2 = 0; n2 < r2.length; n2++) {
559                var i2 = r2[n2], s2 = i2.fileNameStr, a2 = u.resolve(i2.fileNameStr);
560                h.file(a2, i2.decompressed, {
561                  binary: true,
562                  optimizedBinaryString: true,
563                  date: i2.date,
564                  dir: i2.dir,
565                  comment: i2.fileCommentStr.length ? i2.fileCommentStr : null,
566                  unixPermissions: i2.unixPermissions,
567                  dosPermissions: i2.dosPermissions,
568                  createFolders: o.createFolders
569                }), i2.dir || (h.file(a2).unsafeOriginalName = s2);
570              }
571              return t2.zipComment.length && (h.comment = t2.zipComment), h;
572            });
573          };
574        }, {
575          "./external": 6,
576          "./nodejsUtils": 14,
577          "./stream/Crc32Probe": 25,
578          "./utf8": 31,
579          "./utils": 32,
580          "./zipEntries": 33
581        }],
582        12: [function(e, t, r) {
583          "use strict";
584          var n = e("../utils"), i = e("../stream/GenericWorker");
585          function s(e2, t2) {
586            i.call(this, "Nodejs stream input adapter for " + e2), this._upstreamEnded = false, this._bindStream(t2);
587          }
588          n.inherits(s, i), s.prototype._bindStream = function(e2) {
589            var t2 = this;
590            (this._stream = e2).pause(), e2.on("data", function(e3) {
591              t2.push({
592                data: e3,
593                meta: {
594                  percent: 0
595                }
596              });
597            }).on("error", function(e3) {
598              t2.isPaused ? this.generatedError = e3 : t2.error(e3);
599            }).on("end", function() {
600              t2.isPaused ? t2._upstreamEnded = true : t2.end();
601            });
602          }, s.prototype.pause = function() {
603            return !!i.prototype.pause.call(this) && (this._stream.pause(), true);
604          }, s.prototype.resume = function() {
605            return !!i.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), true);
606          }, t.exports = s;
607        }, {
608          "../stream/GenericWorker": 28,
609          "../utils": 32
610        }],
611        13: [function(e, t, r) {
612          "use strict";
613          var i = e("readable-stream").Readable;
614          function n(e2, t2, r2) {
615            i.call(this, t2), this._helper = e2;
616            var n2 = this;
617            e2.on("data", function(e3, t3) {
618              n2.push(e3) || n2._helper.pause(), r2 && r2(t3);
619            }).on("error", function(e3) {
620              n2.emit("error", e3);
621            }).on("end", function() {
622              n2.push(null);
623            });
624          }
625          e("../utils").inherits(n, i), n.prototype._read = function() {
626            this._helper.resume();
627          }, t.exports = n;
628        }, {
629          "../utils": 32,
630          "readable-stream": 16
631        }],
632        14: [function(e, t, r) {
633          "use strict";
634          t.exports = {
635            isNode: "undefined" != typeof Buffer,
636            newBufferFrom: function(e2, t2) {
637              if (Buffer.from && Buffer.from !== Uint8Array.from) return Buffer.from(e2, t2);
638              if ("number" == typeof e2) throw new Error('The "data" argument must not be a number');
639              return new Buffer(e2, t2);
640            },
641            allocBuffer: function(e2) {
642              if (Buffer.alloc) return Buffer.alloc(e2);
643              var t2 = new Buffer(e2);
644              return t2.fill(0), t2;
645            },
646            isBuffer: function(e2) {
647              return Buffer.isBuffer(e2);
648            },
649            isStream: function(e2) {
650              return e2 && "function" == typeof e2.on && "function" == typeof e2.pause && "function" == typeof e2.resume;
651            }
652          };
653        }, {}],
654        15: [function(e, t, r) {
655          "use strict";
656          function s(e2, t2, r2) {
657            var n2, i2 = u.getTypeOf(t2), s2 = u.extend(r2 || {}, f);
658            s2.date = s2.date || /* @__PURE__ */ new Date(), null !== s2.compression && (s2.compression = s2.compression.toUpperCase()), "string" == typeof s2.unixPermissions && (s2.unixPermissions = parseInt(s2.unixPermissions, 8)), s2.unixPermissions && 16384 & s2.unixPermissions && (s2.dir = true), s2.dosPermissions && 16 & s2.dosPermissions && (s2.dir = true), s2.dir && (e2 = g(e2)), s2.createFolders && (n2 = _(e2)) && b.call(this, n2, true);
659            var a2 = "string" === i2 && false === s2.binary && false === s2.base64;
660            r2 && void 0 !== r2.binary || (s2.binary = !a2), (t2 instanceof c && 0 === t2.uncompressedSize || s2.dir || !t2 || 0 === t2.length) && (s2.base64 = false, s2.binary = true, t2 = "", s2.compression = "STORE", i2 = "string");
661            var o2 = null;
662            o2 = t2 instanceof c || t2 instanceof l ? t2 : p.isNode && p.isStream(t2) ? new m(e2, t2) : u.prepareContent(e2, t2, s2.binary, s2.optimizedBinaryString, s2.base64);
663            var h2 = new d(e2, o2, s2);
664            this.files[e2] = h2;
665          }
666          var i = e("./utf8"), u = e("./utils"), l = e("./stream/GenericWorker"), a = e("./stream/StreamHelper"), f = e("./defaults"), c = e("./compressedObject"), d = e("./zipObject"), o = e("./generate"), p = e("./nodejsUtils"), m = e("./nodejs/NodejsStreamInputAdapter"), _ = function(e2) {
667            "/" === e2.slice(-1) && (e2 = e2.substring(0, e2.length - 1));
668            var t2 = e2.lastIndexOf("/");
669            return 0 < t2 ? e2.substring(0, t2) : "";
670          }, g = function(e2) {
671            return "/" !== e2.slice(-1) && (e2 += "/"), e2;
672          }, b = function(e2, t2) {
673            return t2 = void 0 !== t2 ? t2 : f.createFolders, e2 = g(e2), this.files[e2] || s.call(this, e2, null, {
674              dir: true,
675              createFolders: t2
676            }), this.files[e2];
677          };
678          function h(e2) {
679            return "[object RegExp]" === Object.prototype.toString.call(e2);
680          }
681          var n = {
682            load: function() {
683              throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
684            },
685            forEach: function(e2) {
686              var t2, r2, n2;
687              for (t2 in this.files) n2 = this.files[t2], (r2 = t2.slice(this.root.length, t2.length)) && t2.slice(0, this.root.length) === this.root && e2(r2, n2);
688            },
689            filter: function(r2) {
690              var n2 = [];
691              return this.forEach(function(e2, t2) {
692                r2(e2, t2) && n2.push(t2);
693              }), n2;
694            },
695            file: function(e2, t2, r2) {
696              if (1 !== arguments.length) return e2 = this.root + e2, s.call(this, e2, t2, r2), this;
697              if (h(e2)) {
698                var n2 = e2;
699                return this.filter(function(e3, t3) {
700                  return !t3.dir && n2.test(e3);
701                });
702              }
703              var i2 = this.files[this.root + e2];
704              return i2 && !i2.dir ? i2 : null;
705            },
706            folder: function(r2) {
707              if (!r2) return this;
708              if (h(r2)) return this.filter(function(e3, t3) {
709                return t3.dir && r2.test(e3);
710              });
711              var e2 = this.root + r2, t2 = b.call(this, e2), n2 = this.clone();
712              return n2.root = t2.name, n2;
713            },
714            remove: function(r2) {
715              r2 = this.root + r2;
716              var e2 = this.files[r2];
717              if (e2 || ("/" !== r2.slice(-1) && (r2 += "/"), e2 = this.files[r2]), e2 && !e2.dir) delete this.files[r2];
718              else for (var t2 = this.filter(function(e3, t3) {
719                return t3.name.slice(0, r2.length) === r2;
720              }), n2 = 0; n2 < t2.length; n2++) delete this.files[t2[n2].name];
721              return this;
722            },
723            generate: function() {
724              throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
725            },
726            generateInternalStream: function(e2) {
727              var t2, r2 = {};
728              try {
729                if ((r2 = u.extend(e2 || {}, {
730                  streamFiles: false,
731                  compression: "STORE",
732                  compressionOptions: null,
733                  type: "",
734                  platform: "DOS",
735                  comment: null,
736                  mimeType: "application/zip",
737                  encodeFileName: i.utf8encode
738                })).type = r2.type.toLowerCase(), r2.compression = r2.compression.toUpperCase(), "binarystring" === r2.type && (r2.type = "string"), !r2.type) throw new Error("No output type specified.");
739                u.checkSupport(r2.type), "darwin" !== r2.platform && "freebsd" !== r2.platform && "linux" !== r2.platform && "sunos" !== r2.platform || (r2.platform = "UNIX"), "win32" === r2.platform && (r2.platform = "DOS");
740                var n2 = r2.comment || this.comment || "";
741                t2 = o.generateWorker(this, r2, n2);
742              } catch (e3) {
743                (t2 = new l("error")).error(e3);
744              }
745              return new a(t2, r2.type || "string", r2.mimeType);
746            },
747            generateAsync: function(e2, t2) {
748              return this.generateInternalStream(e2).accumulate(t2);
749            },
750            generateNodeStream: function(e2, t2) {
751              return (e2 = e2 || {}).type || (e2.type = "nodebuffer"), this.generateInternalStream(e2).toNodejsStream(t2);
752            }
753          };
754          t.exports = n;
755        }, {
756          "./compressedObject": 2,
757          "./defaults": 5,
758          "./generate": 9,
759          "./nodejs/NodejsStreamInputAdapter": 12,
760          "./nodejsUtils": 14,
761          "./stream/GenericWorker": 28,
762          "./stream/StreamHelper": 29,
763          "./utf8": 31,
764          "./utils": 32,
765          "./zipObject": 35
766        }],
767        16: [function(e, t, r) {
768          "use strict";
769          t.exports = e("stream");
770        }, {
771          stream: void 0
772        }],
773        17: [function(e, t, r) {
774          "use strict";
775          var n = e("./DataReader");
776          function i(e2) {
777            n.call(this, e2);
778            for (var t2 = 0; t2 < this.data.length; t2++) e2[t2] = 255 & e2[t2];
779          }
780          e("../utils").inherits(i, n), i.prototype.byteAt = function(e2) {
781            return this.data[this.zero + e2];
782          }, i.prototype.lastIndexOfSignature = function(e2) {
783            for (var t2 = e2.charCodeAt(0), r2 = e2.charCodeAt(1), n2 = e2.charCodeAt(2), i2 = e2.charCodeAt(3), s = this.length - 4; 0 <= s; --s) if (this.data[s] === t2 && this.data[s + 1] === r2 && this.data[s + 2] === n2 && this.data[s + 3] === i2) return s - this.zero;
784            return -1;
785          }, i.prototype.readAndCheckSignature = function(e2) {
786            var t2 = e2.charCodeAt(0), r2 = e2.charCodeAt(1), n2 = e2.charCodeAt(2), i2 = e2.charCodeAt(3), s = this.readData(4);
787            return t2 === s[0] && r2 === s[1] && n2 === s[2] && i2 === s[3];
788          }, i.prototype.readData = function(e2) {
789            if (this.checkOffset(e2), 0 === e2) return [];
790            var t2 = this.data.slice(this.zero + this.index, this.zero + this.index + e2);
791            return this.index += e2, t2;
792          }, t.exports = i;
793        }, {
794          "../utils": 32,
795          "./DataReader": 18
796        }],
797        18: [function(e, t, r) {
798          "use strict";
799          var n = e("../utils");
800          function i(e2) {
801            this.data = e2, this.length = e2.length, this.index = 0, this.zero = 0;
802          }
803          i.prototype = {
804            checkOffset: function(e2) {
805              this.checkIndex(this.index + e2);
806            },
807            checkIndex: function(e2) {
808              if (this.length < this.zero + e2 || e2 < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + e2 + "). Corrupted zip ?");
809            },
810            setIndex: function(e2) {
811              this.checkIndex(e2), this.index = e2;
812            },
813            skip: function(e2) {
814              this.setIndex(this.index + e2);
815            },
816            byteAt: function() {
817            },
818            readInt: function(e2) {
819              var t2, r2 = 0;
820              for (this.checkOffset(e2), t2 = this.index + e2 - 1; t2 >= this.index; t2--) r2 = (r2 << 8) + this.byteAt(t2);
821              return this.index += e2, r2;
822            },
823            readString: function(e2) {
824              return n.transformTo("string", this.readData(e2));
825            },
826            readData: function() {
827            },
828            lastIndexOfSignature: function() {
829            },
830            readAndCheckSignature: function() {
831            },
832            readDate: function() {
833              var e2 = this.readInt(4);
834              return new Date(Date.UTC(1980 + (e2 >> 25 & 127), (e2 >> 21 & 15) - 1, e2 >> 16 & 31, e2 >> 11 & 31, e2 >> 5 & 63, (31 & e2) << 1));
835            }
836          }, t.exports = i;
837        }, {
838          "../utils": 32
839        }],
840        19: [function(e, t, r) {
841          "use strict";
842          var n = e("./Uint8ArrayReader");
843          function i(e2) {
844            n.call(this, e2);
845          }
846          e("../utils").inherits(i, n), i.prototype.readData = function(e2) {
847            this.checkOffset(e2);
848            var t2 = this.data.slice(this.zero + this.index, this.zero + this.index + e2);
849            return this.index += e2, t2;
850          }, t.exports = i;
851        }, {
852          "../utils": 32,
853          "./Uint8ArrayReader": 21
854        }],
855        20: [function(e, t, r) {
856          "use strict";
857          var n = e("./DataReader");
858          function i(e2) {
859            n.call(this, e2);
860          }
861          e("../utils").inherits(i, n), i.prototype.byteAt = function(e2) {
862            return this.data.charCodeAt(this.zero + e2);
863          }, i.prototype.lastIndexOfSignature = function(e2) {
864            return this.data.lastIndexOf(e2) - this.zero;
865          }, i.prototype.readAndCheckSignature = function(e2) {
866            return e2 === this.readData(4);
867          }, i.prototype.readData = function(e2) {
868            this.checkOffset(e2);
869            var t2 = this.data.slice(this.zero + this.index, this.zero + this.index + e2);
870            return this.index += e2, t2;
871          }, t.exports = i;
872        }, {
873          "../utils": 32,
874          "./DataReader": 18
875        }],
876        21: [function(e, t, r) {
877          "use strict";
878          var n = e("./ArrayReader");
879          function i(e2) {
880            n.call(this, e2);
881          }
882          e("../utils").inherits(i, n), i.prototype.readData = function(e2) {
883            if (this.checkOffset(e2), 0 === e2) return new Uint8Array(0);
884            var t2 = this.data.subarray(this.zero + this.index, this.zero + this.index + e2);
885            return this.index += e2, t2;
886          }, t.exports = i;
887        }, {
888          "../utils": 32,
889          "./ArrayReader": 17
890        }],
891        22: [function(e, t, r) {
892          "use strict";
893          var n = e("../utils"), i = e("../support"), s = e("./ArrayReader"), a = e("./StringReader"), o = e("./NodeBufferReader"), h = e("./Uint8ArrayReader");
894          t.exports = function(e2) {
895            var t2 = n.getTypeOf(e2);
896            return n.checkSupport(t2), "string" !== t2 || i.uint8array ? "nodebuffer" === t2 ? new o(e2) : i.uint8array ? new h(n.transformTo("uint8array", e2)) : new s(n.transformTo("array", e2)) : new a(e2);
897          };
898        }, {
899          "../support": 30,
900          "../utils": 32,
901          "./ArrayReader": 17,
902          "./NodeBufferReader": 19,
903          "./StringReader": 20,
904          "./Uint8ArrayReader": 21
905        }],
906        23: [function(e, t, r) {
907          "use strict";
908          r.LOCAL_FILE_HEADER = "PK��", r.CENTRAL_FILE_HEADER = "PK��", r.CENTRAL_DIRECTORY_END = "PK��", r.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK�\x07", r.ZIP64_CENTRAL_DIRECTORY_END = "PK��", r.DATA_DESCRIPTOR = "PK\x07\b";
909        }, {}],
910        24: [function(e, t, r) {
911          "use strict";
912          var n = e("./GenericWorker"), i = e("../utils");
913          function s(e2) {
914            n.call(this, "ConvertWorker to " + e2), this.destType = e2;
915          }
916          i.inherits(s, n), s.prototype.processChunk = function(e2) {
917            this.push({
918              data: i.transformTo(this.destType, e2.data),
919              meta: e2.meta
920            });
921          }, t.exports = s;
922        }, {
923          "../utils": 32,
924          "./GenericWorker": 28
925        }],
926        25: [function(e, t, r) {
927          "use strict";
928          var n = e("./GenericWorker"), i = e("../crc32");
929          function s() {
930            n.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);
931          }
932          e("../utils").inherits(s, n), s.prototype.processChunk = function(e2) {
933            this.streamInfo.crc32 = i(e2.data, this.streamInfo.crc32 || 0), this.push(e2);
934          }, t.exports = s;
935        }, {
936          "../crc32": 4,
937          "../utils": 32,
938          "./GenericWorker": 28
939        }],
940        26: [function(e, t, r) {
941          "use strict";
942          var n = e("../utils"), i = e("./GenericWorker");
943          function s(e2) {
944            i.call(this, "DataLengthProbe for " + e2), this.propName = e2, this.withStreamInfo(e2, 0);
945          }
946          n.inherits(s, i), s.prototype.processChunk = function(e2) {
947            if (e2) {
948              var t2 = this.streamInfo[this.propName] || 0;
949              this.streamInfo[this.propName] = t2 + e2.data.length;
950            }
951            i.prototype.processChunk.call(this, e2);
952          }, t.exports = s;
953        }, {
954          "../utils": 32,
955          "./GenericWorker": 28
956        }],
957        27: [function(e, t, r) {
958          "use strict";
959          var n = e("../utils"), i = e("./GenericWorker");
960          function s(e2) {
961            i.call(this, "DataWorker");
962            var t2 = this;
963            this.dataIsReady = false, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = false, e2.then(function(e3) {
964              t2.dataIsReady = true, t2.data = e3, t2.max = e3 && e3.length || 0, t2.type = n.getTypeOf(e3), t2.isPaused || t2._tickAndRepeat();
965            }, function(e3) {
966              t2.error(e3);
967            });
968          }
969          n.inherits(s, i), s.prototype.cleanUp = function() {
970            i.prototype.cleanUp.call(this), this.data = null;
971          }, s.prototype.resume = function() {
972            return !!i.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = true, n.delay(this._tickAndRepeat, [], this)), true);
973          }, s.prototype._tickAndRepeat = function() {
974            this._tickScheduled = false, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (n.delay(this._tickAndRepeat, [], this), this._tickScheduled = true));
975          }, s.prototype._tick = function() {
976            if (this.isPaused || this.isFinished) return false;
977            var e2 = null, t2 = Math.min(this.max, this.index + 16384);
978            if (this.index >= this.max) return this.end();
979            switch (this.type) {
980              case "string":
981                e2 = this.data.substring(this.index, t2);
982                break;
983              case "uint8array":
984                e2 = this.data.subarray(this.index, t2);
985                break;
986              case "array":
987              case "nodebuffer":
988                e2 = this.data.slice(this.index, t2);
989            }
990            return this.index = t2, this.push({
991              data: e2,
992              meta: {
993                percent: this.max ? this.index / this.max * 100 : 0
994              }
995            });
996          }, t.exports = s;
997        }, {
998          "../utils": 32,
999          "./GenericWorker": 28
1000        }],
1001        28: [function(e, t, r) {
1002          "use strict";
1003          function n(e2) {
1004            this.name = e2 || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = true, this.isFinished = false, this.isLocked = false, this._listeners = {
1005              data: [],
1006              end: [],
1007              error: []
1008            }, this.previous = null;
1009          }
1010          n.prototype = {
1011            push: function(e2) {
1012              this.emit("data", e2);
1013            },
1014            end: function() {
1015              if (this.isFinished) return false;
1016              this.flush();
1017              try {
1018                this.emit("end"), this.cleanUp(), this.isFinished = true;
1019              } catch (e2) {
1020                this.emit("error", e2);
1021              }
1022              return true;
1023            },
1024            error: function(e2) {
1025              return !this.isFinished && (this.isPaused ? this.generatedError = e2 : (this.isFinished = true, this.emit("error", e2), this.previous && this.previous.error(e2), this.cleanUp()), true);
1026            },
1027            on: function(e2, t2) {
1028              return this._listeners[e2].push(t2), this;
1029            },
1030            cleanUp: function() {
1031              this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];
1032            },
1033            emit: function(e2, t2) {
1034              if (this._listeners[e2]) for (var r2 = 0; r2 < this._listeners[e2].length; r2++) this._listeners[e2][r2].call(this, t2);
1035            },
1036            pipe: function(e2) {
1037              return e2.registerPrevious(this);
1038            },
1039            registerPrevious: function(e2) {
1040              if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
1041              this.streamInfo = e2.streamInfo, this.mergeStreamInfo(), this.previous = e2;
1042              var t2 = this;
1043              return e2.on("data", function(e3) {
1044                t2.processChunk(e3);
1045              }), e2.on("end", function() {
1046                t2.end();
1047              }), e2.on("error", function(e3) {
1048                t2.error(e3);
1049              }), this;
1050            },
1051            pause: function() {
1052              return !this.isPaused && !this.isFinished && (this.isPaused = true, this.previous && this.previous.pause(), true);
1053            },
1054            resume: function() {
1055              if (!this.isPaused || this.isFinished) return false;
1056              var e2 = this.isPaused = false;
1057              return this.generatedError && (this.error(this.generatedError), e2 = true), this.previous && this.previous.resume(), !e2;
1058            },
1059            flush: function() {
1060            },
1061            processChunk: function(e2) {
1062              this.push(e2);
1063            },
1064            withStreamInfo: function(e2, t2) {
1065              return this.extraStreamInfo[e2] = t2, this.mergeStreamInfo(), this;
1066            },
1067            mergeStreamInfo: function() {
1068              for (var e2 in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, e2) && (this.streamInfo[e2] = this.extraStreamInfo[e2]);
1069            },
1070            lock: function() {
1071              if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
1072              this.isLocked = true, this.previous && this.previous.lock();
1073            },
1074            toString: function() {
1075              var e2 = "Worker " + this.name;
1076              return this.previous ? this.previous + " -> " + e2 : e2;
1077            }
1078          }, t.exports = n;
1079        }, {}],
1080        29: [function(e, t, r) {
1081          "use strict";
1082          var h = e("../utils"), i = e("./ConvertWorker"), s = e("./GenericWorker"), u = e("../base64"), n = e("../support"), a = e("../external"), o = null;
1083          if (n.nodestream) try {
1084            o = e("../nodejs/NodejsStreamOutputAdapter");
1085          } catch (e2) {
1086          }
1087          function l(e2, o2) {
1088            return new a.Promise(function(t2, r2) {
1089              var n2 = [], i2 = e2._internalType, s2 = e2._outputType, a2 = e2._mimeType;
1090              e2.on("data", function(e3, t3) {
1091                n2.push(e3), o2 && o2(t3);
1092              }).on("error", function(e3) {
1093                n2 = [], r2(e3);
1094              }).on("end", function() {
1095                try {
1096                  var e3 = function(e4, t3, r3) {
1097                    switch (e4) {
1098                      case "blob":
1099                        return h.newBlob(h.transformTo("arraybuffer", t3), r3);
1100                      case "base64":
1101                        return u.encode(t3);
1102                      default:
1103                        return h.transformTo(e4, t3);
1104                    }
1105                  }(s2, function(e4, t3) {
1106                    var r3, n3 = 0, i3 = null, s3 = 0;
1107                    for (r3 = 0; r3 < t3.length; r3++) s3 += t3[r3].length;
1108                    switch (e4) {
1109                      case "string":
1110                        return t3.join("");
1111                      case "array":
1112                        return Array.prototype.concat.apply([], t3);
1113                      case "uint8array":
1114                        for (i3 = new Uint8Array(s3), r3 = 0; r3 < t3.length; r3++) i3.set(t3[r3], n3), n3 += t3[r3].length;
1115                        return i3;
1116                      case "nodebuffer":
1117                        return Buffer.concat(t3);
1118                      default:
1119                        throw new Error("concat : unsupported type '" + e4 + "'");
1120                    }
1121                  }(i2, n2), a2);
1122                  t2(e3);
1123                } catch (e4) {
1124                  r2(e4);
1125                }
1126                n2 = [];
1127              }).resume();
1128            });
1129          }
1130          function f(e2, t2, r2) {
1131            var n2 = t2;
1132            switch (t2) {
1133              case "blob":
1134              case "arraybuffer":
1135                n2 = "uint8array";
1136                break;
1137              case "base64":
1138                n2 = "string";
1139            }
1140            try {
1141              this._internalType = n2, this._outputType = t2, this._mimeType = r2, h.checkSupport(n2), this._worker = e2.pipe(new i(n2)), e2.lock();
1142            } catch (e3) {
1143              this._worker = new s("error"), this._worker.error(e3);
1144            }
1145          }
1146          f.prototype = {
1147            accumulate: function(e2) {
1148              return l(this, e2);
1149            },
1150            on: function(e2, t2) {
1151              var r2 = this;
1152              return "data" === e2 ? this._worker.on(e2, function(e3) {
1153                t2.call(r2, e3.data, e3.meta);
1154              }) : this._worker.on(e2, function() {
1155                h.delay(t2, arguments, r2);
1156              }), this;
1157            },
1158            resume: function() {
1159              return h.delay(this._worker.resume, [], this._worker), this;
1160            },
1161            pause: function() {
1162              return this._worker.pause(), this;
1163            },
1164            toNodejsStream: function(e2) {
1165              if (h.checkSupport("nodestream"), "nodebuffer" !== this._outputType) throw new Error(this._outputType + " is not supported by this method");
1166              return new o(this, {
1167                objectMode: "nodebuffer" !== this._outputType
1168              }, e2);
1169            }
1170          }, t.exports = f;
1171        }, {
1172          "../base64": 1,
1173          "../external": 6,
1174          "../nodejs/NodejsStreamOutputAdapter": 13,
1175          "../support": 30,
1176          "../utils": 32,
1177          "./ConvertWorker": 24,
1178          "./GenericWorker": 28
1179        }],
1180        30: [function(e, t, r) {
1181          "use strict";
1182          if (r.base64 = true, r.array = true, r.string = true, r.arraybuffer = "undefined" != typeof ArrayBuffer && "undefined" != typeof Uint8Array, r.nodebuffer = "undefined" != typeof Buffer, r.uint8array = "undefined" != typeof Uint8Array, "undefined" == typeof ArrayBuffer) r.blob = false;
1183          else {
1184            var n = new ArrayBuffer(0);
1185            try {
1186              r.blob = 0 === new Blob([n], {
1187                type: "application/zip"
1188              }).size;
1189            } catch (e2) {
1190              try {
1191                var i = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
1192                i.append(n), r.blob = 0 === i.getBlob("application/zip").size;
1193              } catch (e3) {
1194                r.blob = false;
1195              }
1196            }
1197          }
1198          try {
1199            r.nodestream = !!e("readable-stream").Readable;
1200          } catch (e2) {
1201            r.nodestream = false;
1202          }
1203        }, {
1204          "readable-stream": 16
1205        }],
1206        31: [function(e, t, s) {
1207          "use strict";
1208          for (var o = e("./utils"), h = e("./support"), r = e("./nodejsUtils"), n = e("./stream/GenericWorker"), u = new Array(256), i = 0; i < 256; i++) u[i] = 252 <= i ? 6 : 248 <= i ? 5 : 240 <= i ? 4 : 224 <= i ? 3 : 192 <= i ? 2 : 1;
1209          u[254] = u[254] = 1;
1210          function a() {
1211            n.call(this, "utf-8 decode"), this.leftOver = null;
1212          }
1213          function l() {
1214            n.call(this, "utf-8 encode");
1215          }
1216          s.utf8encode = function(e2) {
1217            return h.nodebuffer ? r.newBufferFrom(e2, "utf-8") : function(e3) {
1218              var t2, r2, n2, i2, s2, a2 = e3.length, o2 = 0;
1219              for (i2 = 0; i2 < a2; i2++) 55296 == (64512 & (r2 = e3.charCodeAt(i2))) && i2 + 1 < a2 && 56320 == (64512 & (n2 = e3.charCodeAt(i2 + 1))) && (r2 = 65536 + (r2 - 55296 << 10) + (n2 - 56320), i2++), o2 += r2 < 128 ? 1 : r2 < 2048 ? 2 : r2 < 65536 ? 3 : 4;
1220              for (t2 = h.uint8array ? new Uint8Array(o2) : new Array(o2), i2 = s2 = 0; s2 < o2; i2++) 55296 == (64512 & (r2 = e3.charCodeAt(i2))) && i2 + 1 < a2 && 56320 == (64512 & (n2 = e3.charCodeAt(i2 + 1))) && (r2 = 65536 + (r2 - 55296 << 10) + (n2 - 56320), i2++), r2 < 128 ? t2[s2++] = r2 : (r2 < 2048 ? t2[s2++] = 192 | r2 >>> 6 : (r2 < 65536 ? t2[s2++] = 224 | r2 >>> 12 : (t2[s2++] = 240 | r2 >>> 18, t2[s2++] = 128 | r2 >>> 12 & 63), t2[s2++] = 128 | r2 >>> 6 & 63), t2[s2++] = 128 | 63 & r2);
1221              return t2;
1222            }(e2);
1223          }, s.utf8decode = function(e2) {
1224            return h.nodebuffer ? o.transformTo("nodebuffer", e2).toString("utf-8") : function(e3) {
1225              var t2, r2, n2, i2, s2 = e3.length, a2 = new Array(2 * s2);
1226              for (t2 = r2 = 0; t2 < s2; ) if ((n2 = e3[t2++]) < 128) a2[r2++] = n2;
1227              else if (4 < (i2 = u[n2])) a2[r2++] = 65533, t2 += i2 - 1;
1228              else {
1229                for (n2 &= 2 === i2 ? 31 : 3 === i2 ? 15 : 7; 1 < i2 && t2 < s2; ) n2 = n2 << 6 | 63 & e3[t2++], i2--;
1230                1 < i2 ? a2[r2++] = 65533 : n2 < 65536 ? a2[r2++] = n2 : (n2 -= 65536, a2[r2++] = 55296 | n2 >> 10 & 1023, a2[r2++] = 56320 | 1023 & n2);
1231              }
1232              return a2.length !== r2 && (a2.subarray ? a2 = a2.subarray(0, r2) : a2.length = r2), o.applyFromCharCode(a2);
1233            }(e2 = o.transformTo(h.uint8array ? "uint8array" : "array", e2));
1234          }, o.inherits(a, n), a.prototype.processChunk = function(e2) {
1235            var t2 = o.transformTo(h.uint8array ? "uint8array" : "array", e2.data);
1236            if (this.leftOver && this.leftOver.length) {
1237              if (h.uint8array) {
1238                var r2 = t2;
1239                (t2 = new Uint8Array(r2.length + this.leftOver.length)).set(this.leftOver, 0), t2.set(r2, this.leftOver.length);
1240              } else t2 = this.leftOver.concat(t2);
1241              this.leftOver = null;
1242            }
1243            var n2 = function(e3, t3) {
1244              var r3;
1245              for ((t3 = t3 || e3.length) > e3.length && (t3 = e3.length), r3 = t3 - 1; 0 <= r3 && 128 == (192 & e3[r3]); ) r3--;
1246              return r3 < 0 ? t3 : 0 === r3 ? t3 : r3 + u[e3[r3]] > t3 ? r3 : t3;
1247            }(t2), i2 = t2;
1248            n2 !== t2.length && (h.uint8array ? (i2 = t2.subarray(0, n2), this.leftOver = t2.subarray(n2, t2.length)) : (i2 = t2.slice(0, n2), this.leftOver = t2.slice(n2, t2.length))), this.push({
1249              data: s.utf8decode(i2),
1250              meta: e2.meta
1251            });
1252          }, a.prototype.flush = function() {
1253            this.leftOver && this.leftOver.length && (this.push({
1254              data: s.utf8decode(this.leftOver),
1255              meta: {}
1256            }), this.leftOver = null);
1257          }, s.Utf8DecodeWorker = a, o.inherits(l, n), l.prototype.processChunk = function(e2) {
1258            this.push({
1259              data: s.utf8encode(e2.data),
1260              meta: e2.meta
1261            });
1262          }, s.Utf8EncodeWorker = l;
1263        }, {
1264          "./nodejsUtils": 14,
1265          "./stream/GenericWorker": 28,
1266          "./support": 30,
1267          "./utils": 32
1268        }],
1269        32: [function(e, t, a) {
1270          "use strict";
1271          var o = e("./support"), h = e("./base64"), r = e("./nodejsUtils"), u = e("./external");
1272          function n(e2) {
1273            return e2;
1274          }
1275          function l(e2, t2) {
1276            for (var r2 = 0; r2 < e2.length; ++r2) t2[r2] = 255 & e2.charCodeAt(r2);
1277            return t2;
1278          }
1279          e("setimmediate"), a.newBlob = function(t2, r2) {
1280            a.checkSupport("blob");
1281            try {
1282              return new Blob([t2], {
1283                type: r2
1284              });
1285            } catch (e2) {
1286              try {
1287                var n2 = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
1288                return n2.append(t2), n2.getBlob(r2);
1289              } catch (e3) {
1290                throw new Error("Bug : can't construct the Blob.");
1291              }
1292            }
1293          };
1294          var i = {
1295            stringifyByChunk: function(e2, t2, r2) {
1296              var n2 = [], i2 = 0, s2 = e2.length;
1297              if (s2 <= r2) return String.fromCharCode.apply(null, e2);
1298              for (; i2 < s2; ) "array" === t2 || "nodebuffer" === t2 ? n2.push(String.fromCharCode.apply(null, e2.slice(i2, Math.min(i2 + r2, s2)))) : n2.push(String.fromCharCode.apply(null, e2.subarray(i2, Math.min(i2 + r2, s2)))), i2 += r2;
1299              return n2.join("");
1300            },
1301            stringifyByChar: function(e2) {
1302              for (var t2 = "", r2 = 0; r2 < e2.length; r2++) t2 += String.fromCharCode(e2[r2]);
1303              return t2;
1304            },
1305            applyCanBeUsed: {
1306              uint8array: function() {
1307                try {
1308                  return o.uint8array && 1 === String.fromCharCode.apply(null, new Uint8Array(1)).length;
1309                } catch (e2) {
1310                  return false;
1311                }
1312              }(),
1313              nodebuffer: function() {
1314                try {
1315                  return o.nodebuffer && 1 === String.fromCharCode.apply(null, r.allocBuffer(1)).length;
1316                } catch (e2) {
1317                  return false;
1318                }
1319              }()
1320            }
1321          };
1322          function s(e2) {
1323            var t2 = 65536, r2 = a.getTypeOf(e2), n2 = true;
1324            if ("uint8array" === r2 ? n2 = i.applyCanBeUsed.uint8array : "nodebuffer" === r2 && (n2 = i.applyCanBeUsed.nodebuffer), n2) for (; 1 < t2; ) try {
1325              return i.stringifyByChunk(e2, r2, t2);
1326            } catch (e3) {
1327              t2 = Math.floor(t2 / 2);
1328            }
1329            return i.stringifyByChar(e2);
1330          }
1331          function f(e2, t2) {
1332            for (var r2 = 0; r2 < e2.length; r2++) t2[r2] = e2[r2];
1333            return t2;
1334          }
1335          a.applyFromCharCode = s;
1336          var c = {};
1337          c.string = {
1338            string: n,
1339            array: function(e2) {
1340              return l(e2, new Array(e2.length));
1341            },
1342            arraybuffer: function(e2) {
1343              return c.string.uint8array(e2).buffer;
1344            },
1345            uint8array: function(e2) {
1346              return l(e2, new Uint8Array(e2.length));
1347            },
1348            nodebuffer: function(e2) {
1349              return l(e2, r.allocBuffer(e2.length));
1350            }
1351          }, c.array = {
1352            string: s,
1353            array: n,
1354            arraybuffer: function(e2) {
1355              return new Uint8Array(e2).buffer;
1356            },
1357            uint8array: function(e2) {
1358              return new Uint8Array(e2);
1359            },
1360            nodebuffer: function(e2) {
1361              return r.newBufferFrom(e2);
1362            }
1363          }, c.arraybuffer = {
1364            string: function(e2) {
1365              return s(new Uint8Array(e2));
1366            },
1367            array: function(e2) {
1368              return f(new Uint8Array(e2), new Array(e2.byteLength));
1369            },
1370            arraybuffer: n,
1371            uint8array: function(e2) {
1372              return new Uint8Array(e2);
1373            },
1374            nodebuffer: function(e2) {
1375              return r.newBufferFrom(new Uint8Array(e2));
1376            }
1377          }, c.uint8array = {
1378            string: s,
1379            array: function(e2) {
1380              return f(e2, new Array(e2.length));
1381            },
1382            arraybuffer: function(e2) {
1383              return e2.buffer;
1384            },
1385            uint8array: n,
1386            nodebuffer: function(e2) {
1387              return r.newBufferFrom(e2);
1388            }
1389          }, c.nodebuffer = {
1390            string: s,
1391            array: function(e2) {
1392              return f(e2, new Array(e2.length));
1393            },
1394            arraybuffer: function(e2) {
1395              return c.nodebuffer.uint8array(e2).buffer;
1396            },
1397            uint8array: function(e2) {
1398              return f(e2, new Uint8Array(e2.length));
1399            },
1400            nodebuffer: n
1401          }, a.transformTo = function(e2, t2) {
1402            if (t2 = t2 || "", !e2) return t2;
1403            a.checkSupport(e2);
1404            var r2 = a.getTypeOf(t2);
1405            return c[r2][e2](t2);
1406          }, a.resolve = function(e2) {
1407            for (var t2 = e2.split("/"), r2 = [], n2 = 0; n2 < t2.length; n2++) {
1408              var i2 = t2[n2];
1409              "." === i2 || "" === i2 && 0 !== n2 && n2 !== t2.length - 1 || (".." === i2 ? r2.pop() : r2.push(i2));
1410            }
1411            return r2.join("/");
1412          }, a.getTypeOf = function(e2) {
1413            return "string" == typeof e2 ? "string" : "[object Array]" === Object.prototype.toString.call(e2) ? "array" : o.nodebuffer && r.isBuffer(e2) ? "nodebuffer" : o.uint8array && e2 instanceof Uint8Array ? "uint8array" : o.arraybuffer && e2 instanceof ArrayBuffer ? "arraybuffer" : void 0;
1414          }, a.checkSupport = function(e2) {
1415            if (!o[e2.toLowerCase()]) throw new Error(e2 + " is not supported by this platform");
1416          }, a.MAX_VALUE_16BITS = 65535, a.MAX_VALUE_32BITS = -1, a.pretty = function(e2) {
1417            var t2, r2, n2 = "";
1418            for (r2 = 0; r2 < (e2 || "").length; r2++) n2 += "\\x" + ((t2 = e2.charCodeAt(r2)) < 16 ? "0" : "") + t2.toString(16).toUpperCase();
1419            return n2;
1420          }, a.delay = function(e2, t2, r2) {
1421            setImmediate(function() {
1422              e2.apply(r2 || null, t2 || []);
1423            });
1424          }, a.inherits = function(e2, t2) {
1425            function r2() {
1426            }
1427            r2.prototype = t2.prototype, e2.prototype = new r2();
1428          }, a.extend = function() {
1429            var e2, t2, r2 = {};
1430            for (e2 = 0; e2 < arguments.length; e2++) for (t2 in arguments[e2]) Object.prototype.hasOwnProperty.call(arguments[e2], t2) && void 0 === r2[t2] && (r2[t2] = arguments[e2][t2]);
1431            return r2;
1432          }, a.prepareContent = function(r2, e2, n2, i2, s2) {
1433            return u.Promise.resolve(e2).then(function(n3) {
1434              return o.blob && (n3 instanceof Blob || -1 !== ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(n3))) && "undefined" != typeof FileReader ? new u.Promise(function(t2, r3) {
1435                var e3 = new FileReader();
1436                e3.onload = function(e4) {
1437                  t2(e4.target.result);
1438                }, e3.onerror = function(e4) {
1439                  r3(e4.target.error);
1440                }, e3.readAsArrayBuffer(n3);
1441              }) : n3;
1442            }).then(function(e3) {
1443              var t2 = a.getTypeOf(e3);
1444              return t2 ? ("arraybuffer" === t2 ? e3 = a.transformTo("uint8array", e3) : "string" === t2 && (s2 ? e3 = h.decode(e3) : n2 && true !== i2 && (e3 = function(e4) {
1445                return l(e4, o.uint8array ? new Uint8Array(e4.length) : new Array(e4.length));
1446              }(e3))), e3) : u.Promise.reject(new Error("Can't read the data of '" + r2 + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));
1447            });
1448          };
1449        }, {
1450          "./base64": 1,
1451          "./external": 6,
1452          "./nodejsUtils": 14,
1453          "./support": 30,
1454          setimmediate: 54
1455        }],
1456        33: [function(e, t, r) {
1457          "use strict";
1458          var n = e("./reader/readerFor"), i = e("./utils"), s = e("./signature"), a = e("./zipEntry"), o = e("./support");
1459          function h(e2) {
1460            this.files = [], this.loadOptions = e2;
1461          }
1462          h.prototype = {
1463            checkSignature: function(e2) {
1464              if (!this.reader.readAndCheckSignature(e2)) {
1465                this.reader.index -= 4;
1466                var t2 = this.reader.readString(4);
1467                throw new Error("Corrupted zip or bug: unexpected signature (" + i.pretty(t2) + ", expected " + i.pretty(e2) + ")");
1468              }
1469            },
1470            isSignature: function(e2, t2) {
1471              var r2 = this.reader.index;
1472              this.reader.setIndex(e2);
1473              var n2 = this.reader.readString(4) === t2;
1474              return this.reader.setIndex(r2), n2;
1475            },
1476            readBlockEndOfCentral: function() {
1477              this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);
1478              var e2 = this.reader.readData(this.zipCommentLength), t2 = o.uint8array ? "uint8array" : "array", r2 = i.transformTo(t2, e2);
1479              this.zipComment = this.loadOptions.decodeFileName(r2);
1480            },
1481            readBlockZip64EndOfCentral: function() {
1482              this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};
1483              for (var e2, t2, r2, n2 = this.zip64EndOfCentralSize - 44; 0 < n2; ) e2 = this.reader.readInt(2), t2 = this.reader.readInt(4), r2 = this.reader.readData(t2), this.zip64ExtensibleData[e2] = {
1484                id: e2,
1485                length: t2,
1486                value: r2
1487              };
1488            },
1489            readBlockZip64EndOfCentralLocator: function() {
1490              if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), 1 < this.disksCount) throw new Error("Multi-volumes zip are not supported");
1491            },
1492            readLocalFiles: function() {
1493              var e2, t2;
1494              for (e2 = 0; e2 < this.files.length; e2++) t2 = this.files[e2], this.reader.setIndex(t2.localHeaderOffset), this.checkSignature(s.LOCAL_FILE_HEADER), t2.readLocalPart(this.reader), t2.handleUTF8(), t2.processAttributes();
1495            },
1496            readCentralDir: function() {
1497              var e2;
1498              for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER); ) (e2 = new a({
1499                zip64: this.zip64
1500              }, this.loadOptions)).readCentralPart(this.reader), this.files.push(e2);
1501              if (this.centralDirRecords !== this.files.length && 0 !== this.centralDirRecords && 0 === this.files.length) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);
1502            },
1503            readEndOfCentral: function() {
1504              var e2 = this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);
1505              if (e2 < 0) throw !this.isSignature(0, s.LOCAL_FILE_HEADER) ? new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html") : new Error("Corrupted zip: can't find end of central directory");
1506              this.reader.setIndex(e2);
1507              var t2 = e2;
1508              if (this.checkSignature(s.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === i.MAX_VALUE_16BITS || this.diskWithCentralDirStart === i.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === i.MAX_VALUE_16BITS || this.centralDirRecords === i.MAX_VALUE_16BITS || this.centralDirSize === i.MAX_VALUE_32BITS || this.centralDirOffset === i.MAX_VALUE_32BITS) {
1509                if (this.zip64 = true, (e2 = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");
1510                if (this.reader.setIndex(e2), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, s.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");
1511                this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();
1512              }
1513              var r2 = this.centralDirOffset + this.centralDirSize;
1514              this.zip64 && (r2 += 20, r2 += 12 + this.zip64EndOfCentralSize);
1515              var n2 = t2 - r2;
1516              if (0 < n2) this.isSignature(t2, s.CENTRAL_FILE_HEADER) || (this.reader.zero = n2);
1517              else if (n2 < 0) throw new Error("Corrupted zip: missing " + Math.abs(n2) + " bytes.");
1518            },
1519            prepareReader: function(e2) {
1520              this.reader = n(e2);
1521            },
1522            load: function(e2) {
1523              this.prepareReader(e2), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();
1524            }
1525          }, t.exports = h;
1526        }, {
1527          "./reader/readerFor": 22,
1528          "./signature": 23,
1529          "./support": 30,
1530          "./utils": 32,
1531          "./zipEntry": 34
1532        }],
1533        34: [function(e, t, r) {
1534          "use strict";
1535          var n = e("./reader/readerFor"), s = e("./utils"), i = e("./compressedObject"), a = e("./crc32"), o = e("./utf8"), h = e("./compressions"), u = e("./support");
1536          function l(e2, t2) {
1537            this.options = e2, this.loadOptions = t2;
1538          }
1539          l.prototype = {
1540            isEncrypted: function() {
1541              return 1 == (1 & this.bitFlag);
1542            },
1543            useUTF8: function() {
1544              return 2048 == (2048 & this.bitFlag);
1545            },
1546            readLocalPart: function(e2) {
1547              var t2, r2;
1548              if (e2.skip(22), this.fileNameLength = e2.readInt(2), r2 = e2.readInt(2), this.fileName = e2.readData(this.fileNameLength), e2.skip(r2), -1 === this.compressedSize || -1 === this.uncompressedSize) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");
1549              if (null === (t2 = function(e3) {
1550                for (var t3 in h) if (Object.prototype.hasOwnProperty.call(h, t3) && h[t3].magic === e3) return h[t3];
1551                return null;
1552              }(this.compressionMethod))) throw new Error("Corrupted zip : compression " + s.pretty(this.compressionMethod) + " unknown (inner file : " + s.transformTo("string", this.fileName) + ")");
1553              this.decompressed = new i(this.compressedSize, this.uncompressedSize, this.crc32, t2, e2.readData(this.compressedSize));
1554            },
1555            readCentralPart: function(e2) {
1556              this.versionMadeBy = e2.readInt(2), e2.skip(2), this.bitFlag = e2.readInt(2), this.compressionMethod = e2.readString(2), this.date = e2.readDate(), this.crc32 = e2.readInt(4), this.compressedSize = e2.readInt(4), this.uncompressedSize = e2.readInt(4);
1557              var t2 = e2.readInt(2);
1558              if (this.extraFieldsLength = e2.readInt(2), this.fileCommentLength = e2.readInt(2), this.diskNumberStart = e2.readInt(2), this.internalFileAttributes = e2.readInt(2), this.externalFileAttributes = e2.readInt(4), this.localHeaderOffset = e2.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");
1559              e2.skip(t2), this.readExtraFields(e2), this.parseZIP64ExtraField(e2), this.fileComment = e2.readData(this.fileCommentLength);
1560            },
1561            processAttributes: function() {
1562              this.unixPermissions = null, this.dosPermissions = null;
1563              var e2 = this.versionMadeBy >> 8;
1564              this.dir = !!(16 & this.externalFileAttributes), 0 == e2 && (this.dosPermissions = 63 & this.externalFileAttributes), 3 == e2 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || "/" !== this.fileNameStr.slice(-1) || (this.dir = true);
1565            },
1566            parseZIP64ExtraField: function() {
1567              if (this.extraFields[1]) {
1568                var e2 = n(this.extraFields[1].value);
1569                this.uncompressedSize === s.MAX_VALUE_32BITS && (this.uncompressedSize = e2.readInt(8)), this.compressedSize === s.MAX_VALUE_32BITS && (this.compressedSize = e2.readInt(8)), this.localHeaderOffset === s.MAX_VALUE_32BITS && (this.localHeaderOffset = e2.readInt(8)), this.diskNumberStart === s.MAX_VALUE_32BITS && (this.diskNumberStart = e2.readInt(4));
1570              }
1571            },
1572            readExtraFields: function(e2) {
1573              var t2, r2, n2, i2 = e2.index + this.extraFieldsLength;
1574              for (this.extraFields || (this.extraFields = {}); e2.index + 4 < i2; ) t2 = e2.readInt(2), r2 = e2.readInt(2), n2 = e2.readData(r2), this.extraFields[t2] = {
1575                id: t2,
1576                length: r2,
1577                value: n2
1578              };
1579              e2.setIndex(i2);
1580            },
1581            handleUTF8: function() {
1582              var e2 = u.uint8array ? "uint8array" : "array";
1583              if (this.useUTF8()) this.fileNameStr = o.utf8decode(this.fileName), this.fileCommentStr = o.utf8decode(this.fileComment);
1584              else {
1585                var t2 = this.findExtraFieldUnicodePath();
1586                if (null !== t2) this.fileNameStr = t2;
1587                else {
1588                  var r2 = s.transformTo(e2, this.fileName);
1589                  this.fileNameStr = this.loadOptions.decodeFileName(r2);
1590                }
1591                var n2 = this.findExtraFieldUnicodeComment();
1592                if (null !== n2) this.fileCommentStr = n2;
1593                else {
1594                  var i2 = s.transformTo(e2, this.fileComment);
1595                  this.fileCommentStr = this.loadOptions.decodeFileName(i2);
1596                }
1597              }
1598            },
1599            findExtraFieldUnicodePath: function() {
1600              var e2 = this.extraFields[28789];
1601              if (e2) {
1602                var t2 = n(e2.value);
1603                return 1 !== t2.readInt(1) ? null : a(this.fileName) !== t2.readInt(4) ? null : o.utf8decode(t2.readData(e2.length - 5));
1604              }
1605              return null;
1606            },
1607            findExtraFieldUnicodeComment: function() {
1608              var e2 = this.extraFields[25461];
1609              if (e2) {
1610                var t2 = n(e2.value);
1611                return 1 !== t2.readInt(1) ? null : a(this.fileComment) !== t2.readInt(4) ? null : o.utf8decode(t2.readData(e2.length - 5));
1612              }
1613              return null;
1614            }
1615          }, t.exports = l;
1616        }, {
1617          "./compressedObject": 2,
1618          "./compressions": 3,
1619          "./crc32": 4,
1620          "./reader/readerFor": 22,
1621          "./support": 30,
1622          "./utf8": 31,
1623          "./utils": 32
1624        }],
1625        35: [function(e, t, r) {
1626          "use strict";
1627          function n(e2, t2, r2) {
1628            this.name = e2, this.dir = r2.dir, this.date = r2.date, this.comment = r2.comment, this.unixPermissions = r2.unixPermissions, this.dosPermissions = r2.dosPermissions, this._data = t2, this._dataBinary = r2.binary, this.options = {
1629              compression: r2.compression,
1630              compressionOptions: r2.compressionOptions
1631            };
1632          }
1633          var s = e("./stream/StreamHelper"), i = e("./stream/DataWorker"), a = e("./utf8"), o = e("./compressedObject"), h = e("./stream/GenericWorker");
1634          n.prototype = {
1635            internalStream: function(e2) {
1636              var t2 = null, r2 = "string";
1637              try {
1638                if (!e2) throw new Error("No output type specified.");
1639                var n2 = "string" === (r2 = e2.toLowerCase()) || "text" === r2;
1640                "binarystring" !== r2 && "text" !== r2 || (r2 = "string"), t2 = this._decompressWorker();
1641                var i2 = !this._dataBinary;
1642                i2 && !n2 && (t2 = t2.pipe(new a.Utf8EncodeWorker())), !i2 && n2 && (t2 = t2.pipe(new a.Utf8DecodeWorker()));
1643              } catch (e3) {
1644                (t2 = new h("error")).error(e3);
1645              }
1646              return new s(t2, r2, "");
1647            },
1648            async: function(e2, t2) {
1649              return this.internalStream(e2).accumulate(t2);
1650            },
1651            nodeStream: function(e2, t2) {
1652              return this.internalStream(e2 || "nodebuffer").toNodejsStream(t2);
1653            },
1654            _compressWorker: function(e2, t2) {
1655              if (this._data instanceof o && this._data.compression.magic === e2.magic) return this._data.getCompressedWorker();
1656              var r2 = this._decompressWorker();
1657              return this._dataBinary || (r2 = r2.pipe(new a.Utf8EncodeWorker())), o.createWorkerFrom(r2, e2, t2);
1658            },
1659            _decompressWorker: function() {
1660              return this._data instanceof o ? this._data.getContentWorker() : this._data instanceof h ? this._data : new i(this._data);
1661            }
1662          };
1663          for (var u = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], l = function() {
1664            throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
1665          }, f = 0; f < u.length; f++) n.prototype[u[f]] = l;
1666          t.exports = n;
1667        }, {
1668          "./compressedObject": 2,
1669          "./stream/DataWorker": 27,
1670          "./stream/GenericWorker": 28,
1671          "./stream/StreamHelper": 29,
1672          "./utf8": 31
1673        }],
1674        36: [function(e, l, t) {
1675          (function(t2) {
1676            "use strict";
1677            var r, n, e2 = t2.MutationObserver || t2.WebKitMutationObserver;
1678            if (e2) {
1679              var i = 0, s = new e2(u), a = t2.document.createTextNode("");
1680              s.observe(a, {
1681                characterData: true
1682              }), r = function() {
1683                a.data = i = ++i % 2;
1684              };
1685            } else if (t2.setImmediate || void 0 === t2.MessageChannel) r = "document" in t2 && "onreadystatechange" in t2.document.createElement("script") ? function() {
1686              var e3 = t2.document.createElement("script");
1687              e3.onreadystatechange = function() {
1688                u(), e3.onreadystatechange = null, e3.parentNode.removeChild(e3), e3 = null;
1689              }, t2.document.documentElement.appendChild(e3);
1690            } : function() {
1691              setTimeout(u, 0);
1692            };
1693            else {
1694              var o = new t2.MessageChannel();
1695              o.port1.onmessage = u, r = function() {
1696                o.port2.postMessage(0);
1697              };
1698            }
1699            var h = [];
1700            function u() {
1701              var e3, t3;
1702              n = true;
1703              for (var r2 = h.length; r2; ) {
1704                for (t3 = h, h = [], e3 = -1; ++e3 < r2; ) t3[e3]();
1705                r2 = h.length;
1706              }
1707              n = false;
1708            }
1709            l.exports = function(e3) {
1710              1 !== h.push(e3) || n || r();
1711            };
1712          }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {});
1713        }, {}],
1714        37: [function(e, t, r) {
1715          "use strict";
1716          var i = e("immediate");
1717          function u() {
1718          }
1719          var l = {}, s = ["REJECTED"], a = ["FULFILLED"], n = ["PENDING"];
1720          function o(e2) {
1721            if ("function" != typeof e2) throw new TypeError("resolver must be a function");
1722            this.state = n, this.queue = [], this.outcome = void 0, e2 !== u && d(this, e2);
1723          }
1724          function h(e2, t2, r2) {
1725            this.promise = e2, "function" == typeof t2 && (this.onFulfilled = t2, this.callFulfilled = this.otherCallFulfilled), "function" == typeof r2 && (this.onRejected = r2, this.callRejected = this.otherCallRejected);
1726          }
1727          function f(t2, r2, n2) {
1728            i(function() {
1729              var e2;
1730              try {
1731                e2 = r2(n2);
1732              } catch (e3) {
1733                return l.reject(t2, e3);
1734              }
1735              e2 === t2 ? l.reject(t2, new TypeError("Cannot resolve promise with itself")) : l.resolve(t2, e2);
1736            });
1737          }
1738          function c(e2) {
1739            var t2 = e2 && e2.then;
1740            if (e2 && ("object" == typeof e2 || "function" == typeof e2) && "function" == typeof t2) return function() {
1741              t2.apply(e2, arguments);
1742            };
1743          }
1744          function d(t2, e2) {
1745            var r2 = false;
1746            function n2(e3) {
1747              r2 || (r2 = true, l.reject(t2, e3));
1748            }
1749            function i2(e3) {
1750              r2 || (r2 = true, l.resolve(t2, e3));
1751            }
1752            var s2 = p(function() {
1753              e2(i2, n2);
1754            });
1755            "error" === s2.status && n2(s2.value);
1756          }
1757          function p(e2, t2) {
1758            var r2 = {};
1759            try {
1760              r2.value = e2(t2), r2.status = "success";
1761            } catch (e3) {
1762              r2.status = "error", r2.value = e3;
1763            }
1764            return r2;
1765          }
1766          (t.exports = o).prototype.finally = function(t2) {
1767            if ("function" != typeof t2) return this;
1768            var r2 = this.constructor;
1769            return this.then(function(e2) {
1770              return r2.resolve(t2()).then(function() {
1771                return e2;
1772              });
1773            }, function(e2) {
1774              return r2.resolve(t2()).then(function() {
1775                throw e2;
1776              });
1777            });
1778          }, o.prototype.catch = function(e2) {
1779            return this.then(null, e2);
1780          }, o.prototype.then = function(e2, t2) {
1781            if ("function" != typeof e2 && this.state === a || "function" != typeof t2 && this.state === s) return this;
1782            var r2 = new this.constructor(u);
1783            this.state !== n ? f(r2, this.state === a ? e2 : t2, this.outcome) : this.queue.push(new h(r2, e2, t2));
1784            return r2;
1785          }, h.prototype.callFulfilled = function(e2) {
1786            l.resolve(this.promise, e2);
1787          }, h.prototype.otherCallFulfilled = function(e2) {
1788            f(this.promise, this.onFulfilled, e2);
1789          }, h.prototype.callRejected = function(e2) {
1790            l.reject(this.promise, e2);
1791          }, h.prototype.otherCallRejected = function(e2) {
1792            f(this.promise, this.onRejected, e2);
1793          }, l.resolve = function(e2, t2) {
1794            var r2 = p(c, t2);
1795            if ("error" === r2.status) return l.reject(e2, r2.value);
1796            var n2 = r2.value;
1797            if (n2) d(e2, n2);
1798            else {
1799              e2.state = a, e2.outcome = t2;
1800              for (var i2 = -1, s2 = e2.queue.length; ++i2 < s2; ) e2.queue[i2].callFulfilled(t2);
1801            }
1802            return e2;
1803          }, l.reject = function(e2, t2) {
1804            e2.state = s, e2.outcome = t2;
1805            for (var r2 = -1, n2 = e2.queue.length; ++r2 < n2; ) e2.queue[r2].callRejected(t2);
1806            return e2;
1807          }, o.resolve = function(e2) {
1808            if (e2 instanceof this) return e2;
1809            return l.resolve(new this(u), e2);
1810          }, o.reject = function(e2) {
1811            var t2 = new this(u);
1812            return l.reject(t2, e2);
1813          }, o.all = function(e2) {
1814            var r2 = this;
1815            if ("[object Array]" !== Object.prototype.toString.call(e2)) return this.reject(new TypeError("must be an array"));
1816            var n2 = e2.length, i2 = false;
1817            if (!n2) return this.resolve([]);
1818            var s2 = new Array(n2), a2 = 0, t2 = -1, o2 = new this(u);
1819            for (; ++t2 < n2; ) h2(e2[t2], t2);
1820            return o2;
1821            function h2(e3, t3) {
1822              r2.resolve(e3).then(function(e4) {
1823                s2[t3] = e4, ++a2 !== n2 || i2 || (i2 = true, l.resolve(o2, s2));
1824              }, function(e4) {
1825                i2 || (i2 = true, l.reject(o2, e4));
1826              });
1827            }
1828          }, o.race = function(e2) {
1829            var t2 = this;
1830            if ("[object Array]" !== Object.prototype.toString.call(e2)) return this.reject(new TypeError("must be an array"));
1831            var r2 = e2.length, n2 = false;
1832            if (!r2) return this.resolve([]);
1833            var i2 = -1, s2 = new this(u);
1834            for (; ++i2 < r2; ) a2 = e2[i2], t2.resolve(a2).then(function(e3) {
1835              n2 || (n2 = true, l.resolve(s2, e3));
1836            }, function(e3) {
1837              n2 || (n2 = true, l.reject(s2, e3));
1838            });
1839            var a2;
1840            return s2;
1841          };
1842        }, {
1843          immediate: 36
1844        }],
1845        38: [function(e, t, r) {
1846          "use strict";
1847          var n = {};
1848          (0, e("./lib/utils/common").assign)(n, e("./lib/deflate"), e("./lib/inflate"), e("./lib/zlib/constants")), t.exports = n;
1849        }, {
1850          "./lib/deflate": 39,
1851          "./lib/inflate": 40,
1852          "./lib/utils/common": 41,
1853          "./lib/zlib/constants": 44
1854        }],
1855        39: [function(e, t, r) {
1856          "use strict";
1857          var a = e("./zlib/deflate"), o = e("./utils/common"), h = e("./utils/strings"), i = e("./zlib/messages"), s = e("./zlib/zstream"), u = Object.prototype.toString, l = 0, f = -1, c = 0, d = 8;
1858          function p(e2) {
1859            if (!(this instanceof p)) return new p(e2);
1860            this.options = o.assign({
1861              level: f,
1862              method: d,
1863              chunkSize: 16384,
1864              windowBits: 15,
1865              memLevel: 8,
1866              strategy: c,
1867              to: ""
1868            }, e2 || {});
1869            var t2 = this.options;
1870            t2.raw && 0 < t2.windowBits ? t2.windowBits = -t2.windowBits : t2.gzip && 0 < t2.windowBits && t2.windowBits < 16 && (t2.windowBits += 16), this.err = 0, this.msg = "", this.ended = false, this.chunks = [], this.strm = new s(), this.strm.avail_out = 0;
1871            var r2 = a.deflateInit2(this.strm, t2.level, t2.method, t2.windowBits, t2.memLevel, t2.strategy);
1872            if (r2 !== l) throw new Error(i[r2]);
1873            if (t2.header && a.deflateSetHeader(this.strm, t2.header), t2.dictionary) {
1874              var n2;
1875              if (n2 = "string" == typeof t2.dictionary ? h.string2buf(t2.dictionary) : "[object ArrayBuffer]" === u.call(t2.dictionary) ? new Uint8Array(t2.dictionary) : t2.dictionary, (r2 = a.deflateSetDictionary(this.strm, n2)) !== l) throw new Error(i[r2]);
1876              this._dict_set = true;
1877            }
1878          }
1879          function n(e2, t2) {
1880            var r2 = new p(t2);
1881            if (r2.push(e2, true), r2.err) throw r2.msg || i[r2.err];
1882            return r2.result;
1883          }
1884          p.prototype.push = function(e2, t2) {
1885            var r2, n2, i2 = this.strm, s2 = this.options.chunkSize;
1886            if (this.ended) return false;
1887            n2 = t2 === ~~t2 ? t2 : true === t2 ? 4 : 0, "string" == typeof e2 ? i2.input = h.string2buf(e2) : "[object ArrayBuffer]" === u.call(e2) ? i2.input = new Uint8Array(e2) : i2.input = e2, i2.next_in = 0, i2.avail_in = i2.input.length;
1888            do {
1889              if (0 === i2.avail_out && (i2.output = new o.Buf8(s2), i2.next_out = 0, i2.avail_out = s2), 1 !== (r2 = a.deflate(i2, n2)) && r2 !== l) return this.onEnd(r2), !(this.ended = true);
1890              0 !== i2.avail_out && (0 !== i2.avail_in || 4 !== n2 && 2 !== n2) || ("string" === this.options.to ? this.onData(h.buf2binstring(o.shrinkBuf(i2.output, i2.next_out))) : this.onData(o.shrinkBuf(i2.output, i2.next_out)));
1891            } while ((0 < i2.avail_in || 0 === i2.avail_out) && 1 !== r2);
1892            return 4 === n2 ? (r2 = a.deflateEnd(this.strm), this.onEnd(r2), this.ended = true, r2 === l) : 2 !== n2 || (this.onEnd(l), !(i2.avail_out = 0));
1893          }, p.prototype.onData = function(e2) {
1894            this.chunks.push(e2);
1895          }, p.prototype.onEnd = function(e2) {
1896            e2 === l && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = o.flattenChunks(this.chunks)), this.chunks = [], this.err = e2, this.msg = this.strm.msg;
1897          }, r.Deflate = p, r.deflate = n, r.deflateRaw = function(e2, t2) {
1898            return (t2 = t2 || {}).raw = true, n(e2, t2);
1899          }, r.gzip = function(e2, t2) {
1900            return (t2 = t2 || {}).gzip = true, n(e2, t2);
1901          };
1902        }, {
1903          "./utils/common": 41,
1904          "./utils/strings": 42,
1905          "./zlib/deflate": 46,
1906          "./zlib/messages": 51,
1907          "./zlib/zstream": 53
1908        }],
1909        40: [function(e, t, r) {
1910          "use strict";
1911          var c = e("./zlib/inflate"), d = e("./utils/common"), p = e("./utils/strings"), m = e("./zlib/constants"), n = e("./zlib/messages"), i = e("./zlib/zstream"), s = e("./zlib/gzheader"), _ = Object.prototype.toString;
1912          function a(e2) {
1913            if (!(this instanceof a)) return new a(e2);
1914            this.options = d.assign({
1915              chunkSize: 16384,
1916              windowBits: 0,
1917              to: ""
1918            }, e2 || {});
1919            var t2 = this.options;
1920            t2.raw && 0 <= t2.windowBits && t2.windowBits < 16 && (t2.windowBits = -t2.windowBits, 0 === t2.windowBits && (t2.windowBits = -15)), !(0 <= t2.windowBits && t2.windowBits < 16) || e2 && e2.windowBits || (t2.windowBits += 32), 15 < t2.windowBits && t2.windowBits < 48 && 0 == (15 & t2.windowBits) && (t2.windowBits |= 15), this.err = 0, this.msg = "", this.ended = false, this.chunks = [], this.strm = new i(), this.strm.avail_out = 0;
1921            var r2 = c.inflateInit2(this.strm, t2.windowBits);
1922            if (r2 !== m.Z_OK) throw new Error(n[r2]);
1923            this.header = new s(), c.inflateGetHeader(this.strm, this.header);
1924          }
1925          function o(e2, t2) {
1926            var r2 = new a(t2);
1927            if (r2.push(e2, true), r2.err) throw r2.msg || n[r2.err];
1928            return r2.result;
1929          }
1930          a.prototype.push = function(e2, t2) {
1931            var r2, n2, i2, s2, a2, o2, h = this.strm, u = this.options.chunkSize, l = this.options.dictionary, f = false;
1932            if (this.ended) return false;
1933            n2 = t2 === ~~t2 ? t2 : true === t2 ? m.Z_FINISH : m.Z_NO_FLUSH, "string" == typeof e2 ? h.input = p.binstring2buf(e2) : "[object ArrayBuffer]" === _.call(e2) ? h.input = new Uint8Array(e2) : h.input = e2, h.next_in = 0, h.avail_in = h.input.length;
1934            do {
1935              if (0 === h.avail_out && (h.output = new d.Buf8(u), h.next_out = 0, h.avail_out = u), (r2 = c.inflate(h, m.Z_NO_FLUSH)) === m.Z_NEED_DICT && l && (o2 = "string" == typeof l ? p.string2buf(l) : "[object ArrayBuffer]" === _.call(l) ? new Uint8Array(l) : l, r2 = c.inflateSetDictionary(this.strm, o2)), r2 === m.Z_BUF_ERROR && true === f && (r2 = m.Z_OK, f = false), r2 !== m.Z_STREAM_END && r2 !== m.Z_OK) return this.onEnd(r2), !(this.ended = true);
1936              h.next_out && (0 !== h.avail_out && r2 !== m.Z_STREAM_END && (0 !== h.avail_in || n2 !== m.Z_FINISH && n2 !== m.Z_SYNC_FLUSH) || ("string" === this.options.to ? (i2 = p.utf8border(h.output, h.next_out), s2 = h.next_out - i2, a2 = p.buf2string(h.output, i2), h.next_out = s2, h.avail_out = u - s2, s2 && d.arraySet(h.output, h.output, i2, s2, 0), this.onData(a2)) : this.onData(d.shrinkBuf(h.output, h.next_out)))), 0 === h.avail_in && 0 === h.avail_out && (f = true);
1937            } while ((0 < h.avail_in || 0 === h.avail_out) && r2 !== m.Z_STREAM_END);
1938            return r2 === m.Z_STREAM_END && (n2 = m.Z_FINISH), n2 === m.Z_FINISH ? (r2 = c.inflateEnd(this.strm), this.onEnd(r2), this.ended = true, r2 === m.Z_OK) : n2 !== m.Z_SYNC_FLUSH || (this.onEnd(m.Z_OK), !(h.avail_out = 0));
1939          }, a.prototype.onData = function(e2) {
1940            this.chunks.push(e2);
1941          }, a.prototype.onEnd = function(e2) {
1942            e2 === m.Z_OK && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = d.flattenChunks(this.chunks)), this.chunks = [], this.err = e2, this.msg = this.strm.msg;
1943          }, r.Inflate = a, r.inflate = o, r.inflateRaw = function(e2, t2) {
1944            return (t2 = t2 || {}).raw = true, o(e2, t2);
1945          }, r.ungzip = o;
1946        }, {
1947          "./utils/common": 41,
1948          "./utils/strings": 42,
1949          "./zlib/constants": 44,
1950          "./zlib/gzheader": 47,
1951          "./zlib/inflate": 49,
1952          "./zlib/messages": 51,
1953          "./zlib/zstream": 53
1954        }],
1955        41: [function(e, t, r) {
1956          "use strict";
1957          var n = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array && "undefined" != typeof Int32Array;
1958          r.assign = function(e2) {
1959            for (var t2 = Array.prototype.slice.call(arguments, 1); t2.length; ) {
1960              var r2 = t2.shift();
1961              if (r2) {
1962                if ("object" != typeof r2) throw new TypeError(r2 + "must be non-object");
1963                for (var n2 in r2) r2.hasOwnProperty(n2) && (e2[n2] = r2[n2]);
1964              }
1965            }
1966            return e2;
1967          }, r.shrinkBuf = function(e2, t2) {
1968            return e2.length === t2 ? e2 : e2.subarray ? e2.subarray(0, t2) : (e2.length = t2, e2);
1969          };
1970          var i = {
1971            arraySet: function(e2, t2, r2, n2, i2) {
1972              if (t2.subarray && e2.subarray) e2.set(t2.subarray(r2, r2 + n2), i2);
1973              else for (var s2 = 0; s2 < n2; s2++) e2[i2 + s2] = t2[r2 + s2];
1974            },
1975            flattenChunks: function(e2) {
1976              var t2, r2, n2, i2, s2, a;
1977              for (t2 = n2 = 0, r2 = e2.length; t2 < r2; t2++) n2 += e2[t2].length;
1978              for (a = new Uint8Array(n2), t2 = i2 = 0, r2 = e2.length; t2 < r2; t2++) s2 = e2[t2], a.set(s2, i2), i2 += s2.length;
1979              return a;
1980            }
1981          }, s = {
1982            arraySet: function(e2, t2, r2, n2, i2) {
1983              for (var s2 = 0; s2 < n2; s2++) e2[i2 + s2] = t2[r2 + s2];
1984            },
1985            flattenChunks: function(e2) {
1986              return [].concat.apply([], e2);
1987            }
1988          };
1989          r.setTyped = function(e2) {
1990            e2 ? (r.Buf8 = Uint8Array, r.Buf16 = Uint16Array, r.Buf32 = Int32Array, r.assign(r, i)) : (r.Buf8 = Array, r.Buf16 = Array, r.Buf32 = Array, r.assign(r, s));
1991          }, r.setTyped(n);
1992        }, {}],
1993        42: [function(e, t, r) {
1994          "use strict";
1995          var h = e("./common"), i = true, s = true;
1996          try {
1997            String.fromCharCode.apply(null, [0]);
1998          } catch (e2) {
1999            i = false;
2000          }
2001          try {
2002            String.fromCharCode.apply(null, new Uint8Array(1));
2003          } catch (e2) {
2004            s = false;
2005          }
2006          for (var u = new h.Buf8(256), n = 0; n < 256; n++) u[n] = 252 <= n ? 6 : 248 <= n ? 5 : 240 <= n ? 4 : 224 <= n ? 3 : 192 <= n ? 2 : 1;
2007          function l(e2, t2) {
2008            if (t2 < 65537 && (e2.subarray && s || !e2.subarray && i)) return String.fromCharCode.apply(null, h.shrinkBuf(e2, t2));
2009            for (var r2 = "", n2 = 0; n2 < t2; n2++) r2 += String.fromCharCode(e2[n2]);
2010            return r2;
2011          }
2012          u[254] = u[254] = 1, r.string2buf = function(e2) {
2013            var t2, r2, n2, i2, s2, a = e2.length, o = 0;
2014            for (i2 = 0; i2 < a; i2++) 55296 == (64512 & (r2 = e2.charCodeAt(i2))) && i2 + 1 < a && 56320 == (64512 & (n2 = e2.charCodeAt(i2 + 1))) && (r2 = 65536 + (r2 - 55296 << 10) + (n2 - 56320), i2++), o += r2 < 128 ? 1 : r2 < 2048 ? 2 : r2 < 65536 ? 3 : 4;
2015            for (t2 = new h.Buf8(o), i2 = s2 = 0; s2 < o; i2++) 55296 == (64512 & (r2 = e2.charCodeAt(i2))) && i2 + 1 < a && 56320 == (64512 & (n2 = e2.charCodeAt(i2 + 1))) && (r2 = 65536 + (r2 - 55296 << 10) + (n2 - 56320), i2++), r2 < 128 ? t2[s2++] = r2 : (r2 < 2048 ? t2[s2++] = 192 | r2 >>> 6 : (r2 < 65536 ? t2[s2++] = 224 | r2 >>> 12 : (t2[s2++] = 240 | r2 >>> 18, t2[s2++] = 128 | r2 >>> 12 & 63), t2[s2++] = 128 | r2 >>> 6 & 63), t2[s2++] = 128 | 63 & r2);
2016            return t2;
2017          }, r.buf2binstring = function(e2) {
2018            return l(e2, e2.length);
2019          }, r.binstring2buf = function(e2) {
2020            for (var t2 = new h.Buf8(e2.length), r2 = 0, n2 = t2.length; r2 < n2; r2++) t2[r2] = e2.charCodeAt(r2);
2021            return t2;
2022          }, r.buf2string = function(e2, t2) {
2023            var r2, n2, i2, s2, a = t2 || e2.length, o = new Array(2 * a);
2024            for (r2 = n2 = 0; r2 < a; ) if ((i2 = e2[r2++]) < 128) o[n2++] = i2;
2025            else if (4 < (s2 = u[i2])) o[n2++] = 65533, r2 += s2 - 1;
2026            else {
2027              for (i2 &= 2 === s2 ? 31 : 3 === s2 ? 15 : 7; 1 < s2 && r2 < a; ) i2 = i2 << 6 | 63 & e2[r2++], s2--;
2028              1 < s2 ? o[n2++] = 65533 : i2 < 65536 ? o[n2++] = i2 : (i2 -= 65536, o[n2++] = 55296 | i2 >> 10 & 1023, o[n2++] = 56320 | 1023 & i2);
2029            }
2030            return l(o, n2);
2031          }, r.utf8border = function(e2, t2) {
2032            var r2;
2033            for ((t2 = t2 || e2.length) > e2.length && (t2 = e2.length), r2 = t2 - 1; 0 <= r2 && 128 == (192 & e2[r2]); ) r2--;
2034            return r2 < 0 ? t2 : 0 === r2 ? t2 : r2 + u[e2[r2]] > t2 ? r2 : t2;
2035          };
2036        }, {
2037          "./common": 41
2038        }],
2039        43: [function(e, t, r) {
2040          "use strict";
2041          t.exports = function(e2, t2, r2, n) {
2042            for (var i = 65535 & e2 | 0, s = e2 >>> 16 & 65535 | 0, a = 0; 0 !== r2; ) {
2043              for (r2 -= a = 2e3 < r2 ? 2e3 : r2; s = s + (i = i + t2[n++] | 0) | 0, --a; ) ;
2044              i %= 65521, s %= 65521;
2045            }
2046            return i | s << 16 | 0;
2047          };
2048        }, {}],
2049        44: [function(e, t, r) {
2050          "use strict";
2051          t.exports = {
2052            Z_NO_FLUSH: 0,
2053            Z_PARTIAL_FLUSH: 1,
2054            Z_SYNC_FLUSH: 2,
2055            Z_FULL_FLUSH: 3,
2056            Z_FINISH: 4,
2057            Z_BLOCK: 5,
2058            Z_TREES: 6,
2059            Z_OK: 0,
2060            Z_STREAM_END: 1,
2061            Z_NEED_DICT: 2,
2062            Z_ERRNO: -1,
2063            Z_STREAM_ERROR: -2,
2064            Z_DATA_ERROR: -3,
2065            Z_BUF_ERROR: -5,
2066            Z_NO_COMPRESSION: 0,
2067            Z_BEST_SPEED: 1,
2068            Z_BEST_COMPRESSION: 9,
2069            Z_DEFAULT_COMPRESSION: -1,
2070            Z_FILTERED: 1,
2071            Z_HUFFMAN_ONLY: 2,
2072            Z_RLE: 3,
2073            Z_FIXED: 4,
2074            Z_DEFAULT_STRATEGY: 0,
2075            Z_BINARY: 0,
2076            Z_TEXT: 1,
2077            Z_UNKNOWN: 2,
2078            Z_DEFLATED: 8
2079          };
2080        }, {}],
2081        45: [function(e, t, r) {
2082          "use strict";
2083          var o = function() {
2084            for (var e2, t2 = [], r2 = 0; r2 < 256; r2++) {
2085              e2 = r2;
2086              for (var n = 0; n < 8; n++) e2 = 1 & e2 ? 3988292384 ^ e2 >>> 1 : e2 >>> 1;
2087              t2[r2] = e2;
2088            }
2089            return t2;
2090          }();
2091          t.exports = function(e2, t2, r2, n) {
2092            var i = o, s = n + r2;
2093            e2 ^= -1;
2094            for (var a = n; a < s; a++) e2 = e2 >>> 8 ^ i[255 & (e2 ^ t2[a])];
2095            return -1 ^ e2;
2096          };
2097        }, {}],
2098        46: [function(e, t, r) {
2099          "use strict";
2100          var h, c = e("../utils/common"), u = e("./trees"), d = e("./adler32"), p = e("./crc32"), n = e("./messages"), l = 0, f = 4, m = 0, _ = -2, g = -1, b = 4, i = 2, v = 8, y = 9, s = 286, a = 30, o = 19, w = 2 * s + 1, k = 15, x = 3, S = 258, z = S + x + 1, C = 42, E = 113, A = 1, I = 2, O = 3, B = 4;
2101          function R(e2, t2) {
2102            return e2.msg = n[t2], t2;
2103          }
2104          function T(e2) {
2105            return (e2 << 1) - (4 < e2 ? 9 : 0);
2106          }
2107          function D(e2) {
2108            for (var t2 = e2.length; 0 <= --t2; ) e2[t2] = 0;
2109          }
2110          function F(e2) {
2111            var t2 = e2.state, r2 = t2.pending;
2112            r2 > e2.avail_out && (r2 = e2.avail_out), 0 !== r2 && (c.arraySet(e2.output, t2.pending_buf, t2.pending_out, r2, e2.next_out), e2.next_out += r2, t2.pending_out += r2, e2.total_out += r2, e2.avail_out -= r2, t2.pending -= r2, 0 === t2.pending && (t2.pending_out = 0));
2113          }
2114          function N(e2, t2) {
2115            u._tr_flush_block(e2, 0 <= e2.block_start ? e2.block_start : -1, e2.strstart - e2.block_start, t2), e2.block_start = e2.strstart, F(e2.strm);
2116          }
2117          function U(e2, t2) {
2118            e2.pending_buf[e2.pending++] = t2;
2119          }
2120          function P(e2, t2) {
2121            e2.pending_buf[e2.pending++] = t2 >>> 8 & 255, e2.pending_buf[e2.pending++] = 255 & t2;
2122          }
2123          function L(e2, t2) {
2124            var r2, n2, i2 = e2.max_chain_length, s2 = e2.strstart, a2 = e2.prev_length, o2 = e2.nice_match, h2 = e2.strstart > e2.w_size - z ? e2.strstart - (e2.w_size - z) : 0, u2 = e2.window, l2 = e2.w_mask, f2 = e2.prev, c2 = e2.strstart + S, d2 = u2[s2 + a2 - 1], p2 = u2[s2 + a2];
2125            e2.prev_length >= e2.good_match && (i2 >>= 2), o2 > e2.lookahead && (o2 = e2.lookahead);
2126            do {
2127              if (u2[(r2 = t2) + a2] === p2 && u2[r2 + a2 - 1] === d2 && u2[r2] === u2[s2] && u2[++r2] === u2[s2 + 1]) {
2128                s2 += 2, r2++;
2129                do {
2130                } while (u2[++s2] === u2[++r2] && u2[++s2] === u2[++r2] && u2[++s2] === u2[++r2] && u2[++s2] === u2[++r2] && u2[++s2] === u2[++r2] && u2[++s2] === u2[++r2] && u2[++s2] === u2[++r2] && u2[++s2] === u2[++r2] && s2 < c2);
2131                if (n2 = S - (c2 - s2), s2 = c2 - S, a2 < n2) {
2132                  if (e2.match_start = t2, o2 <= (a2 = n2)) break;
2133                  d2 = u2[s2 + a2 - 1], p2 = u2[s2 + a2];
2134                }
2135              }
2136            } while ((t2 = f2[t2 & l2]) > h2 && 0 != --i2);
2137            return a2 <= e2.lookahead ? a2 : e2.lookahead;
2138          }
2139          function j(e2) {
2140            var t2, r2, n2, i2, s2, a2, o2, h2, u2, l2, f2 = e2.w_size;
2141            do {
2142              if (i2 = e2.window_size - e2.lookahead - e2.strstart, e2.strstart >= f2 + (f2 - z)) {
2143                for (c.arraySet(e2.window, e2.window, f2, f2, 0), e2.match_start -= f2, e2.strstart -= f2, e2.block_start -= f2, t2 = r2 = e2.hash_size; n2 = e2.head[--t2], e2.head[t2] = f2 <= n2 ? n2 - f2 : 0, --r2; ) ;
2144                for (t2 = r2 = f2; n2 = e2.prev[--t2], e2.prev[t2] = f2 <= n2 ? n2 - f2 : 0, --r2; ) ;
2145                i2 += f2;
2146              }
2147              if (0 === e2.strm.avail_in) break;
2148              if (a2 = e2.strm, o2 = e2.window, h2 = e2.strstart + e2.lookahead, u2 = i2, l2 = void 0, l2 = a2.avail_in, u2 < l2 && (l2 = u2), r2 = 0 === l2 ? 0 : (a2.avail_in -= l2, c.arraySet(o2, a2.input, a2.next_in, l2, h2), 1 === a2.state.wrap ? a2.adler = d(a2.adler, o2, l2, h2) : 2 === a2.state.wrap && (a2.adler = p(a2.adler, o2, l2, h2)), a2.next_in += l2, a2.total_in += l2, l2), e2.lookahead += r2, e2.lookahead + e2.insert >= x) for (s2 = e2.strstart - e2.insert, e2.ins_h = e2.window[s2], e2.ins_h = (e2.ins_h << e2.hash_shift ^ e2.window[s2 + 1]) & e2.hash_mask; e2.insert && (e2.ins_h = (e2.ins_h << e2.hash_shift ^ e2.window[s2 + x - 1]) & e2.hash_mask, e2.prev[s2 & e2.w_mask] = e2.head[e2.ins_h], e2.head[e2.ins_h] = s2, s2++, e2.insert--, !(e2.lookahead + e2.insert < x)); ) ;
2149            } while (e2.lookahead < z && 0 !== e2.strm.avail_in);
2150          }
2151          function Z(e2, t2) {
2152            for (var r2, n2; ; ) {
2153              if (e2.lookahead < z) {
2154                if (j(e2), e2.lookahead < z && t2 === l) return A;
2155                if (0 === e2.lookahead) break;
2156              }
2157              if (r2 = 0, e2.lookahead >= x && (e2.ins_h = (e2.ins_h << e2.hash_shift ^ e2.window[e2.strstart + x - 1]) & e2.hash_mask, r2 = e2.prev[e2.strstart & e2.w_mask] = e2.head[e2.ins_h], e2.head[e2.ins_h] = e2.strstart), 0 !== r2 && e2.strstart - r2 <= e2.w_size - z && (e2.match_length = L(e2, r2)), e2.match_length >= x) {
2158                if (n2 = u._tr_tally(e2, e2.strstart - e2.match_start, e2.match_length - x), e2.lookahead -= e2.match_length, e2.match_length <= e2.max_lazy_match && e2.lookahead >= x) {
2159                  for (e2.match_length--; e2.strstart++, e2.ins_h = (e2.ins_h << e2.hash_shift ^ e2.window[e2.strstart + x - 1]) & e2.hash_mask, r2 = e2.prev[e2.strstart & e2.w_mask] = e2.head[e2.ins_h], e2.head[e2.ins_h] = e2.strstart, 0 != --e2.match_length; ) ;
2160                  e2.strstart++;
2161                } else e2.strstart += e2.match_length, e2.match_length = 0, e2.ins_h = e2.window[e2.strstart], e2.ins_h = (e2.ins_h << e2.hash_shift ^ e2.window[e2.strstart + 1]) & e2.hash_mask;
2162              } else n2 = u._tr_tally(e2, 0, e2.window[e2.strstart]), e2.lookahead--, e2.strstart++;
2163              if (n2 && (N(e2, false), 0 === e2.strm.avail_out)) return A;
2164            }
2165            return e2.insert = e2.strstart < x - 1 ? e2.strstart : x - 1, t2 === f ? (N(e2, true), 0 === e2.strm.avail_out ? O : B) : e2.last_lit && (N(e2, false), 0 === e2.strm.avail_out) ? A : I;
2166          }
2167          function W(e2, t2) {
2168            for (var r2, n2, i2; ; ) {
2169              if (e2.lookahead < z) {
2170                if (j(e2), e2.lookahead < z && t2 === l) return A;
2171                if (0 === e2.lookahead) break;
2172              }
2173              if (r2 = 0, e2.lookahead >= x && (e2.ins_h = (e2.ins_h << e2.hash_shift ^ e2.window[e2.strstart + x - 1]) & e2.hash_mask, r2 = e2.prev[e2.strstart & e2.w_mask] = e2.head[e2.ins_h], e2.head[e2.ins_h] = e2.strstart), e2.prev_length = e2.match_length, e2.prev_match = e2.match_start, e2.match_length = x - 1, 0 !== r2 && e2.prev_length < e2.max_lazy_match && e2.strstart - r2 <= e2.w_size - z && (e2.match_length = L(e2, r2), e2.match_length <= 5 && (1 === e2.strategy || e2.match_length === x && 4096 < e2.strstart - e2.match_start) && (e2.match_length = x - 1)), e2.prev_length >= x && e2.match_length <= e2.prev_length) {
2174                for (i2 = e2.strstart + e2.lookahead - x, n2 = u._tr_tally(e2, e2.strstart - 1 - e2.prev_match, e2.prev_length - x), e2.lookahead -= e2.prev_length - 1, e2.prev_length -= 2; ++e2.strstart <= i2 && (e2.ins_h = (e2.ins_h << e2.hash_shift ^ e2.window[e2.strstart + x - 1]) & e2.hash_mask, r2 = e2.prev[e2.strstart & e2.w_mask] = e2.head[e2.ins_h], e2.head[e2.ins_h] = e2.strstart), 0 != --e2.prev_length; ) ;
2175                if (e2.match_available = 0, e2.match_length = x - 1, e2.strstart++, n2 && (N(e2, false), 0 === e2.strm.avail_out)) return A;
2176              } else if (e2.match_available) {
2177                if ((n2 = u._tr_tally(e2, 0, e2.window[e2.strstart - 1])) && N(e2, false), e2.strstart++, e2.lookahead--, 0 === e2.strm.avail_out) return A;
2178              } else e2.match_available = 1, e2.strstart++, e2.lookahead--;
2179            }
2180            return e2.match_available && (n2 = u._tr_tally(e2, 0, e2.window[e2.strstart - 1]), e2.match_available = 0), e2.insert = e2.strstart < x - 1 ? e2.strstart : x - 1, t2 === f ? (N(e2, true), 0 === e2.strm.avail_out ? O : B) : e2.last_lit && (N(e2, false), 0 === e2.strm.avail_out) ? A : I;
2181          }
2182          function M(e2, t2, r2, n2, i2) {
2183            this.good_length = e2, this.max_lazy = t2, this.nice_length = r2, this.max_chain = n2, this.func = i2;
2184          }
2185          function H() {
2186            this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = v, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new c.Buf16(2 * w), this.dyn_dtree = new c.Buf16(2 * (2 * a + 1)), this.bl_tree = new c.Buf16(2 * (2 * o + 1)), D(this.dyn_ltree), D(this.dyn_dtree), D(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new c.Buf16(k + 1), this.heap = new c.Buf16(2 * s + 1), D(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new c.Buf16(2 * s + 1), D(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;
2187          }
2188          function G(e2) {
2189            var t2;
2190            return e2 && e2.state ? (e2.total_in = e2.total_out = 0, e2.data_type = i, (t2 = e2.state).pending = 0, t2.pending_out = 0, t2.wrap < 0 && (t2.wrap = -t2.wrap), t2.status = t2.wrap ? C : E, e2.adler = 2 === t2.wrap ? 0 : 1, t2.last_flush = l, u._tr_init(t2), m) : R(e2, _);
2191          }
2192          function K(e2) {
2193            var t2 = G(e2);
2194            return t2 === m && function(e3) {
2195              e3.window_size = 2 * e3.w_size, D(e3.head), e3.max_lazy_match = h[e3.level].max_lazy, e3.good_match = h[e3.level].good_length, e3.nice_match = h[e3.level].nice_length, e3.max_chain_length = h[e3.level].max_chain, e3.strstart = 0, e3.block_start = 0, e3.lookahead = 0, e3.insert = 0, e3.match_length = e3.prev_length = x - 1, e3.match_available = 0, e3.ins_h = 0;
2196            }(e2.state), t2;
2197          }
2198          function Y(e2, t2, r2, n2, i2, s2) {
2199            if (!e2) return _;
2200            var a2 = 1;
2201            if (t2 === g && (t2 = 6), n2 < 0 ? (a2 = 0, n2 = -n2) : 15 < n2 && (a2 = 2, n2 -= 16), i2 < 1 || y < i2 || r2 !== v || n2 < 8 || 15 < n2 || t2 < 0 || 9 < t2 || s2 < 0 || b < s2) return R(e2, _);
2202            8 === n2 && (n2 = 9);
2203            var o2 = new H();
2204            return (e2.state = o2).strm = e2, o2.wrap = a2, o2.gzhead = null, o2.w_bits = n2, o2.w_size = 1 << o2.w_bits, o2.w_mask = o2.w_size - 1, o2.hash_bits = i2 + 7, o2.hash_size = 1 << o2.hash_bits, o2.hash_mask = o2.hash_size - 1, o2.hash_shift = ~~((o2.hash_bits + x - 1) / x), o2.window = new c.Buf8(2 * o2.w_size), o2.head = new c.Buf16(o2.hash_size), o2.prev = new c.Buf16(o2.w_size), o2.lit_bufsize = 1 << i2 + 6, o2.pending_buf_size = 4 * o2.lit_bufsize, o2.pending_buf = new c.Buf8(o2.pending_buf_size), o2.d_buf = 1 * o2.lit_bufsize, o2.l_buf = 3 * o2.lit_bufsize, o2.level = t2, o2.strategy = s2, o2.method = r2, K(e2);
2205          }
2206          h = [new M(0, 0, 0, 0, function(e2, t2) {
2207            var r2 = 65535;
2208            for (r2 > e2.pending_buf_size - 5 && (r2 = e2.pending_buf_size - 5); ; ) {
2209              if (e2.lookahead <= 1) {
2210                if (j(e2), 0 === e2.lookahead && t2 === l) return A;
2211                if (0 === e2.lookahead) break;
2212              }
2213              e2.strstart += e2.lookahead, e2.lookahead = 0;
2214              var n2 = e2.block_start + r2;
2215              if ((0 === e2.strstart || e2.strstart >= n2) && (e2.lookahead = e2.strstart - n2, e2.strstart = n2, N(e2, false), 0 === e2.strm.avail_out)) return A;
2216              if (e2.strstart - e2.block_start >= e2.w_size - z && (N(e2, false), 0 === e2.strm.avail_out)) return A;
2217            }
2218            return e2.insert = 0, t2 === f ? (N(e2, true), 0 === e2.strm.avail_out ? O : B) : (e2.strstart > e2.block_start && (N(e2, false), e2.strm.avail_out), A);
2219          }), new M(4, 4, 8, 4, Z), new M(4, 5, 16, 8, Z), new M(4, 6, 32, 32, Z), new M(4, 4, 16, 16, W), new M(8, 16, 32, 32, W), new M(8, 16, 128, 128, W), new M(8, 32, 128, 256, W), new M(32, 128, 258, 1024, W), new M(32, 258, 258, 4096, W)], r.deflateInit = function(e2, t2) {
2220            return Y(e2, t2, v, 15, 8, 0);
2221          }, r.deflateInit2 = Y, r.deflateReset = K, r.deflateResetKeep = G, r.deflateSetHeader = function(e2, t2) {
2222            return e2 && e2.state ? 2 !== e2.state.wrap ? _ : (e2.state.gzhead = t2, m) : _;
2223          }, r.deflate = function(e2, t2) {
2224            var r2, n2, i2, s2;
2225            if (!e2 || !e2.state || 5 < t2 || t2 < 0) return e2 ? R(e2, _) : _;
2226            if (n2 = e2.state, !e2.output || !e2.input && 0 !== e2.avail_in || 666 === n2.status && t2 !== f) return R(e2, 0 === e2.avail_out ? -5 : _);
2227            if (n2.strm = e2, r2 = n2.last_flush, n2.last_flush = t2, n2.status === C) if (2 === n2.wrap) e2.adler = 0, U(n2, 31), U(n2, 139), U(n2, 8), n2.gzhead ? (U(n2, (n2.gzhead.text ? 1 : 0) + (n2.gzhead.hcrc ? 2 : 0) + (n2.gzhead.extra ? 4 : 0) + (n2.gzhead.name ? 8 : 0) + (n2.gzhead.comment ? 16 : 0)), U(n2, 255 & n2.gzhead.time), U(n2, n2.gzhead.time >> 8 & 255), U(n2, n2.gzhead.time >> 16 & 255), U(n2, n2.gzhead.time >> 24 & 255), U(n2, 9 === n2.level ? 2 : 2 <= n2.strategy || n2.level < 2 ? 4 : 0), U(n2, 255 & n2.gzhead.os), n2.gzhead.extra && n2.gzhead.extra.length && (U(n2, 255 & n2.gzhead.extra.length), U(n2, n2.gzhead.extra.length >> 8 & 255)), n2.gzhead.hcrc && (e2.adler = p(e2.adler, n2.pending_buf, n2.pending, 0)), n2.gzindex = 0, n2.status = 69) : (U(n2, 0), U(n2, 0), U(n2, 0), U(n2, 0), U(n2, 0), U(n2, 9 === n2.level ? 2 : 2 <= n2.strategy || n2.level < 2 ? 4 : 0), U(n2, 3), n2.status = E);
2228            else {
2229              var a2 = v + (n2.w_bits - 8 << 4) << 8;
2230              a2 |= (2 <= n2.strategy || n2.level < 2 ? 0 : n2.level < 6 ? 1 : 6 === n2.level ? 2 : 3) << 6, 0 !== n2.strstart && (a2 |= 32), a2 += 31 - a2 % 31, n2.status = E, P(n2, a2), 0 !== n2.strstart && (P(n2, e2.adler >>> 16), P(n2, 65535 & e2.adler)), e2.adler = 1;
2231            }
2232            if (69 === n2.status) if (n2.gzhead.extra) {
2233              for (i2 = n2.pending; n2.gzindex < (65535 & n2.gzhead.extra.length) && (n2.pending !== n2.pending_buf_size || (n2.gzhead.hcrc && n2.pending > i2 && (e2.adler = p(e2.adler, n2.pending_buf, n2.pending - i2, i2)), F(e2), i2 = n2.pending, n2.pending !== n2.pending_buf_size)); ) U(n2, 255 & n2.gzhead.extra[n2.gzindex]), n2.gzindex++;
2234              n2.gzhead.hcrc && n2.pending > i2 && (e2.adler = p(e2.adler, n2.pending_buf, n2.pending - i2, i2)), n2.gzindex === n2.gzhead.extra.length && (n2.gzindex = 0, n2.status = 73);
2235            } else n2.status = 73;
2236            if (73 === n2.status) if (n2.gzhead.name) {
2237              i2 = n2.pending;
2238              do {
2239                if (n2.pending === n2.pending_buf_size && (n2.gzhead.hcrc && n2.pending > i2 && (e2.adler = p(e2.adler, n2.pending_buf, n2.pending - i2, i2)), F(e2), i2 = n2.pending, n2.pending === n2.pending_buf_size)) {
2240                  s2 = 1;
2241                  break;
2242                }
2243                s2 = n2.gzindex < n2.gzhead.name.length ? 255 & n2.gzhead.name.charCodeAt(n2.gzindex++) : 0, U(n2, s2);
2244              } while (0 !== s2);
2245              n2.gzhead.hcrc && n2.pending > i2 && (e2.adler = p(e2.adler, n2.pending_buf, n2.pending - i2, i2)), 0 === s2 && (n2.gzindex = 0, n2.status = 91);
2246            } else n2.status = 91;
2247            if (91 === n2.status) if (n2.gzhead.comment) {
2248              i2 = n2.pending;
2249              do {
2250                if (n2.pending === n2.pending_buf_size && (n2.gzhead.hcrc && n2.pending > i2 && (e2.adler = p(e2.adler, n2.pending_buf, n2.pending - i2, i2)), F(e2), i2 = n2.pending, n2.pending === n2.pending_buf_size)) {
2251                  s2 = 1;
2252                  break;
2253                }
2254                s2 = n2.gzindex < n2.gzhead.comment.length ? 255 & n2.gzhead.comment.charCodeAt(n2.gzindex++) : 0, U(n2, s2);
2255              } while (0 !== s2);
2256              n2.gzhead.hcrc && n2.pending > i2 && (e2.adler = p(e2.adler, n2.pending_buf, n2.pending - i2, i2)), 0 === s2 && (n2.status = 103);
2257            } else n2.status = 103;
2258            if (103 === n2.status && (n2.gzhead.hcrc ? (n2.pending + 2 > n2.pending_buf_size && F(e2), n2.pending + 2 <= n2.pending_buf_size && (U(n2, 255 & e2.adler), U(n2, e2.adler >> 8 & 255), e2.adler = 0, n2.status = E)) : n2.status = E), 0 !== n2.pending) {
2259              if (F(e2), 0 === e2.avail_out) return n2.last_flush = -1, m;
2260            } else if (0 === e2.avail_in && T(t2) <= T(r2) && t2 !== f) return R(e2, -5);
2261            if (666 === n2.status && 0 !== e2.avail_in) return R(e2, -5);
2262            if (0 !== e2.avail_in || 0 !== n2.lookahead || t2 !== l && 666 !== n2.status) {
2263              var o2 = 2 === n2.strategy ? function(e3, t3) {
2264                for (var r3; ; ) {
2265                  if (0 === e3.lookahead && (j(e3), 0 === e3.lookahead)) {
2266                    if (t3 === l) return A;
2267                    break;
2268                  }
2269                  if (e3.match_length = 0, r3 = u._tr_tally(e3, 0, e3.window[e3.strstart]), e3.lookahead--, e3.strstart++, r3 && (N(e3, false), 0 === e3.strm.avail_out)) return A;
2270                }
2271                return e3.insert = 0, t3 === f ? (N(e3, true), 0 === e3.strm.avail_out ? O : B) : e3.last_lit && (N(e3, false), 0 === e3.strm.avail_out) ? A : I;
2272              }(n2, t2) : 3 === n2.strategy ? function(e3, t3) {
2273                for (var r3, n3, i3, s3, a3 = e3.window; ; ) {
2274                  if (e3.lookahead <= S) {
2275                    if (j(e3), e3.lookahead <= S && t3 === l) return A;
2276                    if (0 === e3.lookahead) break;
2277                  }
2278                  if (e3.match_length = 0, e3.lookahead >= x && 0 < e3.strstart && (n3 = a3[i3 = e3.strstart - 1]) === a3[++i3] && n3 === a3[++i3] && n3 === a3[++i3]) {
2279                    s3 = e3.strstart + S;
2280                    do {
2281                    } while (n3 === a3[++i3] && n3 === a3[++i3] && n3 === a3[++i3] && n3 === a3[++i3] && n3 === a3[++i3] && n3 === a3[++i3] && n3 === a3[++i3] && n3 === a3[++i3] && i3 < s3);
2282                    e3.match_length = S - (s3 - i3), e3.match_length > e3.lookahead && (e3.match_length = e3.lookahead);
2283                  }
2284                  if (e3.match_length >= x ? (r3 = u._tr_tally(e3, 1, e3.match_length - x), e3.lookahead -= e3.match_length, e3.strstart += e3.match_length, e3.match_length = 0) : (r3 = u._tr_tally(e3, 0, e3.window[e3.strstart]), e3.lookahead--, e3.strstart++), r3 && (N(e3, false), 0 === e3.strm.avail_out)) return A;
2285                }
2286                return e3.insert = 0, t3 === f ? (N(e3, true), 0 === e3.strm.avail_out ? O : B) : e3.last_lit && (N(e3, false), 0 === e3.strm.avail_out) ? A : I;
2287              }(n2, t2) : h[n2.level].func(n2, t2);
2288              if (o2 !== O && o2 !== B || (n2.status = 666), o2 === A || o2 === O) return 0 === e2.avail_out && (n2.last_flush = -1), m;
2289              if (o2 === I && (1 === t2 ? u._tr_align(n2) : 5 !== t2 && (u._tr_stored_block(n2, 0, 0, false), 3 === t2 && (D(n2.head), 0 === n2.lookahead && (n2.strstart = 0, n2.block_start = 0, n2.insert = 0))), F(e2), 0 === e2.avail_out)) return n2.last_flush = -1, m;
2290            }
2291            return t2 !== f ? m : n2.wrap <= 0 ? 1 : (2 === n2.wrap ? (U(n2, 255 & e2.adler), U(n2, e2.adler >> 8 & 255), U(n2, e2.adler >> 16 & 255), U(n2, e2.adler >> 24 & 255), U(n2, 255 & e2.total_in), U(n2, e2.total_in >> 8 & 255), U(n2, e2.total_in >> 16 & 255), U(n2, e2.total_in >> 24 & 255)) : (P(n2, e2.adler >>> 16), P(n2, 65535 & e2.adler)), F(e2), 0 < n2.wrap && (n2.wrap = -n2.wrap), 0 !== n2.pending ? m : 1);
2292          }, r.deflateEnd = function(e2) {
2293            var t2;
2294            return e2 && e2.state ? (t2 = e2.state.status) !== C && 69 !== t2 && 73 !== t2 && 91 !== t2 && 103 !== t2 && t2 !== E && 666 !== t2 ? R(e2, _) : (e2.state = null, t2 === E ? R(e2, -3) : m) : _;
2295          }, r.deflateSetDictionary = function(e2, t2) {
2296            var r2, n2, i2, s2, a2, o2, h2, u2, l2 = t2.length;
2297            if (!e2 || !e2.state) return _;
2298            if (2 === (s2 = (r2 = e2.state).wrap) || 1 === s2 && r2.status !== C || r2.lookahead) return _;
2299            for (1 === s2 && (e2.adler = d(e2.adler, t2, l2, 0)), r2.wrap = 0, l2 >= r2.w_size && (0 === s2 && (D(r2.head), r2.strstart = 0, r2.block_start = 0, r2.insert = 0), u2 = new c.Buf8(r2.w_size), c.arraySet(u2, t2, l2 - r2.w_size, r2.w_size, 0), t2 = u2, l2 = r2.w_size), a2 = e2.avail_in, o2 = e2.next_in, h2 = e2.input, e2.avail_in = l2, e2.next_in = 0, e2.input = t2, j(r2); r2.lookahead >= x; ) {
2300              for (n2 = r2.strstart, i2 = r2.lookahead - (x - 1); r2.ins_h = (r2.ins_h << r2.hash_shift ^ r2.window[n2 + x - 1]) & r2.hash_mask, r2.prev[n2 & r2.w_mask] = r2.head[r2.ins_h], r2.head[r2.ins_h] = n2, n2++, --i2; ) ;
2301              r2.strstart = n2, r2.lookahead = x - 1, j(r2);
2302            }
2303            return r2.strstart += r2.lookahead, r2.block_start = r2.strstart, r2.insert = r2.lookahead, r2.lookahead = 0, r2.match_length = r2.prev_length = x - 1, r2.match_available = 0, e2.next_in = o2, e2.input = h2, e2.avail_in = a2, r2.wrap = s2, m;
2304          }, r.deflateInfo = "pako deflate (from Nodeca project)";
2305        }, {
2306          "../utils/common": 41,
2307          "./adler32": 43,
2308          "./crc32": 45,
2309          "./messages": 51,
2310          "./trees": 52
2311        }],
2312        47: [function(e, t, r) {
2313          "use strict";
2314          t.exports = function() {
2315            this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = false;
2316          };
2317        }, {}],
2318        48: [function(e, t, r) {
2319          "use strict";
2320          t.exports = function(e2, t2) {
2321            var r2, n, i, s, a, o, h, u, l, f, c, d, p, m, _, g, b, v, y, w, k, x, S, z, C;
2322            r2 = e2.state, n = e2.next_in, z = e2.input, i = n + (e2.avail_in - 5), s = e2.next_out, C = e2.output, a = s - (t2 - e2.avail_out), o = s + (e2.avail_out - 257), h = r2.dmax, u = r2.wsize, l = r2.whave, f = r2.wnext, c = r2.window, d = r2.hold, p = r2.bits, m = r2.lencode, _ = r2.distcode, g = (1 << r2.lenbits) - 1, b = (1 << r2.distbits) - 1;
2323            e: do {
2324              p < 15 && (d += z[n++] << p, p += 8, d += z[n++] << p, p += 8), v = m[d & g];
2325              t: for (; ; ) {
2326                if (d >>>= y = v >>> 24, p -= y, 0 === (y = v >>> 16 & 255)) C[s++] = 65535 & v;
2327                else {
2328                  if (!(16 & y)) {
2329                    if (0 == (64 & y)) {
2330                      v = m[(65535 & v) + (d & (1 << y) - 1)];
2331                      continue t;
2332                    }
2333                    if (32 & y) {
2334                      r2.mode = 12;
2335                      break e;
2336                    }
2337                    e2.msg = "invalid literal/length code", r2.mode = 30;
2338                    break e;
2339                  }
2340                  w = 65535 & v, (y &= 15) && (p < y && (d += z[n++] << p, p += 8), w += d & (1 << y) - 1, d >>>= y, p -= y), p < 15 && (d += z[n++] << p, p += 8, d += z[n++] << p, p += 8), v = _[d & b];
2341                  r: for (; ; ) {
2342                    if (d >>>= y = v >>> 24, p -= y, !(16 & (y = v >>> 16 & 255))) {
2343                      if (0 == (64 & y)) {
2344                        v = _[(65535 & v) + (d & (1 << y) - 1)];
2345                        continue r;
2346                      }
2347                      e2.msg = "invalid distance code", r2.mode = 30;
2348                      break e;
2349                    }
2350                    if (k = 65535 & v, p < (y &= 15) && (d += z[n++] << p, (p += 8) < y && (d += z[n++] << p, p += 8)), h < (k += d & (1 << y) - 1)) {
2351                      e2.msg = "invalid distance too far back", r2.mode = 30;
2352                      break e;
2353                    }
2354                    if (d >>>= y, p -= y, (y = s - a) < k) {
2355                      if (l < (y = k - y) && r2.sane) {
2356                        e2.msg = "invalid distance too far back", r2.mode = 30;
2357                        break e;
2358                      }
2359                      if (S = c, (x = 0) === f) {
2360                        if (x += u - y, y < w) {
2361                          for (w -= y; C[s++] = c[x++], --y; ) ;
2362                          x = s - k, S = C;
2363                        }
2364                      } else if (f < y) {
2365                        if (x += u + f - y, (y -= f) < w) {
2366                          for (w -= y; C[s++] = c[x++], --y; ) ;
2367                          if (x = 0, f < w) {
2368                            for (w -= y = f; C[s++] = c[x++], --y; ) ;
2369                            x = s - k, S = C;
2370                          }
2371                        }
2372                      } else if (x += f - y, y < w) {
2373                        for (w -= y; C[s++] = c[x++], --y; ) ;
2374                        x = s - k, S = C;
2375                      }
2376                      for (; 2 < w; ) C[s++] = S[x++], C[s++] = S[x++], C[s++] = S[x++], w -= 3;
2377                      w && (C[s++] = S[x++], 1 < w && (C[s++] = S[x++]));
2378                    } else {
2379                      for (x = s - k; C[s++] = C[x++], C[s++] = C[x++], C[s++] = C[x++], 2 < (w -= 3); ) ;
2380                      w && (C[s++] = C[x++], 1 < w && (C[s++] = C[x++]));
2381                    }
2382                    break;
2383                  }
2384                }
2385                break;
2386              }
2387            } while (n < i && s < o);
2388            n -= w = p >> 3, d &= (1 << (p -= w << 3)) - 1, e2.next_in = n, e2.next_out = s, e2.avail_in = n < i ? i - n + 5 : 5 - (n - i), e2.avail_out = s < o ? o - s + 257 : 257 - (s - o), r2.hold = d, r2.bits = p;
2389          };
2390        }, {}],
2391        49: [function(e, t, r) {
2392          "use strict";
2393          var I = e("../utils/common"), O = e("./adler32"), B = e("./crc32"), R = e("./inffast"), T = e("./inftrees"), D = 1, F = 2, N = 0, U = -2, P = 1, n = 852, i = 592;
2394          function L(e2) {
2395            return (e2 >>> 24 & 255) + (e2 >>> 8 & 65280) + ((65280 & e2) << 8) + ((255 & e2) << 24);
2396          }
2397          function s() {
2398            this.mode = 0, this.last = false, this.wrap = 0, this.havedict = false, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new I.Buf16(320), this.work = new I.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;
2399          }
2400          function a(e2) {
2401            var t2;
2402            return e2 && e2.state ? (t2 = e2.state, e2.total_in = e2.total_out = t2.total = 0, e2.msg = "", t2.wrap && (e2.adler = 1 & t2.wrap), t2.mode = P, t2.last = 0, t2.havedict = 0, t2.dmax = 32768, t2.head = null, t2.hold = 0, t2.bits = 0, t2.lencode = t2.lendyn = new I.Buf32(n), t2.distcode = t2.distdyn = new I.Buf32(i), t2.sane = 1, t2.back = -1, N) : U;
2403          }
2404          function o(e2) {
2405            var t2;
2406            return e2 && e2.state ? ((t2 = e2.state).wsize = 0, t2.whave = 0, t2.wnext = 0, a(e2)) : U;
2407          }
2408          function h(e2, t2) {
2409            var r2, n2;
2410            return e2 && e2.state ? (n2 = e2.state, t2 < 0 ? (r2 = 0, t2 = -t2) : (r2 = 1 + (t2 >> 4), t2 < 48 && (t2 &= 15)), t2 && (t2 < 8 || 15 < t2) ? U : (null !== n2.window && n2.wbits !== t2 && (n2.window = null), n2.wrap = r2, n2.wbits = t2, o(e2))) : U;
2411          }
2412          function u(e2, t2) {
2413            var r2, n2;
2414            return e2 ? (n2 = new s(), (e2.state = n2).window = null, (r2 = h(e2, t2)) !== N && (e2.state = null), r2) : U;
2415          }
2416          var l, f, c = true;
2417          function j(e2) {
2418            if (c) {
2419              var t2;
2420              for (l = new I.Buf32(512), f = new I.Buf32(32), t2 = 0; t2 < 144; ) e2.lens[t2++] = 8;
2421              for (; t2 < 256; ) e2.lens[t2++] = 9;
2422              for (; t2 < 280; ) e2.lens[t2++] = 7;
2423              for (; t2 < 288; ) e2.lens[t2++] = 8;
2424              for (T(D, e2.lens, 0, 288, l, 0, e2.work, {
2425                bits: 9
2426              }), t2 = 0; t2 < 32; ) e2.lens[t2++] = 5;
2427              T(F, e2.lens, 0, 32, f, 0, e2.work, {
2428                bits: 5
2429              }), c = false;
2430            }
2431            e2.lencode = l, e2.lenbits = 9, e2.distcode = f, e2.distbits = 5;
2432          }
2433          function Z(e2, t2, r2, n2) {
2434            var i2, s2 = e2.state;
2435            return null === s2.window && (s2.wsize = 1 << s2.wbits, s2.wnext = 0, s2.whave = 0, s2.window = new I.Buf8(s2.wsize)), n2 >= s2.wsize ? (I.arraySet(s2.window, t2, r2 - s2.wsize, s2.wsize, 0), s2.wnext = 0, s2.whave = s2.wsize) : (n2 < (i2 = s2.wsize - s2.wnext) && (i2 = n2), I.arraySet(s2.window, t2, r2 - n2, i2, s2.wnext), (n2 -= i2) ? (I.arraySet(s2.window, t2, r2 - n2, n2, 0), s2.wnext = n2, s2.whave = s2.wsize) : (s2.wnext += i2, s2.wnext === s2.wsize && (s2.wnext = 0), s2.whave < s2.wsize && (s2.whave += i2))), 0;
2436          }
2437          r.inflateReset = o, r.inflateReset2 = h, r.inflateResetKeep = a, r.inflateInit = function(e2) {
2438            return u(e2, 15);
2439          }, r.inflateInit2 = u, r.inflate = function(e2, t2) {
2440            var r2, n2, i2, s2, a2, o2, h2, u2, l2, f2, c2, d, p, m, _, g, b, v, y, w, k, x, S, z, C = 0, E = new I.Buf8(4), A = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
2441            if (!e2 || !e2.state || !e2.output || !e2.input && 0 !== e2.avail_in) return U;
2442            12 === (r2 = e2.state).mode && (r2.mode = 13), a2 = e2.next_out, i2 = e2.output, h2 = e2.avail_out, s2 = e2.next_in, n2 = e2.input, o2 = e2.avail_in, u2 = r2.hold, l2 = r2.bits, f2 = o2, c2 = h2, x = N;
2443            e: for (; ; ) switch (r2.mode) {
2444              case P:
2445                if (0 === r2.wrap) {
2446                  r2.mode = 13;
2447                  break;
2448                }
2449                for (; l2 < 16; ) {
2450                  if (0 === o2) break e;
2451                  o2--, u2 += n2[s2++] << l2, l2 += 8;
2452                }
2453                if (2 & r2.wrap && 35615 === u2) {
2454                  E[r2.check = 0] = 255 & u2, E[1] = u2 >>> 8 & 255, r2.check = B(r2.check, E, 2, 0), l2 = u2 = 0, r2.mode = 2;
2455                  break;
2456                }
2457                if (r2.flags = 0, r2.head && (r2.head.done = false), !(1 & r2.wrap) || (((255 & u2) << 8) + (u2 >> 8)) % 31) {
2458                  e2.msg = "incorrect header check", r2.mode = 30;
2459                  break;
2460                }
2461                if (8 != (15 & u2)) {
2462                  e2.msg = "unknown compression method", r2.mode = 30;
2463                  break;
2464                }
2465                if (l2 -= 4, k = 8 + (15 & (u2 >>>= 4)), 0 === r2.wbits) r2.wbits = k;
2466                else if (k > r2.wbits) {
2467                  e2.msg = "invalid window size", r2.mode = 30;
2468                  break;
2469                }
2470                r2.dmax = 1 << k, e2.adler = r2.check = 1, r2.mode = 512 & u2 ? 10 : 12, l2 = u2 = 0;
2471                break;
2472              case 2:
2473                for (; l2 < 16; ) {
2474                  if (0 === o2) break e;
2475                  o2--, u2 += n2[s2++] << l2, l2 += 8;
2476                }
2477                if (r2.flags = u2, 8 != (255 & r2.flags)) {
2478                  e2.msg = "unknown compression method", r2.mode = 30;
2479                  break;
2480                }
2481                if (57344 & r2.flags) {
2482                  e2.msg = "unknown header flags set", r2.mode = 30;
2483                  break;
2484                }
2485                r2.head && (r2.head.text = u2 >> 8 & 1), 512 & r2.flags && (E[0] = 255 & u2, E[1] = u2 >>> 8 & 255, r2.check = B(r2.check, E, 2, 0)), l2 = u2 = 0, r2.mode = 3;
2486              case 3:
2487                for (; l2 < 32; ) {
2488                  if (0 === o2) break e;
2489                  o2--, u2 += n2[s2++] << l2, l2 += 8;
2490                }
2491                r2.head && (r2.head.time = u2), 512 & r2.flags && (E[0] = 255 & u2, E[1] = u2 >>> 8 & 255, E[2] = u2 >>> 16 & 255, E[3] = u2 >>> 24 & 255, r2.check = B(r2.check, E, 4, 0)), l2 = u2 = 0, r2.mode = 4;
2492              case 4:
2493                for (; l2 < 16; ) {
2494                  if (0 === o2) break e;
2495                  o2--, u2 += n2[s2++] << l2, l2 += 8;
2496                }
2497                r2.head && (r2.head.xflags = 255 & u2, r2.head.os = u2 >> 8), 512 & r2.flags && (E[0] = 255 & u2, E[1] = u2 >>> 8 & 255, r2.check = B(r2.check, E, 2, 0)), l2 = u2 = 0, r2.mode = 5;
2498              case 5:
2499                if (1024 & r2.flags) {
2500                  for (; l2 < 16; ) {
2501                    if (0 === o2) break e;
2502                    o2--, u2 += n2[s2++] << l2, l2 += 8;
2503                  }
2504                  r2.length = u2, r2.head && (r2.head.extra_len = u2), 512 & r2.flags && (E[0] = 255 & u2, E[1] = u2 >>> 8 & 255, r2.check = B(r2.check, E, 2, 0)), l2 = u2 = 0;
2505                } else r2.head && (r2.head.extra = null);
2506                r2.mode = 6;
2507              case 6:
2508                if (1024 & r2.flags && (o2 < (d = r2.length) && (d = o2), d && (r2.head && (k = r2.head.extra_len - r2.length, r2.head.extra || (r2.head.extra = new Array(r2.head.extra_len)), I.arraySet(r2.head.extra, n2, s2, d, k)), 512 & r2.flags && (r2.check = B(r2.check, n2, d, s2)), o2 -= d, s2 += d, r2.length -= d), r2.length)) break e;
2509                r2.length = 0, r2.mode = 7;
2510              case 7:
2511                if (2048 & r2.flags) {
2512                  if (0 === o2) break e;
2513                  for (d = 0; k = n2[s2 + d++], r2.head && k && r2.length < 65536 && (r2.head.name += String.fromCharCode(k)), k && d < o2; ) ;
2514                  if (512 & r2.flags && (r2.check = B(r2.check, n2, d, s2)), o2 -= d, s2 += d, k) break e;
2515                } else r2.head && (r2.head.name = null);
2516                r2.length = 0, r2.mode = 8;
2517              case 8:
2518                if (4096 & r2.flags) {
2519                  if (0 === o2) break e;
2520                  for (d = 0; k = n2[s2 + d++], r2.head && k && r2.length < 65536 && (r2.head.comment += String.fromCharCode(k)), k && d < o2; ) ;
2521                  if (512 & r2.flags && (r2.check = B(r2.check, n2, d, s2)), o2 -= d, s2 += d, k) break e;
2522                } else r2.head && (r2.head.comment = null);
2523                r2.mode = 9;
2524              case 9:
2525                if (512 & r2.flags) {
2526                  for (; l2 < 16; ) {
2527                    if (0 === o2) break e;
2528                    o2--, u2 += n2[s2++] << l2, l2 += 8;
2529                  }
2530                  if (u2 !== (65535 & r2.check)) {
2531                    e2.msg = "header crc mismatch", r2.mode = 30;
2532                    break;
2533                  }
2534                  l2 = u2 = 0;
2535                }
2536                r2.head && (r2.head.hcrc = r2.flags >> 9 & 1, r2.head.done = true), e2.adler = r2.check = 0, r2.mode = 12;
2537                break;
2538              case 10:
2539                for (; l2 < 32; ) {
2540                  if (0 === o2) break e;
2541                  o2--, u2 += n2[s2++] << l2, l2 += 8;
2542                }
2543                e2.adler = r2.check = L(u2), l2 = u2 = 0, r2.mode = 11;
2544              case 11:
2545                if (0 === r2.havedict) return e2.next_out = a2, e2.avail_out = h2, e2.next_in = s2, e2.avail_in = o2, r2.hold = u2, r2.bits = l2, 2;
2546                e2.adler = r2.check = 1, r2.mode = 12;
2547              case 12:
2548                if (5 === t2 || 6 === t2) break e;
2549              case 13:
2550                if (r2.last) {
2551                  u2 >>>= 7 & l2, l2 -= 7 & l2, r2.mode = 27;
2552                  break;
2553                }
2554                for (; l2 < 3; ) {
2555                  if (0 === o2) break e;
2556                  o2--, u2 += n2[s2++] << l2, l2 += 8;
2557                }
2558                switch (r2.last = 1 & u2, l2 -= 1, 3 & (u2 >>>= 1)) {
2559                  case 0:
2560                    r2.mode = 14;
2561                    break;
2562                  case 1:
2563                    if (j(r2), r2.mode = 20, 6 !== t2) break;
2564                    u2 >>>= 2, l2 -= 2;
2565                    break e;
2566                  case 2:
2567                    r2.mode = 17;
2568                    break;
2569                  case 3:
2570                    e2.msg = "invalid block type", r2.mode = 30;
2571                }
2572                u2 >>>= 2, l2 -= 2;
2573                break;
2574              case 14:
2575                for (u2 >>>= 7 & l2, l2 -= 7 & l2; l2 < 32; ) {
2576                  if (0 === o2) break e;
2577                  o2--, u2 += n2[s2++] << l2, l2 += 8;
2578                }
2579                if ((65535 & u2) != (u2 >>> 16 ^ 65535)) {
2580                  e2.msg = "invalid stored block lengths", r2.mode = 30;
2581                  break;
2582                }
2583                if (r2.length = 65535 & u2, l2 = u2 = 0, r2.mode = 15, 6 === t2) break e;
2584              case 15:
2585                r2.mode = 16;
2586              case 16:
2587                if (d = r2.length) {
2588                  if (o2 < d && (d = o2), h2 < d && (d = h2), 0 === d) break e;
2589                  I.arraySet(i2, n2, s2, d, a2), o2 -= d, s2 += d, h2 -= d, a2 += d, r2.length -= d;
2590                  break;
2591                }
2592                r2.mode = 12;
2593                break;
2594              case 17:
2595                for (; l2 < 14; ) {
2596                  if (0 === o2) break e;
2597                  o2--, u2 += n2[s2++] << l2, l2 += 8;
2598                }
2599                if (r2.nlen = 257 + (31 & u2), u2 >>>= 5, l2 -= 5, r2.ndist = 1 + (31 & u2), u2 >>>= 5, l2 -= 5, r2.ncode = 4 + (15 & u2), u2 >>>= 4, l2 -= 4, 286 < r2.nlen || 30 < r2.ndist) {
2600                  e2.msg = "too many length or distance symbols", r2.mode = 30;
2601                  break;
2602                }
2603                r2.have = 0, r2.mode = 18;
2604              case 18:
2605                for (; r2.have < r2.ncode; ) {
2606                  for (; l2 < 3; ) {
2607                    if (0 === o2) break e;
2608                    o2--, u2 += n2[s2++] << l2, l2 += 8;
2609                  }
2610                  r2.lens[A[r2.have++]] = 7 & u2, u2 >>>= 3, l2 -= 3;
2611                }
2612                for (; r2.have < 19; ) r2.lens[A[r2.have++]] = 0;
2613                if (r2.lencode = r2.lendyn, r2.lenbits = 7, S = {
2614                  bits: r2.lenbits
2615                }, x = T(0, r2.lens, 0, 19, r2.lencode, 0, r2.work, S), r2.lenbits = S.bits, x) {
2616                  e2.msg = "invalid code lengths set", r2.mode = 30;
2617                  break;
2618                }
2619                r2.have = 0, r2.mode = 19;
2620              case 19:
2621                for (; r2.have < r2.nlen + r2.ndist; ) {
2622                  for (; g = (C = r2.lencode[u2 & (1 << r2.lenbits) - 1]) >>> 16 & 255, b = 65535 & C, !((_ = C >>> 24) <= l2); ) {
2623                    if (0 === o2) break e;
2624                    o2--, u2 += n2[s2++] << l2, l2 += 8;
2625                  }
2626                  if (b < 16) u2 >>>= _, l2 -= _, r2.lens[r2.have++] = b;
2627                  else {
2628                    if (16 === b) {
2629                      for (z = _ + 2; l2 < z; ) {
2630                        if (0 === o2) break e;
2631                        o2--, u2 += n2[s2++] << l2, l2 += 8;
2632                      }
2633                      if (u2 >>>= _, l2 -= _, 0 === r2.have) {
2634                        e2.msg = "invalid bit length repeat", r2.mode = 30;
2635                        break;
2636                      }
2637                      k = r2.lens[r2.have - 1], d = 3 + (3 & u2), u2 >>>= 2, l2 -= 2;
2638                    } else if (17 === b) {
2639                      for (z = _ + 3; l2 < z; ) {
2640                        if (0 === o2) break e;
2641                        o2--, u2 += n2[s2++] << l2, l2 += 8;
2642                      }
2643                      l2 -= _, k = 0, d = 3 + (7 & (u2 >>>= _)), u2 >>>= 3, l2 -= 3;
2644                    } else {
2645                      for (z = _ + 7; l2 < z; ) {
2646                        if (0 === o2) break e;
2647                        o2--, u2 += n2[s2++] << l2, l2 += 8;
2648                      }
2649                      l2 -= _, k = 0, d = 11 + (127 & (u2 >>>= _)), u2 >>>= 7, l2 -= 7;
2650                    }
2651                    if (r2.have + d > r2.nlen + r2.ndist) {
2652                      e2.msg = "invalid bit length repeat", r2.mode = 30;
2653                      break;
2654                    }
2655                    for (; d--; ) r2.lens[r2.have++] = k;
2656                  }
2657                }
2658                if (30 === r2.mode) break;
2659                if (0 === r2.lens[256]) {
2660                  e2.msg = "invalid code -- missing end-of-block", r2.mode = 30;
2661                  break;
2662                }
2663                if (r2.lenbits = 9, S = {
2664                  bits: r2.lenbits
2665                }, x = T(D, r2.lens, 0, r2.nlen, r2.lencode, 0, r2.work, S), r2.lenbits = S.bits, x) {
2666                  e2.msg = "invalid literal/lengths set", r2.mode = 30;
2667                  break;
2668                }
2669                if (r2.distbits = 6, r2.distcode = r2.distdyn, S = {
2670                  bits: r2.distbits
2671                }, x = T(F, r2.lens, r2.nlen, r2.ndist, r2.distcode, 0, r2.work, S), r2.distbits = S.bits, x) {
2672                  e2.msg = "invalid distances set", r2.mode = 30;
2673                  break;
2674                }
2675                if (r2.mode = 20, 6 === t2) break e;
2676              case 20:
2677                r2.mode = 21;
2678              case 21:
2679                if (6 <= o2 && 258 <= h2) {
2680                  e2.next_out = a2, e2.avail_out = h2, e2.next_in = s2, e2.avail_in = o2, r2.hold = u2, r2.bits = l2, R(e2, c2), a2 = e2.next_out, i2 = e2.output, h2 = e2.avail_out, s2 = e2.next_in, n2 = e2.input, o2 = e2.avail_in, u2 = r2.hold, l2 = r2.bits, 12 === r2.mode && (r2.back = -1);
2681                  break;
2682                }
2683                for (r2.back = 0; g = (C = r2.lencode[u2 & (1 << r2.lenbits) - 1]) >>> 16 & 255, b = 65535 & C, !((_ = C >>> 24) <= l2); ) {
2684                  if (0 === o2) break e;
2685                  o2--, u2 += n2[s2++] << l2, l2 += 8;
2686                }
2687                if (g && 0 == (240 & g)) {
2688                  for (v = _, y = g, w = b; g = (C = r2.lencode[w + ((u2 & (1 << v + y) - 1) >> v)]) >>> 16 & 255, b = 65535 & C, !(v + (_ = C >>> 24) <= l2); ) {
2689                    if (0 === o2) break e;
2690                    o2--, u2 += n2[s2++] << l2, l2 += 8;
2691                  }
2692                  u2 >>>= v, l2 -= v, r2.back += v;
2693                }
2694                if (u2 >>>= _, l2 -= _, r2.back += _, r2.length = b, 0 === g) {
2695                  r2.mode = 26;
2696                  break;
2697                }
2698                if (32 & g) {
2699                  r2.back = -1, r2.mode = 12;
2700                  break;
2701                }
2702                if (64 & g) {
2703                  e2.msg = "invalid literal/length code", r2.mode = 30;
2704                  break;
2705                }
2706                r2.extra = 15 & g, r2.mode = 22;
2707              case 22:
2708                if (r2.extra) {
2709                  for (z = r2.extra; l2 < z; ) {
2710                    if (0 === o2) break e;
2711                    o2--, u2 += n2[s2++] << l2, l2 += 8;
2712                  }
2713                  r2.length += u2 & (1 << r2.extra) - 1, u2 >>>= r2.extra, l2 -= r2.extra, r2.back += r2.extra;
2714                }
2715                r2.was = r2.length, r2.mode = 23;
2716              case 23:
2717                for (; g = (C = r2.distcode[u2 & (1 << r2.distbits) - 1]) >>> 16 & 255, b = 65535 & C, !((_ = C >>> 24) <= l2); ) {
2718                  if (0 === o2) break e;
2719                  o2--, u2 += n2[s2++] << l2, l2 += 8;
2720                }
2721                if (0 == (240 & g)) {
2722                  for (v = _, y = g, w = b; g = (C = r2.distcode[w + ((u2 & (1 << v + y) - 1) >> v)]) >>> 16 & 255, b = 65535 & C, !(v + (_ = C >>> 24) <= l2); ) {
2723                    if (0 === o2) break e;
2724                    o2--, u2 += n2[s2++] << l2, l2 += 8;
2725                  }
2726                  u2 >>>= v, l2 -= v, r2.back += v;
2727                }
2728                if (u2 >>>= _, l2 -= _, r2.back += _, 64 & g) {
2729                  e2.msg = "invalid distance code", r2.mode = 30;
2730                  break;
2731                }
2732                r2.offset = b, r2.extra = 15 & g, r2.mode = 24;
2733              case 24:
2734                if (r2.extra) {
2735                  for (z = r2.extra; l2 < z; ) {
2736                    if (0 === o2) break e;
2737                    o2--, u2 += n2[s2++] << l2, l2 += 8;
2738                  }
2739                  r2.offset += u2 & (1 << r2.extra) - 1, u2 >>>= r2.extra, l2 -= r2.extra, r2.back += r2.extra;
2740                }
2741                if (r2.offset > r2.dmax) {
2742                  e2.msg = "invalid distance too far back", r2.mode = 30;
2743                  break;
2744                }
2745                r2.mode = 25;
2746              case 25:
2747                if (0 === h2) break e;
2748                if (d = c2 - h2, r2.offset > d) {
2749                  if ((d = r2.offset - d) > r2.whave && r2.sane) {
2750                    e2.msg = "invalid distance too far back", r2.mode = 30;
2751                    break;
2752                  }
2753                  p = d > r2.wnext ? (d -= r2.wnext, r2.wsize - d) : r2.wnext - d, d > r2.length && (d = r2.length), m = r2.window;
2754                } else m = i2, p = a2 - r2.offset, d = r2.length;
2755                for (h2 < d && (d = h2), h2 -= d, r2.length -= d; i2[a2++] = m[p++], --d; ) ;
2756                0 === r2.length && (r2.mode = 21);
2757                break;
2758              case 26:
2759                if (0 === h2) break e;
2760                i2[a2++] = r2.length, h2--, r2.mode = 21;
2761                break;
2762              case 27:
2763                if (r2.wrap) {
2764                  for (; l2 < 32; ) {
2765                    if (0 === o2) break e;
2766                    o2--, u2 |= n2[s2++] << l2, l2 += 8;
2767                  }
2768                  if (c2 -= h2, e2.total_out += c2, r2.total += c2, c2 && (e2.adler = r2.check = r2.flags ? B(r2.check, i2, c2, a2 - c2) : O(r2.check, i2, c2, a2 - c2)), c2 = h2, (r2.flags ? u2 : L(u2)) !== r2.check) {
2769                    e2.msg = "incorrect data check", r2.mode = 30;
2770                    break;
2771                  }
2772                  l2 = u2 = 0;
2773                }
2774                r2.mode = 28;
2775              case 28:
2776                if (r2.wrap && r2.flags) {
2777                  for (; l2 < 32; ) {
2778                    if (0 === o2) break e;
2779                    o2--, u2 += n2[s2++] << l2, l2 += 8;
2780                  }
2781                  if (u2 !== (4294967295 & r2.total)) {
2782                    e2.msg = "incorrect length check", r2.mode = 30;
2783                    break;
2784                  }
2785                  l2 = u2 = 0;
2786                }
2787                r2.mode = 29;
2788              case 29:
2789                x = 1;
2790                break e;
2791              case 30:
2792                x = -3;
2793                break e;
2794              case 31:
2795                return -4;
2796              case 32:
2797              default:
2798                return U;
2799            }
2800            return e2.next_out = a2, e2.avail_out = h2, e2.next_in = s2, e2.avail_in = o2, r2.hold = u2, r2.bits = l2, (r2.wsize || c2 !== e2.avail_out && r2.mode < 30 && (r2.mode < 27 || 4 !== t2)) && Z(e2, e2.output, e2.next_out, c2 - e2.avail_out) ? (r2.mode = 31, -4) : (f2 -= e2.avail_in, c2 -= e2.avail_out, e2.total_in += f2, e2.total_out += c2, r2.total += c2, r2.wrap && c2 && (e2.adler = r2.check = r2.flags ? B(r2.check, i2, c2, e2.next_out - c2) : O(r2.check, i2, c2, e2.next_out - c2)), e2.data_type = r2.bits + (r2.last ? 64 : 0) + (12 === r2.mode ? 128 : 0) + (20 === r2.mode || 15 === r2.mode ? 256 : 0), (0 == f2 && 0 === c2 || 4 === t2) && x === N && (x = -5), x);
2801          }, r.inflateEnd = function(e2) {
2802            if (!e2 || !e2.state) return U;
2803            var t2 = e2.state;
2804            return t2.window && (t2.window = null), e2.state = null, N;
2805          }, r.inflateGetHeader = function(e2, t2) {
2806            var r2;
2807            return e2 && e2.state ? 0 == (2 & (r2 = e2.state).wrap) ? U : ((r2.head = t2).done = false, N) : U;
2808          }, r.inflateSetDictionary = function(e2, t2) {
2809            var r2, n2 = t2.length;
2810            return e2 && e2.state ? 0 !== (r2 = e2.state).wrap && 11 !== r2.mode ? U : 11 === r2.mode && O(1, t2, n2, 0) !== r2.check ? -3 : Z(e2, t2, n2, n2) ? (r2.mode = 31, -4) : (r2.havedict = 1, N) : U;
2811          }, r.inflateInfo = "pako inflate (from Nodeca project)";
2812        }, {
2813          "../utils/common": 41,
2814          "./adler32": 43,
2815          "./crc32": 45,
2816          "./inffast": 48,
2817          "./inftrees": 50
2818        }],
2819        50: [function(e, t, r) {
2820          "use strict";
2821          var D = e("../utils/common"), F = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], N = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], U = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], P = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];
2822          t.exports = function(e2, t2, r2, n, i, s, a, o) {
2823            var h, u, l, f, c, d, p, m, _, g = o.bits, b = 0, v = 0, y = 0, w = 0, k = 0, x = 0, S = 0, z = 0, C = 0, E = 0, A = null, I = 0, O = new D.Buf16(16), B = new D.Buf16(16), R = null, T = 0;
2824            for (b = 0; b <= 15; b++) O[b] = 0;
2825            for (v = 0; v < n; v++) O[t2[r2 + v]]++;
2826            for (k = g, w = 15; 1 <= w && 0 === O[w]; w--) ;
2827            if (w < k && (k = w), 0 === w) return i[s++] = 20971520, i[s++] = 20971520, o.bits = 1, 0;
2828            for (y = 1; y < w && 0 === O[y]; y++) ;
2829            for (k < y && (k = y), b = z = 1; b <= 15; b++) if (z <<= 1, (z -= O[b]) < 0) return -1;
2830            if (0 < z && (0 === e2 || 1 !== w)) return -1;
2831            for (B[1] = 0, b = 1; b < 15; b++) B[b + 1] = B[b] + O[b];
2832            for (v = 0; v < n; v++) 0 !== t2[r2 + v] && (a[B[t2[r2 + v]]++] = v);
2833            if (d = 0 === e2 ? (A = R = a, 19) : 1 === e2 ? (A = F, I -= 257, R = N, T -= 257, 256) : (A = U, R = P, -1), b = y, c = s, S = v = E = 0, l = -1, f = (C = 1 << (x = k)) - 1, 1 === e2 && 852 < C || 2 === e2 && 592 < C) return 1;
2834            for (; ; ) {
2835              for (p = b - S, _ = a[v] < d ? (m = 0, a[v]) : a[v] > d ? (m = R[T + a[v]], A[I + a[v]]) : (m = 96, 0), h = 1 << b - S, y = u = 1 << x; i[c + (E >> S) + (u -= h)] = p << 24 | m << 16 | _ | 0, 0 !== u; ) ;
2836              for (h = 1 << b - 1; E & h; ) h >>= 1;
2837              if (0 !== h ? (E &= h - 1, E += h) : E = 0, v++, 0 == --O[b]) {
2838                if (b === w) break;
2839                b = t2[r2 + a[v]];
2840              }
2841              if (k < b && (E & f) !== l) {
2842                for (0 === S && (S = k), c += y, z = 1 << (x = b - S); x + S < w && !((z -= O[x + S]) <= 0); ) x++, z <<= 1;
2843                if (C += 1 << x, 1 === e2 && 852 < C || 2 === e2 && 592 < C) return 1;
2844                i[l = E & f] = k << 24 | x << 16 | c - s | 0;
2845              }
2846            }
2847            return 0 !== E && (i[c + E] = b - S << 24 | 64 << 16 | 0), o.bits = k, 0;
2848          };
2849        }, {
2850          "../utils/common": 41
2851        }],
2852        51: [function(e, t, r) {
2853          "use strict";
2854          t.exports = {
2855            2: "need dictionary",
2856            1: "stream end",
2857            0: "",
2858            "-1": "file error",
2859            "-2": "stream error",
2860            "-3": "data error",
2861            "-4": "insufficient memory",
2862            "-5": "buffer error",
2863            "-6": "incompatible version"
2864          };
2865        }, {}],
2866        52: [function(e, t, r) {
2867          "use strict";
2868          var i = e("../utils/common"), o = 0, h = 1;
2869          function n(e2) {
2870            for (var t2 = e2.length; 0 <= --t2; ) e2[t2] = 0;
2871          }
2872          var s = 0, a = 29, u = 256, l = u + 1 + a, f = 30, c = 19, _ = 2 * l + 1, g = 15, d = 16, p = 7, m = 256, b = 16, v = 17, y = 18, w = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], k = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], x = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], S = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], z = new Array(2 * (l + 2));
2873          n(z);
2874          var C = new Array(2 * f);
2875          n(C);
2876          var E = new Array(512);
2877          n(E);
2878          var A = new Array(256);
2879          n(A);
2880          var I = new Array(a);
2881          n(I);
2882          var O, B, R, T = new Array(f);
2883          function D(e2, t2, r2, n2, i2) {
2884            this.static_tree = e2, this.extra_bits = t2, this.extra_base = r2, this.elems = n2, this.max_length = i2, this.has_stree = e2 && e2.length;
2885          }
2886          function F(e2, t2) {
2887            this.dyn_tree = e2, this.max_code = 0, this.stat_desc = t2;
2888          }
2889          function N(e2) {
2890            return e2 < 256 ? E[e2] : E[256 + (e2 >>> 7)];
2891          }
2892          function U(e2, t2) {
2893            e2.pending_buf[e2.pending++] = 255 & t2, e2.pending_buf[e2.pending++] = t2 >>> 8 & 255;
2894          }
2895          function P(e2, t2, r2) {
2896            e2.bi_valid > d - r2 ? (e2.bi_buf |= t2 << e2.bi_valid & 65535, U(e2, e2.bi_buf), e2.bi_buf = t2 >> d - e2.bi_valid, e2.bi_valid += r2 - d) : (e2.bi_buf |= t2 << e2.bi_valid & 65535, e2.bi_valid += r2);
2897          }
2898          function L(e2, t2, r2) {
2899            P(e2, r2[2 * t2], r2[2 * t2 + 1]);
2900          }
2901          function j(e2, t2) {
2902            for (var r2 = 0; r2 |= 1 & e2, e2 >>>= 1, r2 <<= 1, 0 < --t2; ) ;
2903            return r2 >>> 1;
2904          }
2905          function Z(e2, t2, r2) {
2906            var n2, i2, s2 = new Array(g + 1), a2 = 0;
2907            for (n2 = 1; n2 <= g; n2++) s2[n2] = a2 = a2 + r2[n2 - 1] << 1;
2908            for (i2 = 0; i2 <= t2; i2++) {
2909              var o2 = e2[2 * i2 + 1];
2910              0 !== o2 && (e2[2 * i2] = j(s2[o2]++, o2));
2911            }
2912          }
2913          function W(e2) {
2914            var t2;
2915            for (t2 = 0; t2 < l; t2++) e2.dyn_ltree[2 * t2] = 0;
2916            for (t2 = 0; t2 < f; t2++) e2.dyn_dtree[2 * t2] = 0;
2917            for (t2 = 0; t2 < c; t2++) e2.bl_tree[2 * t2] = 0;
2918            e2.dyn_ltree[2 * m] = 1, e2.opt_len = e2.static_len = 0, e2.last_lit = e2.matches = 0;
2919          }
2920          function M(e2) {
2921            8 < e2.bi_valid ? U(e2, e2.bi_buf) : 0 < e2.bi_valid && (e2.pending_buf[e2.pending++] = e2.bi_buf), e2.bi_buf = 0, e2.bi_valid = 0;
2922          }
2923          function H(e2, t2, r2, n2) {
2924            var i2 = 2 * t2, s2 = 2 * r2;
2925            return e2[i2] < e2[s2] || e2[i2] === e2[s2] && n2[t2] <= n2[r2];
2926          }
2927          function G(e2, t2, r2) {
2928            for (var n2 = e2.heap[r2], i2 = r2 << 1; i2 <= e2.heap_len && (i2 < e2.heap_len && H(t2, e2.heap[i2 + 1], e2.heap[i2], e2.depth) && i2++, !H(t2, n2, e2.heap[i2], e2.depth)); ) e2.heap[r2] = e2.heap[i2], r2 = i2, i2 <<= 1;
2929            e2.heap[r2] = n2;
2930          }
2931          function K(e2, t2, r2) {
2932            var n2, i2, s2, a2, o2 = 0;
2933            if (0 !== e2.last_lit) for (; n2 = e2.pending_buf[e2.d_buf + 2 * o2] << 8 | e2.pending_buf[e2.d_buf + 2 * o2 + 1], i2 = e2.pending_buf[e2.l_buf + o2], o2++, 0 === n2 ? L(e2, i2, t2) : (L(e2, (s2 = A[i2]) + u + 1, t2), 0 !== (a2 = w[s2]) && P(e2, i2 -= I[s2], a2), L(e2, s2 = N(--n2), r2), 0 !== (a2 = k[s2]) && P(e2, n2 -= T[s2], a2)), o2 < e2.last_lit; ) ;
2934            L(e2, m, t2);
2935          }
2936          function Y(e2, t2) {
2937            var r2, n2, i2, s2 = t2.dyn_tree, a2 = t2.stat_desc.static_tree, o2 = t2.stat_desc.has_stree, h2 = t2.stat_desc.elems, u2 = -1;
2938            for (e2.heap_len = 0, e2.heap_max = _, r2 = 0; r2 < h2; r2++) 0 !== s2[2 * r2] ? (e2.heap[++e2.heap_len] = u2 = r2, e2.depth[r2] = 0) : s2[2 * r2 + 1] = 0;
2939            for (; e2.heap_len < 2; ) s2[2 * (i2 = e2.heap[++e2.heap_len] = u2 < 2 ? ++u2 : 0)] = 1, e2.depth[i2] = 0, e2.opt_len--, o2 && (e2.static_len -= a2[2 * i2 + 1]);
2940            for (t2.max_code = u2, r2 = e2.heap_len >> 1; 1 <= r2; r2--) G(e2, s2, r2);
2941            for (i2 = h2; r2 = e2.heap[1], e2.heap[1] = e2.heap[e2.heap_len--], G(e2, s2, 1), n2 = e2.heap[1], e2.heap[--e2.heap_max] = r2, e2.heap[--e2.heap_max] = n2, s2[2 * i2] = s2[2 * r2] + s2[2 * n2], e2.depth[i2] = (e2.depth[r2] >= e2.depth[n2] ? e2.depth[r2] : e2.depth[n2]) + 1, s2[2 * r2 + 1] = s2[2 * n2 + 1] = i2, e2.heap[1] = i2++, G(e2, s2, 1), 2 <= e2.heap_len; ) ;
2942            e2.heap[--e2.heap_max] = e2.heap[1], function(e3, t3) {
2943              var r3, n3, i3, s3, a3, o3, h3 = t3.dyn_tree, u3 = t3.max_code, l2 = t3.stat_desc.static_tree, f2 = t3.stat_desc.has_stree, c2 = t3.stat_desc.extra_bits, d2 = t3.stat_desc.extra_base, p2 = t3.stat_desc.max_length, m2 = 0;
2944              for (s3 = 0; s3 <= g; s3++) e3.bl_count[s3] = 0;
2945              for (h3[2 * e3.heap[e3.heap_max] + 1] = 0, r3 = e3.heap_max + 1; r3 < _; r3++) p2 < (s3 = h3[2 * h3[2 * (n3 = e3.heap[r3]) + 1] + 1] + 1) && (s3 = p2, m2++), h3[2 * n3 + 1] = s3, u3 < n3 || (e3.bl_count[s3]++, a3 = 0, d2 <= n3 && (a3 = c2[n3 - d2]), o3 = h3[2 * n3], e3.opt_len += o3 * (s3 + a3), f2 && (e3.static_len += o3 * (l2[2 * n3 + 1] + a3)));
2946              if (0 !== m2) {
2947                do {
2948                  for (s3 = p2 - 1; 0 === e3.bl_count[s3]; ) s3--;
2949                  e3.bl_count[s3]--, e3.bl_count[s3 + 1] += 2, e3.bl_count[p2]--, m2 -= 2;
2950                } while (0 < m2);
2951                for (s3 = p2; 0 !== s3; s3--) for (n3 = e3.bl_count[s3]; 0 !== n3; ) u3 < (i3 = e3.heap[--r3]) || (h3[2 * i3 + 1] !== s3 && (e3.opt_len += (s3 - h3[2 * i3 + 1]) * h3[2 * i3], h3[2 * i3 + 1] = s3), n3--);
2952              }
2953            }(e2, t2), Z(s2, u2, e2.bl_count);
2954          }
2955          function X(e2, t2, r2) {
2956            var n2, i2, s2 = -1, a2 = t2[1], o2 = 0, h2 = 7, u2 = 4;
2957            for (0 === a2 && (h2 = 138, u2 = 3), t2[2 * (r2 + 1) + 1] = 65535, n2 = 0; n2 <= r2; n2++) i2 = a2, a2 = t2[2 * (n2 + 1) + 1], ++o2 < h2 && i2 === a2 || (o2 < u2 ? e2.bl_tree[2 * i2] += o2 : 0 !== i2 ? (i2 !== s2 && e2.bl_tree[2 * i2]++, e2.bl_tree[2 * b]++) : o2 <= 10 ? e2.bl_tree[2 * v]++ : e2.bl_tree[2 * y]++, s2 = i2, u2 = (o2 = 0) === a2 ? (h2 = 138, 3) : i2 === a2 ? (h2 = 6, 3) : (h2 = 7, 4));
2958          }
2959          function V(e2, t2, r2) {
2960            var n2, i2, s2 = -1, a2 = t2[1], o2 = 0, h2 = 7, u2 = 4;
2961            for (0 === a2 && (h2 = 138, u2 = 3), n2 = 0; n2 <= r2; n2++) if (i2 = a2, a2 = t2[2 * (n2 + 1) + 1], !(++o2 < h2 && i2 === a2)) {
2962              if (o2 < u2) for (; L(e2, i2, e2.bl_tree), 0 != --o2; ) ;
2963              else 0 !== i2 ? (i2 !== s2 && (L(e2, i2, e2.bl_tree), o2--), L(e2, b, e2.bl_tree), P(e2, o2 - 3, 2)) : o2 <= 10 ? (L(e2, v, e2.bl_tree), P(e2, o2 - 3, 3)) : (L(e2, y, e2.bl_tree), P(e2, o2 - 11, 7));
2964              s2 = i2, u2 = (o2 = 0) === a2 ? (h2 = 138, 3) : i2 === a2 ? (h2 = 6, 3) : (h2 = 7, 4);
2965            }
2966          }
2967          n(T);
2968          var q = false;
2969          function J(e2, t2, r2, n2) {
2970            P(e2, (s << 1) + (n2 ? 1 : 0), 3), function(e3, t3, r3, n3) {
2971              M(e3), n3 && (U(e3, r3), U(e3, ~r3)), i.arraySet(e3.pending_buf, e3.window, t3, r3, e3.pending), e3.pending += r3;
2972            }(e2, t2, r2, true);
2973          }
2974          r._tr_init = function(e2) {
2975            q || (function() {
2976              var e3, t2, r2, n2, i2, s2 = new Array(g + 1);
2977              for (n2 = r2 = 0; n2 < a - 1; n2++) for (I[n2] = r2, e3 = 0; e3 < 1 << w[n2]; e3++) A[r2++] = n2;
2978              for (A[r2 - 1] = n2, n2 = i2 = 0; n2 < 16; n2++) for (T[n2] = i2, e3 = 0; e3 < 1 << k[n2]; e3++) E[i2++] = n2;
2979              for (i2 >>= 7; n2 < f; n2++) for (T[n2] = i2 << 7, e3 = 0; e3 < 1 << k[n2] - 7; e3++) E[256 + i2++] = n2;
2980              for (t2 = 0; t2 <= g; t2++) s2[t2] = 0;
2981              for (e3 = 0; e3 <= 143; ) z[2 * e3 + 1] = 8, e3++, s2[8]++;
2982              for (; e3 <= 255; ) z[2 * e3 + 1] = 9, e3++, s2[9]++;
2983              for (; e3 <= 279; ) z[2 * e3 + 1] = 7, e3++, s2[7]++;
2984              for (; e3 <= 287; ) z[2 * e3 + 1] = 8, e3++, s2[8]++;
2985              for (Z(z, l + 1, s2), e3 = 0; e3 < f; e3++) C[2 * e3 + 1] = 5, C[2 * e3] = j(e3, 5);
2986              O = new D(z, w, u + 1, l, g), B = new D(C, k, 0, f, g), R = new D(new Array(0), x, 0, c, p);
2987            }(), q = true), e2.l_desc = new F(e2.dyn_ltree, O), e2.d_desc = new F(e2.dyn_dtree, B), e2.bl_desc = new F(e2.bl_tree, R), e2.bi_buf = 0, e2.bi_valid = 0, W(e2);
2988          }, r._tr_stored_block = J, r._tr_flush_block = function(e2, t2, r2, n2) {
2989            var i2, s2, a2 = 0;
2990            0 < e2.level ? (2 === e2.strm.data_type && (e2.strm.data_type = function(e3) {
2991              var t3, r3 = 4093624447;
2992              for (t3 = 0; t3 <= 31; t3++, r3 >>>= 1) if (1 & r3 && 0 !== e3.dyn_ltree[2 * t3]) return o;
2993              if (0 !== e3.dyn_ltree[18] || 0 !== e3.dyn_ltree[20] || 0 !== e3.dyn_ltree[26]) return h;
2994              for (t3 = 32; t3 < u; t3++) if (0 !== e3.dyn_ltree[2 * t3]) return h;
2995              return o;
2996            }(e2)), Y(e2, e2.l_desc), Y(e2, e2.d_desc), a2 = function(e3) {
2997              var t3;
2998              for (X(e3, e3.dyn_ltree, e3.l_desc.max_code), X(e3, e3.dyn_dtree, e3.d_desc.max_code), Y(e3, e3.bl_desc), t3 = c - 1; 3 <= t3 && 0 === e3.bl_tree[2 * S[t3] + 1]; t3--) ;
2999              return e3.opt_len += 3 * (t3 + 1) + 5 + 5 + 4, t3;
3000            }(e2), i2 = e2.opt_len + 3 + 7 >>> 3, (s2 = e2.static_len + 3 + 7 >>> 3) <= i2 && (i2 = s2)) : i2 = s2 = r2 + 5, r2 + 4 <= i2 && -1 !== t2 ? J(e2, t2, r2, n2) : 4 === e2.strategy || s2 === i2 ? (P(e2, 2 + (n2 ? 1 : 0), 3), K(e2, z, C)) : (P(e2, 4 + (n2 ? 1 : 0), 3), function(e3, t3, r3, n3) {
3001              var i3;
3002              for (P(e3, t3 - 257, 5), P(e3, r3 - 1, 5), P(e3, n3 - 4, 4), i3 = 0; i3 < n3; i3++) P(e3, e3.bl_tree[2 * S[i3] + 1], 3);
3003              V(e3, e3.dyn_ltree, t3 - 1), V(e3, e3.dyn_dtree, r3 - 1);
3004            }(e2, e2.l_desc.max_code + 1, e2.d_desc.max_code + 1, a2 + 1), K(e2, e2.dyn_ltree, e2.dyn_dtree)), W(e2), n2 && M(e2);
3005          }, r._tr_tally = function(e2, t2, r2) {
3006            return e2.pending_buf[e2.d_buf + 2 * e2.last_lit] = t2 >>> 8 & 255, e2.pending_buf[e2.d_buf + 2 * e2.last_lit + 1] = 255 & t2, e2.pending_buf[e2.l_buf + e2.last_lit] = 255 & r2, e2.last_lit++, 0 === t2 ? e2.dyn_ltree[2 * r2]++ : (e2.matches++, t2--, e2.dyn_ltree[2 * (A[r2] + u + 1)]++, e2.dyn_dtree[2 * N(t2)]++), e2.last_lit === e2.lit_bufsize - 1;
3007          }, r._tr_align = function(e2) {
3008            P(e2, 2, 3), L(e2, m, z), function(e3) {
3009              16 === e3.bi_valid ? (U(e3, e3.bi_buf), e3.bi_buf = 0, e3.bi_valid = 0) : 8 <= e3.bi_valid && (e3.pending_buf[e3.pending++] = 255 & e3.bi_buf, e3.bi_buf >>= 8, e3.bi_valid -= 8);
3010            }(e2);
3011          };
3012        }, {
3013          "../utils/common": 41
3014        }],
3015        53: [function(e, t, r) {
3016          "use strict";
3017          t.exports = function() {
3018            this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;
3019          };
3020        }, {}],
3021        54: [function(e, t, r) {
3022          (function(e2) {
3023            !function(r2, n) {
3024              "use strict";
3025              if (!r2.setImmediate) {
3026                var i, s, t2, a, o = 1, h = {}, u = false, l = r2.document, e3 = Object.getPrototypeOf && Object.getPrototypeOf(r2);
3027                e3 = e3 && e3.setTimeout ? e3 : r2, i = "[object process]" === {}.toString.call(r2.process) ? function(e4) {
3028                  process.nextTick(function() {
3029                    c(e4);
3030                  });
3031                } : function() {
3032                  if (r2.postMessage && !r2.importScripts) {
3033                    var e4 = true, t3 = r2.onmessage;
3034                    return r2.onmessage = function() {
3035                      e4 = false;
3036                    }, r2.postMessage("", "*"), r2.onmessage = t3, e4;
3037                  }
3038                }() ? (a = "setImmediate$" + Math.random() + "$", r2.addEventListener ? r2.addEventListener("message", d, false) : r2.attachEvent("onmessage", d), function(e4) {
3039                  r2.postMessage(a + e4, "*");
3040                }) : r2.MessageChannel ? ((t2 = new MessageChannel()).port1.onmessage = function(e4) {
3041                  c(e4.data);
3042                }, function(e4) {
3043                  t2.port2.postMessage(e4);
3044                }) : l && "onreadystatechange" in l.createElement("script") ? (s = l.documentElement, function(e4) {
3045                  var t3 = l.createElement("script");
3046                  t3.onreadystatechange = function() {
3047                    c(e4), t3.onreadystatechange = null, s.removeChild(t3), t3 = null;
3048                  }, s.appendChild(t3);
3049                }) : function(e4) {
3050                  setTimeout(c, 0, e4);
3051                }, e3.setImmediate = function(e4) {
3052                  "function" != typeof e4 && (e4 = new Function("" + e4));
3053                  for (var t3 = new Array(arguments.length - 1), r3 = 0; r3 < t3.length; r3++) t3[r3] = arguments[r3 + 1];
3054                  var n2 = {
3055                    callback: e4,
3056                    args: t3
3057                  };
3058                  return h[o] = n2, i(o), o++;
3059                }, e3.clearImmediate = f;
3060              }
3061              function f(e4) {
3062                delete h[e4];
3063              }
3064              function c(e4) {
3065                if (u) setTimeout(c, 0, e4);
3066                else {
3067                  var t3 = h[e4];
3068                  if (t3) {
3069                    u = true;
3070                    try {
3071                      !function(e5) {
3072                        var t4 = e5.callback, r3 = e5.args;
3073                        switch (r3.length) {
3074                          case 0:
3075                            t4();
3076                            break;
3077                          case 1:
3078                            t4(r3[0]);
3079                            break;
3080                          case 2:
3081                            t4(r3[0], r3[1]);
3082                            break;
3083                          case 3:
3084                            t4(r3[0], r3[1], r3[2]);
3085                            break;
3086                          default:
3087                            t4.apply(n, r3);
3088                        }
3089                      }(t3);
3090                    } finally {
3091                      f(e4), u = false;
3092                    }
3093                  }
3094                }
3095              }
3096              function d(e4) {
3097                e4.source === r2 && "string" == typeof e4.data && 0 === e4.data.indexOf(a) && c(+e4.data.slice(a.length));
3098              }
3099            }("undefined" == typeof self ? void 0 === e2 ? this : e2 : self);
3100          }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {});
3101        }, {}]
3102      }, {}, [10])(10);
3103    });
3104  }
3105});
3106
3107// src/app/pages/admin/bug-reports/bug-reports.page.ts
3108var import_jszip = __toESM(require_jszip_min());
3109var _c0 = (a0, a1) => ({ count: a0, total: a1 });
3110var _forTrack0 = ($index, $item) => $item.value;
3111var _forTrack1 = ($index, $item) => $item.id;
3112function BugReportsPage_Conditional_20_For_8_Template(rf, ctx) {
3113  if (rf & 1) {
3114    \u0275\u0275elementStart(0, "ion-select-option", 21);
3115    \u0275\u0275text(1);
3116    \u0275\u0275pipe(2, "translate");
3117    \u0275\u0275elementEnd();
3118  }
3119  if (rf & 2) {
3120    const status_r3 = ctx.$implicit;
3121    \u0275\u0275property("value", status_r3.value);
3122    \u0275\u0275advance();
3123    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(2, 2, status_r3.labelKey), " ");
3124  }
3125}
3126function BugReportsPage_Conditional_20_For_15_Template(rf, ctx) {
3127  if (rf & 1) {
3128    \u0275\u0275elementStart(0, "ion-select-option", 21);
3129    \u0275\u0275text(1);
3130    \u0275\u0275pipe(2, "translate");
3131    \u0275\u0275elementEnd();
3132  }
3133  if (rf & 2) {
3134    const cat_r4 = ctx.$implicit;
3135    \u0275\u0275property("value", cat_r4.value);
3136    \u0275\u0275advance();
3137    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(2, 2, cat_r4.labelKey), " ");
3138  }
3139}
3140function BugReportsPage_Conditional_20_For_22_Template(rf, ctx) {
3141  if (rf & 1) {
3142    \u0275\u0275elementStart(0, "ion-select-option", 21);
3143    \u0275\u0275text(1);
3144    \u0275\u0275elementEnd();
3145  }
3146  if (rf & 2) {
3147    const campus_r5 = ctx.$implicit;
3148    \u0275\u0275property("value", campus_r5.id);
3149    \u0275\u0275advance();
3150    \u0275\u0275textInterpolate(campus_r5.name);
3151  }
3152}
3153function BugReportsPage_Conditional_20_Conditional_23_Template(rf, ctx) {
3154  if (rf & 1) {
3155    const _r6 = \u0275\u0275getCurrentView();
3156    \u0275\u0275elementStart(0, "ion-button", 23);
3157    \u0275\u0275listener("click", function BugReportsPage_Conditional_20_Conditional_23_Template_ion_button_click_0_listener() {
3158      \u0275\u0275restoreView(_r6);
3159      const ctx_r1 = \u0275\u0275nextContext(2);
3160      return \u0275\u0275resetView(ctx_r1.clearFilters());
3161    });
3162    \u0275\u0275element(1, "ion-icon", 24);
3163    \u0275\u0275text(2);
3164    \u0275\u0275pipe(3, "translate");
3165    \u0275\u0275elementEnd();
3166  }
3167  if (rf & 2) {
3168    \u0275\u0275advance(2);
3169    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(3, 1, "bugReportAdmin.clearFilters"), " ");
3170  }
3171}
3172function BugReportsPage_Conditional_20_Template(rf, ctx) {
3173  if (rf & 1) {
3174    const _r1 = \u0275\u0275getCurrentView();
3175    \u0275\u0275elementStart(0, "div", 14)(1, "div", 18)(2, "ion-select", 19);
3176    \u0275\u0275pipe(3, "translate");
3177    \u0275\u0275twoWayListener("ngModelChange", function BugReportsPage_Conditional_20_Template_ion_select_ngModelChange_2_listener($event) {
3178      \u0275\u0275restoreView(_r1);
3179      const ctx_r1 = \u0275\u0275nextContext();
3180      \u0275\u0275twoWayBindingSet(ctx_r1.filterStatus, $event) || (ctx_r1.filterStatus = $event);
3181      return \u0275\u0275resetView($event);
3182    });
3183    \u0275\u0275listener("ionChange", function BugReportsPage_Conditional_20_Template_ion_select_ionChange_2_listener() {
3184      \u0275\u0275restoreView(_r1);
3185      const ctx_r1 = \u0275\u0275nextContext();
3186      return \u0275\u0275resetView(ctx_r1.onFilterChange());
3187    });
3188    \u0275\u0275elementStart(4, "ion-select-option", 20);
3189    \u0275\u0275text(5);
3190    \u0275\u0275pipe(6, "translate");
3191    \u0275\u0275elementEnd();
3192    \u0275\u0275repeaterCreate(7, BugReportsPage_Conditional_20_For_8_Template, 3, 4, "ion-select-option", 21, _forTrack0);
3193    \u0275\u0275elementEnd();
3194    \u0275\u0275elementStart(9, "ion-select", 19);
3195    \u0275\u0275pipe(10, "translate");
3196    \u0275\u0275twoWayListener("ngModelChange", function BugReportsPage_Conditional_20_Template_ion_select_ngModelChange_9_listener($event) {
3197      \u0275\u0275restoreView(_r1);
3198      const ctx_r1 = \u0275\u0275nextContext();
3199      \u0275\u0275twoWayBindingSet(ctx_r1.filterCategory, $event) || (ctx_r1.filterCategory = $event);
3200      return \u0275\u0275resetView($event);
3201    });
3202    \u0275\u0275listener("ionChange", function BugReportsPage_Conditional_20_Template_ion_select_ionChange_9_listener() {
3203      \u0275\u0275restoreView(_r1);
3204      const ctx_r1 = \u0275\u0275nextContext();
3205      return \u0275\u0275resetView(ctx_r1.onFilterChange());
3206    });
3207    \u0275\u0275elementStart(11, "ion-select-option", 20);
3208    \u0275\u0275text(12);
3209    \u0275\u0275pipe(13, "translate");
3210    \u0275\u0275elementEnd();
3211    \u0275\u0275repeaterCreate(14, BugReportsPage_Conditional_20_For_15_Template, 3, 4, "ion-select-option", 21, _forTrack0);
3212    \u0275\u0275elementEnd();
3213    \u0275\u0275elementStart(16, "ion-select", 19);
3214    \u0275\u0275pipe(17, "translate");
3215    \u0275\u0275twoWayListener("ngModelChange", function BugReportsPage_Conditional_20_Template_ion_select_ngModelChange_16_listener($event) {
3216      \u0275\u0275restoreView(_r1);
3217      const ctx_r1 = \u0275\u0275nextContext();
3218      \u0275\u0275twoWayBindingSet(ctx_r1.selectedCampusId, $event) || (ctx_r1.selectedCampusId = $event);
3219      return \u0275\u0275resetView($event);
3220    });
3221    \u0275\u0275listener("ionChange", function BugReportsPage_Conditional_20_Template_ion_select_ionChange_16_listener() {
3222      \u0275\u0275restoreView(_r1);
3223      const ctx_r1 = \u0275\u0275nextContext();
3224      return \u0275\u0275resetView(ctx_r1.onFilterChange());
3225    });
3226    \u0275\u0275elementStart(18, "ion-select-option", 20);
3227    \u0275\u0275text(19);
3228    \u0275\u0275pipe(20, "translate");
3229    \u0275\u0275elementEnd();
3230    \u0275\u0275repeaterCreate(21, BugReportsPage_Conditional_20_For_22_Template, 2, 2, "ion-select-option", 21, _forTrack1);
3231    \u0275\u0275elementEnd();
3232    \u0275\u0275template(23, BugReportsPage_Conditional_20_Conditional_23_Template, 4, 3, "ion-button", 22);
3233    \u0275\u0275elementEnd()();
3234  }
3235  if (rf & 2) {
3236    const ctx_r1 = \u0275\u0275nextContext();
3237    \u0275\u0275advance(2);
3238    \u0275\u0275twoWayProperty("ngModel", ctx_r1.filterStatus);
3239    \u0275\u0275property("placeholder", \u0275\u0275pipeBind1(3, 10, "bugReportAdmin.filterStatus"));
3240    \u0275\u0275advance(3);
3241    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(6, 12, "bugReportAdmin.allStatuses"));
3242    \u0275\u0275advance(2);
3243    \u0275\u0275repeater(ctx_r1.statuses);
3244    \u0275\u0275advance(2);
3245    \u0275\u0275twoWayProperty("ngModel", ctx_r1.filterCategory);
3246    \u0275\u0275property("placeholder", \u0275\u0275pipeBind1(10, 14, "bugReportAdmin.filterCategory"));
3247    \u0275\u0275advance(3);
3248    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(13, 16, "bugReportAdmin.allCategories"));
3249    \u0275\u0275advance(2);
3250    \u0275\u0275repeater(ctx_r1.categories);
3251    \u0275\u0275advance(2);
3252    \u0275\u0275twoWayProperty("ngModel", ctx_r1.selectedCampusId);
3253    \u0275\u0275property("placeholder", \u0275\u0275pipeBind1(17, 18, "admin.users.campusFilter"));
3254    \u0275\u0275advance(3);
3255    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(20, 20, "admin.users.allCampuses"));
3256    \u0275\u0275advance(2);
3257    \u0275\u0275repeater(ctx_r1.accessibleCampuses);
3258    \u0275\u0275advance(2);
3259    \u0275\u0275conditional(ctx_r1.hasActiveFilters() ? 23 : -1);
3260  }
3261}
3262function BugReportsPage_Conditional_21_Template(rf, ctx) {
3263  if (rf & 1) {
3264    \u0275\u0275elementStart(0, "div", 15);
3265    \u0275\u0275element(1, "ion-spinner");
3266    \u0275\u0275elementStart(2, "p");
3267    \u0275\u0275text(3);
3268    \u0275\u0275pipe(4, "translate");
3269    \u0275\u0275elementEnd()();
3270  }
3271  if (rf & 2) {
3272    \u0275\u0275advance(3);
3273    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(4, 1, "bugReportAdmin.loading"));
3274  }
3275}
3276function BugReportsPage_Conditional_22_Template(rf, ctx) {
3277  if (rf & 1) {
3278    const _r7 = \u0275\u0275getCurrentView();
3279    \u0275\u0275elementStart(0, "div", 16)(1, "div", 25);
3280    \u0275\u0275element(2, "ion-icon", 26);
3281    \u0275\u0275elementEnd();
3282    \u0275\u0275elementStart(3, "h3");
3283    \u0275\u0275text(4, "Unable to load reports");
3284    \u0275\u0275elementEnd();
3285    \u0275\u0275elementStart(5, "p");
3286    \u0275\u0275text(6);
3287    \u0275\u0275elementEnd();
3288    \u0275\u0275elementStart(7, "ion-button", 27);
3289    \u0275\u0275listener("click", function BugReportsPage_Conditional_22_Template_ion_button_click_7_listener() {
3290      \u0275\u0275restoreView(_r7);
3291      const ctx_r1 = \u0275\u0275nextContext();
3292      return \u0275\u0275resetView(ctx_r1.loadReports());
3293    });
3294    \u0275\u0275element(8, "ion-icon", 28);
3295    \u0275\u0275text(9);
3296    \u0275\u0275pipe(10, "translate");
3297    \u0275\u0275elementEnd()();
3298  }
3299  if (rf & 2) {
3300    const ctx_r1 = \u0275\u0275nextContext();
3301    \u0275\u0275advance(6);
3302    \u0275\u0275textInterpolate(ctx_r1.error);
3303    \u0275\u0275advance(3);
3304    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(10, 2, "common.retry"), " ");
3305  }
3306}
3307function BugReportsPage_Conditional_23_Conditional_9_Template(rf, ctx) {
3308  if (rf & 1) {
3309    const _r8 = \u0275\u0275getCurrentView();
3310    \u0275\u0275elementStart(0, "ion-button", 27);
3311    \u0275\u0275listener("click", function BugReportsPage_Conditional_23_Conditional_9_Template_ion_button_click_0_listener() {
3312      \u0275\u0275restoreView(_r8);
3313      const ctx_r1 = \u0275\u0275nextContext(2);
3314      return \u0275\u0275resetView(ctx_r1.clearFilters());
3315    });
3316    \u0275\u0275element(1, "ion-icon", 24);
3317    \u0275\u0275text(2);
3318    \u0275\u0275pipe(3, "translate");
3319    \u0275\u0275elementEnd();
3320  }
3321  if (rf & 2) {
3322    \u0275\u0275advance(2);
3323    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(3, 1, "bugReportAdmin.clearFilters"), " ");
3324  }
3325}
3326function BugReportsPage_Conditional_23_Template(rf, ctx) {
3327  if (rf & 1) {
3328    \u0275\u0275elementStart(0, "div", 17)(1, "div", 29)(2, "div", 30);
3329    \u0275\u0275element(3, "ion-icon", 5);
3330    \u0275\u0275elementEnd();
3331    \u0275\u0275elementStart(4, "h3");
3332    \u0275\u0275text(5);
3333    \u0275\u0275pipe(6, "translate");
3334    \u0275\u0275elementEnd();
3335    \u0275\u0275elementStart(7, "p");
3336    \u0275\u0275text(8, "No bug reports have been submitted yet.");
3337    \u0275\u0275elementEnd();
3338    \u0275\u0275template(9, BugReportsPage_Conditional_23_Conditional_9_Template, 4, 3, "ion-button");
3339    \u0275\u0275elementEnd()();
3340  }
3341  if (rf & 2) {
3342    const ctx_r1 = \u0275\u0275nextContext();
3343    \u0275\u0275advance(5);
3344    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(6, 2, "bugReportAdmin.noReports"));
3345    \u0275\u0275advance(4);
3346    \u0275\u0275conditional(ctx_r1.hasActiveFilters() ? 9 : -1);
3347  }
3348}
3349function BugReportsPage_Conditional_24_For_2_Conditional_19_Template(rf, ctx) {
3350  if (rf & 1) {
3351    \u0275\u0275elementStart(0, "span", 46);
3352    \u0275\u0275element(1, "ion-icon", 51);
3353    \u0275\u0275text(2);
3354    \u0275\u0275elementEnd();
3355  }
3356  if (rf & 2) {
3357    const report_r10 = \u0275\u0275nextContext().$implicit;
3358    \u0275\u0275advance(2);
3359    \u0275\u0275textInterpolate1(" ", report_r10.campusName, " ");
3360  }
3361}
3362function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_1_Template(rf, ctx) {
3363  if (rf & 1) {
3364    \u0275\u0275elementStart(0, "div", 52)(1, "h4");
3365    \u0275\u0275element(2, "ion-icon", 68);
3366    \u0275\u0275text(3);
3367    \u0275\u0275pipe(4, "translate");
3368    \u0275\u0275elementEnd();
3369    \u0275\u0275element(5, "img", 69);
3370    \u0275\u0275elementEnd();
3371  }
3372  if (rf & 2) {
3373    \u0275\u0275advance(3);
3374    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(4, 2, "bugReportAdmin.screenshot"), " ");
3375    \u0275\u0275advance(2);
3376    \u0275\u0275property("src", ctx, \u0275\u0275sanitizeUrl);
3377  }
3378}
3379function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_2_Template(rf, ctx) {
3380  if (rf & 1) {
3381    const _r12 = \u0275\u0275getCurrentView();
3382    \u0275\u0275elementStart(0, "div", 53)(1, "h4");
3383    \u0275\u0275element(2, "ion-icon", 70);
3384    \u0275\u0275text(3);
3385    \u0275\u0275pipe(4, "translate");
3386    \u0275\u0275elementEnd();
3387    \u0275\u0275elementStart(5, "ion-button", 62);
3388    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_2_Template_ion_button_click_5_listener() {
3389      \u0275\u0275restoreView(_r12);
3390      const report_r10 = \u0275\u0275nextContext(2).$implicit;
3391      const ctx_r1 = \u0275\u0275nextContext(2);
3392      return \u0275\u0275resetView(ctx_r1.downloadRecording(report_r10));
3393    });
3394    \u0275\u0275element(6, "ion-icon", 71);
3395    \u0275\u0275text(7);
3396    \u0275\u0275pipe(8, "translate");
3397    \u0275\u0275elementEnd()();
3398  }
3399  if (rf & 2) {
3400    \u0275\u0275advance(3);
3401    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(4, 2, "bugReportAdmin.recording"), " ");
3402    \u0275\u0275advance(4);
3403    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(8, 4, "bugReportAdmin.downloadRecording"), " ");
3404  }
3405}
3406function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Conditional_7_Conditional_8_Template(rf, ctx) {
3407  if (rf & 1) {
3408    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3409    \u0275\u0275text(2);
3410    \u0275\u0275pipe(3, "translate");
3411    \u0275\u0275elementEnd();
3412    \u0275\u0275elementStart(4, "span", 58);
3413    \u0275\u0275text(5);
3414    \u0275\u0275elementEnd()();
3415  }
3416  if (rf & 2) {
3417    const techData_r14 = \u0275\u0275nextContext(3);
3418    \u0275\u0275advance(2);
3419    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.target"));
3420    \u0275\u0275advance(3);
3421    \u0275\u0275textInterpolate(techData_r14.navigation.targetName);
3422  }
3423}
3424function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Conditional_7_Conditional_9_Template(rf, ctx) {
3425  if (rf & 1) {
3426    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3427    \u0275\u0275text(2);
3428    \u0275\u0275pipe(3, "translate");
3429    \u0275\u0275elementEnd();
3430    \u0275\u0275elementStart(4, "span", 58);
3431    \u0275\u0275text(5);
3432    \u0275\u0275elementEnd()();
3433  }
3434  if (rf & 2) {
3435    const techData_r14 = \u0275\u0275nextContext(3);
3436    \u0275\u0275advance(2);
3437    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.direction"));
3438    \u0275\u0275advance(3);
3439    \u0275\u0275textInterpolate(techData_r14.navigation.currentDirection);
3440  }
3441}
3442function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Conditional_7_Conditional_10_Template(rf, ctx) {
3443  if (rf & 1) {
3444    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3445    \u0275\u0275text(2);
3446    \u0275\u0275pipe(3, "translate");
3447    \u0275\u0275elementEnd();
3448    \u0275\u0275elementStart(4, "span", 58);
3449    \u0275\u0275text(5);
3450    \u0275\u0275elementEnd()();
3451  }
3452  if (rf & 2) {
3453    const techData_r14 = \u0275\u0275nextContext(3);
3454    const ctx_r1 = \u0275\u0275nextContext(4);
3455    \u0275\u0275advance(2);
3456    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.distanceRemaining"));
3457    \u0275\u0275advance(3);
3458    \u0275\u0275textInterpolate(ctx_r1.formatDistanceCm(techData_r14.navigation.distanceRemaining));
3459  }
3460}
3461function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Conditional_7_Template(rf, ctx) {
3462  if (rf & 1) {
3463    \u0275\u0275elementStart(0, "div", 76)(1, "div", 55)(2, "div", 56)(3, "span", 57);
3464    \u0275\u0275text(4);
3465    \u0275\u0275pipe(5, "translate");
3466    \u0275\u0275elementEnd();
3467    \u0275\u0275elementStart(6, "span", 58);
3468    \u0275\u0275text(7);
3469    \u0275\u0275elementEnd()();
3470    \u0275\u0275template(8, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Conditional_7_Conditional_8_Template, 6, 4, "div", 56)(9, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Conditional_7_Conditional_9_Template, 6, 4, "div", 56)(10, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Conditional_7_Conditional_10_Template, 6, 4, "div", 56);
3471    \u0275\u0275elementStart(11, "div", 56)(12, "span", 57);
3472    \u0275\u0275text(13);
3473    \u0275\u0275pipe(14, "translate");
3474    \u0275\u0275elementEnd();
3475    \u0275\u0275elementStart(15, "span", 58)(16, "span", 77);
3476    \u0275\u0275element(17, "ion-icon", 38);
3477    \u0275\u0275text(18);
3478    \u0275\u0275elementEnd()()()()();
3479  }
3480  if (rf & 2) {
3481    const techData_r14 = \u0275\u0275nextContext(2);
3482    \u0275\u0275advance(4);
3483    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 12, "bugReportAdmin.tech.mode"));
3484    \u0275\u0275advance(3);
3485    \u0275\u0275textInterpolate(techData_r14.navigation.mode);
3486    \u0275\u0275advance();
3487    \u0275\u0275conditional(techData_r14.navigation.targetName ? 8 : -1);
3488    \u0275\u0275advance();
3489    \u0275\u0275conditional(techData_r14.navigation.currentDirection ? 9 : -1);
3490    \u0275\u0275advance();
3491    \u0275\u0275conditional(techData_r14.navigation.distanceRemaining !== void 0 ? 10 : -1);
3492    \u0275\u0275advance(3);
3493    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(14, 14, "bugReportAdmin.tech.offRoute"));
3494    \u0275\u0275advance(3);
3495    \u0275\u0275classProp("true", techData_r14.navigation.isOffRoute)("false", !techData_r14.navigation.isOffRoute);
3496    \u0275\u0275advance();
3497    \u0275\u0275property("name", techData_r14.navigation.isOffRoute ? "checkmark-outline" : "close-sharp");
3498    \u0275\u0275advance();
3499    \u0275\u0275textInterpolate1(" ", techData_r14.navigation.isOffRoute ? "Yes" : "No", " ");
3500  }
3501}
3502function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Template(rf, ctx) {
3503  if (rf & 1) {
3504    const _r13 = \u0275\u0275getCurrentView();
3505    \u0275\u0275elementStart(0, "div", 73)(1, "div", 74);
3506    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Template_div_click_1_listener() {
3507      \u0275\u0275restoreView(_r13);
3508      const report_r10 = \u0275\u0275nextContext(3).$implicit;
3509      const ctx_r1 = \u0275\u0275nextContext(2);
3510      return \u0275\u0275resetView(ctx_r1.toggleTechSection(report_r10.id, "navigation"));
3511    });
3512    \u0275\u0275element(2, "ion-icon", 75);
3513    \u0275\u0275elementStart(3, "span");
3514    \u0275\u0275text(4);
3515    \u0275\u0275pipe(5, "translate");
3516    \u0275\u0275elementEnd();
3517    \u0275\u0275element(6, "ion-icon", 38);
3518    \u0275\u0275elementEnd();
3519    \u0275\u0275template(7, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Conditional_7_Template, 19, 16, "div", 76);
3520    \u0275\u0275elementEnd();
3521  }
3522  if (rf & 2) {
3523    const report_r10 = \u0275\u0275nextContext(3).$implicit;
3524    const ctx_r1 = \u0275\u0275nextContext(2);
3525    \u0275\u0275advance(4);
3526    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 3, "bugReportAdmin.tech.navigation"));
3527    \u0275\u0275advance(2);
3528    \u0275\u0275property("name", ctx_r1.isTechSectionExpanded(report_r10.id, "navigation") ? "chevron-up-outline" : "chevron-down-outline");
3529    \u0275\u0275advance();
3530    \u0275\u0275conditional(ctx_r1.isTechSectionExpanded(report_r10.id, "navigation") ? 7 : -1);
3531  }
3532}
3533function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_2_Template(rf, ctx) {
3534  if (rf & 1) {
3535    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3536    \u0275\u0275text(2);
3537    \u0275\u0275pipe(3, "translate");
3538    \u0275\u0275elementEnd();
3539    \u0275\u0275elementStart(4, "span", 59);
3540    \u0275\u0275text(5);
3541    \u0275\u0275elementEnd()();
3542  }
3543  if (rf & 2) {
3544    const techData_r14 = \u0275\u0275nextContext(3);
3545    const ctx_r1 = \u0275\u0275nextContext(4);
3546    \u0275\u0275advance(2);
3547    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 3, "bugReportAdmin.tech.coordinates"));
3548    \u0275\u0275advance(3);
3549    \u0275\u0275textInterpolate2("", ctx_r1.formatCoord(techData_r14.position.x), ", ", ctx_r1.formatCoord(techData_r14.position.y), "");
3550  }
3551}
3552function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_3_Template(rf, ctx) {
3553  if (rf & 1) {
3554    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3555    \u0275\u0275text(2);
3556    \u0275\u0275pipe(3, "translate");
3557    \u0275\u0275elementEnd();
3558    \u0275\u0275elementStart(4, "span", 58);
3559    \u0275\u0275text(5);
3560    \u0275\u0275elementEnd()();
3561  }
3562  if (rf & 2) {
3563    const techData_r14 = \u0275\u0275nextContext(3);
3564    \u0275\u0275advance(2);
3565    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.floor"));
3566    \u0275\u0275advance(3);
3567    \u0275\u0275textInterpolate(techData_r14.position.floorName);
3568  }
3569}
3570function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_4_Template(rf, ctx) {
3571  if (rf & 1) {
3572    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3573    \u0275\u0275text(2);
3574    \u0275\u0275pipe(3, "translate");
3575    \u0275\u0275elementEnd();
3576    \u0275\u0275elementStart(4, "span", 58);
3577    \u0275\u0275text(5);
3578    \u0275\u0275elementEnd()();
3579  }
3580  if (rf & 2) {
3581    const techData_r14 = \u0275\u0275nextContext(3);
3582    \u0275\u0275advance(2);
3583    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.building"));
3584    \u0275\u0275advance(3);
3585    \u0275\u0275textInterpolate(techData_r14.position.buildingName);
3586  }
3587}
3588function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_5_Template(rf, ctx) {
3589  if (rf & 1) {
3590    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3591    \u0275\u0275text(2);
3592    \u0275\u0275pipe(3, "translate");
3593    \u0275\u0275elementEnd();
3594    \u0275\u0275elementStart(4, "span", 58)(5, "span", 79);
3595    \u0275\u0275text(6);
3596    \u0275\u0275pipe(7, "uppercase");
3597    \u0275\u0275elementEnd()()();
3598  }
3599  if (rf & 2) {
3600    const techData_r14 = \u0275\u0275nextContext(3);
3601    \u0275\u0275advance(2);
3602    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 3, "bugReportAdmin.tech.activeSource"));
3603    \u0275\u0275advance(3);
3604    \u0275\u0275property("ngClass", techData_r14.position.activeSource);
3605    \u0275\u0275advance();
3606    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(7, 5, techData_r14.position.activeSource));
3607  }
3608}
3609function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_6_Template(rf, ctx) {
3610  if (rf & 1) {
3611    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3612    \u0275\u0275text(2);
3613    \u0275\u0275pipe(3, "translate");
3614    \u0275\u0275elementEnd();
3615    \u0275\u0275elementStart(4, "span", 58);
3616    \u0275\u0275text(5);
3617    \u0275\u0275elementEnd()();
3618  }
3619  if (rf & 2) {
3620    const techData_r14 = \u0275\u0275nextContext(3);
3621    const ctx_r1 = \u0275\u0275nextContext(4);
3622    \u0275\u0275advance(2);
3623    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.beaconConfidence"));
3624    \u0275\u0275advance(3);
3625    \u0275\u0275textInterpolate(ctx_r1.formatConfidence(techData_r14.confidence.beacon.raw, techData_r14.confidence.beacon.adjusted));
3626  }
3627}
3628function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_7_Template(rf, ctx) {
3629  if (rf & 1) {
3630    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3631    \u0275\u0275text(2);
3632    \u0275\u0275pipe(3, "translate");
3633    \u0275\u0275elementEnd();
3634    \u0275\u0275elementStart(4, "span", 58);
3635    \u0275\u0275text(5);
3636    \u0275\u0275elementEnd()();
3637  }
3638  if (rf & 2) {
3639    const techData_r14 = \u0275\u0275nextContext(3);
3640    const ctx_r1 = \u0275\u0275nextContext(4);
3641    \u0275\u0275advance(2);
3642    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.gpsConfidence"));
3643    \u0275\u0275advance(3);
3644    \u0275\u0275textInterpolate(ctx_r1.formatConfidence(techData_r14.confidence.gps.raw, techData_r14.confidence.gps.adjusted));
3645  }
3646}
3647function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_8_Template(rf, ctx) {
3648  if (rf & 1) {
3649    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3650    \u0275\u0275text(2);
3651    \u0275\u0275pipe(3, "translate");
3652    \u0275\u0275elementEnd();
3653    \u0275\u0275elementStart(4, "span", 58);
3654    \u0275\u0275text(5);
3655    \u0275\u0275elementEnd()();
3656  }
3657  if (rf & 2) {
3658    const techData_r14 = \u0275\u0275nextContext(3);
3659    \u0275\u0275advance(2);
3660    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.delta"));
3661    \u0275\u0275advance(3);
3662    \u0275\u0275textInterpolate(techData_r14.confidence.delta.toFixed(2));
3663  }
3664}
3665function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Template(rf, ctx) {
3666  if (rf & 1) {
3667    \u0275\u0275elementStart(0, "div", 76)(1, "div", 55);
3668    \u0275\u0275template(2, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_2_Template, 6, 5, "div", 56)(3, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_3_Template, 6, 4, "div", 56)(4, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_4_Template, 6, 4, "div", 56)(5, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_5_Template, 8, 7, "div", 56)(6, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_6_Template, 6, 4, "div", 56)(7, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_7_Template, 6, 4, "div", 56)(8, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Conditional_8_Template, 6, 4, "div", 56);
3669    \u0275\u0275elementEnd()();
3670  }
3671  if (rf & 2) {
3672    const techData_r14 = \u0275\u0275nextContext(2);
3673    \u0275\u0275advance(2);
3674    \u0275\u0275conditional(techData_r14.position.x !== void 0 && techData_r14.position.y !== void 0 ? 2 : -1);
3675    \u0275\u0275advance();
3676    \u0275\u0275conditional(techData_r14.position.floorName ? 3 : -1);
3677    \u0275\u0275advance();
3678    \u0275\u0275conditional(techData_r14.position.buildingName ? 4 : -1);
3679    \u0275\u0275advance();
3680    \u0275\u0275conditional(techData_r14.position.activeSource ? 5 : -1);
3681    \u0275\u0275advance();
3682    \u0275\u0275conditional(techData_r14.confidence.beacon ? 6 : -1);
3683    \u0275\u0275advance();
3684    \u0275\u0275conditional(techData_r14.confidence.gps ? 7 : -1);
3685    \u0275\u0275advance();
3686    \u0275\u0275conditional(techData_r14.confidence.delta !== void 0 ? 8 : -1);
3687  }
3688}
3689function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Template(rf, ctx) {
3690  if (rf & 1) {
3691    const _r15 = \u0275\u0275getCurrentView();
3692    \u0275\u0275elementStart(0, "div", 73)(1, "div", 74);
3693    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Template_div_click_1_listener() {
3694      \u0275\u0275restoreView(_r15);
3695      const report_r10 = \u0275\u0275nextContext(3).$implicit;
3696      const ctx_r1 = \u0275\u0275nextContext(2);
3697      return \u0275\u0275resetView(ctx_r1.toggleTechSection(report_r10.id, "position"));
3698    });
3699    \u0275\u0275element(2, "ion-icon", 78);
3700    \u0275\u0275elementStart(3, "span");
3701    \u0275\u0275text(4);
3702    \u0275\u0275pipe(5, "translate");
3703    \u0275\u0275elementEnd();
3704    \u0275\u0275element(6, "ion-icon", 38);
3705    \u0275\u0275elementEnd();
3706    \u0275\u0275template(7, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Conditional_7_Template, 9, 7, "div", 76);
3707    \u0275\u0275elementEnd();
3708  }
3709  if (rf & 2) {
3710    const report_r10 = \u0275\u0275nextContext(3).$implicit;
3711    const ctx_r1 = \u0275\u0275nextContext(2);
3712    \u0275\u0275advance(4);
3713    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 3, "bugReportAdmin.tech.position"));
3714    \u0275\u0275advance(2);
3715    \u0275\u0275property("name", ctx_r1.isTechSectionExpanded(report_r10.id, "position") ? "chevron-up-outline" : "chevron-down-outline");
3716    \u0275\u0275advance();
3717    \u0275\u0275conditional(ctx_r1.isTechSectionExpanded(report_r10.id, "position") ? 7 : -1);
3718  }
3719}
3720function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_7_Conditional_7_Template(rf, ctx) {
3721  if (rf & 1) {
3722    \u0275\u0275elementStart(0, "div", 76)(1, "div", 55)(2, "div", 56)(3, "span", 57);
3723    \u0275\u0275text(4);
3724    \u0275\u0275pipe(5, "translate");
3725    \u0275\u0275elementEnd();
3726    \u0275\u0275elementStart(6, "span", 58)(7, "span", 77);
3727    \u0275\u0275element(8, "ion-icon", 38);
3728    \u0275\u0275text(9);
3729    \u0275\u0275elementEnd()()();
3730    \u0275\u0275elementStart(10, "div", 56)(11, "span", 57);
3731    \u0275\u0275text(12);
3732    \u0275\u0275pipe(13, "translate");
3733    \u0275\u0275elementEnd();
3734    \u0275\u0275elementStart(14, "span", 58);
3735    \u0275\u0275text(15);
3736    \u0275\u0275elementEnd()();
3737    \u0275\u0275elementStart(16, "div", 56)(17, "span", 57);
3738    \u0275\u0275text(18);
3739    \u0275\u0275pipe(19, "translate");
3740    \u0275\u0275elementEnd();
3741    \u0275\u0275elementStart(20, "span", 58);
3742    \u0275\u0275text(21);
3743    \u0275\u0275elementEnd()();
3744    \u0275\u0275elementStart(22, "div", 56)(23, "span", 57);
3745    \u0275\u0275text(24);
3746    \u0275\u0275pipe(25, "translate");
3747    \u0275\u0275elementEnd();
3748    \u0275\u0275elementStart(26, "span", 58);
3749    \u0275\u0275text(27);
3750    \u0275\u0275elementEnd()();
3751    \u0275\u0275elementStart(28, "div", 56)(29, "span", 57);
3752    \u0275\u0275text(30);
3753    \u0275\u0275pipe(31, "translate");
3754    \u0275\u0275elementEnd();
3755    \u0275\u0275elementStart(32, "span", 58);
3756    \u0275\u0275text(33);
3757    \u0275\u0275elementEnd()()()();
3758  }
3759  if (rf & 2) {
3760    const techData_r14 = \u0275\u0275nextContext(2);
3761    \u0275\u0275advance(4);
3762    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 15, "bugReportAdmin.tech.enabled"));
3763    \u0275\u0275advance(3);
3764    \u0275\u0275classProp("true", techData_r14.position.kalmanState.enabled)("false", !techData_r14.position.kalmanState.enabled);
3765    \u0275\u0275advance();
3766    \u0275\u0275property("name", techData_r14.position.kalmanState.enabled ? "checkmark-outline" : "close-sharp");
3767    \u0275\u0275advance();
3768    \u0275\u0275textInterpolate1(" ", techData_r14.position.kalmanState.enabled ? "Yes" : "No", " ");
3769    \u0275\u0275advance(3);
3770    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(13, 17, "bugReportAdmin.tech.speed"));
3771    \u0275\u0275advance(3);
3772    \u0275\u0275textInterpolate1("", techData_r14.position.kalmanState.speed.toFixed(4), " cm/s");
3773    \u0275\u0275advance(3);
3774    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(19, 19, "bugReportAdmin.tech.velocityX"));
3775    \u0275\u0275advance(3);
3776    \u0275\u0275textInterpolate1("", techData_r14.position.kalmanState.velocityX.toFixed(4), " cm/s");
3777    \u0275\u0275advance(3);
3778    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(25, 21, "bugReportAdmin.tech.velocityY"));
3779    \u0275\u0275advance(3);
3780    \u0275\u0275textInterpolate1("", techData_r14.position.kalmanState.velocityY.toFixed(4), " cm/s");
3781    \u0275\u0275advance(3);
3782    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(31, 23, "bugReportAdmin.tech.uncertainty"));
3783    \u0275\u0275advance(3);
3784    \u0275\u0275textInterpolate1("", techData_r14.position.kalmanState.uncertainty.toFixed(2), " cm");
3785  }
3786}
3787function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_7_Template(rf, ctx) {
3788  if (rf & 1) {
3789    const _r16 = \u0275\u0275getCurrentView();
3790    \u0275\u0275elementStart(0, "div", 73)(1, "div", 74);
3791    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_7_Template_div_click_1_listener() {
3792      \u0275\u0275restoreView(_r16);
3793      const report_r10 = \u0275\u0275nextContext(3).$implicit;
3794      const ctx_r1 = \u0275\u0275nextContext(2);
3795      return \u0275\u0275resetView(ctx_r1.toggleTechSection(report_r10.id, "kalman"));
3796    });
3797    \u0275\u0275element(2, "ion-icon", 80);
3798    \u0275\u0275elementStart(3, "span");
3799    \u0275\u0275text(4);
3800    \u0275\u0275pipe(5, "translate");
3801    \u0275\u0275elementEnd();
3802    \u0275\u0275element(6, "ion-icon", 38);
3803    \u0275\u0275elementEnd();
3804    \u0275\u0275template(7, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_7_Conditional_7_Template, 34, 25, "div", 76);
3805    \u0275\u0275elementEnd();
3806  }
3807  if (rf & 2) {
3808    const report_r10 = \u0275\u0275nextContext(3).$implicit;
3809    const ctx_r1 = \u0275\u0275nextContext(2);
3810    \u0275\u0275advance(4);
3811    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 3, "bugReportAdmin.tech.kalman"));
3812    \u0275\u0275advance(2);
3813    \u0275\u0275property("name", ctx_r1.isTechSectionExpanded(report_r10.id, "kalman") ? "chevron-up-outline" : "chevron-down-outline");
3814    \u0275\u0275advance();
3815    \u0275\u0275conditional(ctx_r1.isTechSectionExpanded(report_r10.id, "kalman") ? 7 : -1);
3816  }
3817}
3818function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_8_Conditional_7_Conditional_11_Template(rf, ctx) {
3819  if (rf & 1) {
3820    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3821    \u0275\u0275text(2);
3822    \u0275\u0275pipe(3, "translate");
3823    \u0275\u0275elementEnd();
3824    \u0275\u0275elementStart(4, "span", 58);
3825    \u0275\u0275text(5);
3826    \u0275\u0275element(6, "br");
3827    \u0275\u0275elementStart(7, "span", 82);
3828    \u0275\u0275text(8);
3829    \u0275\u0275elementEnd()()();
3830  }
3831  if (rf & 2) {
3832    const techData_r14 = \u0275\u0275nextContext(3);
3833    \u0275\u0275advance(2);
3834    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 3, "bugReportAdmin.tech.secondaryBeacon"));
3835    \u0275\u0275advance(3);
3836    \u0275\u0275textInterpolate1(" ", techData_r14.position.stablePair.secondaryBeaconName || "-", " ");
3837    \u0275\u0275advance(3);
3838    \u0275\u0275textInterpolate(techData_r14.position.stablePair.secondaryBeaconId);
3839  }
3840}
3841function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_8_Conditional_7_Template(rf, ctx) {
3842  if (rf & 1) {
3843    \u0275\u0275elementStart(0, "div", 76)(1, "div", 55)(2, "div", 56)(3, "span", 57);
3844    \u0275\u0275text(4);
3845    \u0275\u0275pipe(5, "translate");
3846    \u0275\u0275elementEnd();
3847    \u0275\u0275elementStart(6, "span", 58);
3848    \u0275\u0275text(7);
3849    \u0275\u0275element(8, "br");
3850    \u0275\u0275elementStart(9, "span", 82);
3851    \u0275\u0275text(10);
3852    \u0275\u0275elementEnd()()();
3853    \u0275\u0275template(11, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_8_Conditional_7_Conditional_11_Template, 9, 5, "div", 56);
3854    \u0275\u0275elementEnd()();
3855  }
3856  if (rf & 2) {
3857    const techData_r14 = \u0275\u0275nextContext(2);
3858    \u0275\u0275advance(4);
3859    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 4, "bugReportAdmin.tech.primaryBeacon"));
3860    \u0275\u0275advance(3);
3861    \u0275\u0275textInterpolate1(" ", techData_r14.position.stablePair.primaryBeaconName || "-", " ");
3862    \u0275\u0275advance(3);
3863    \u0275\u0275textInterpolate(techData_r14.position.stablePair.primaryBeaconId);
3864    \u0275\u0275advance();
3865    \u0275\u0275conditional(techData_r14.position.stablePair.secondaryBeaconId ? 11 : -1);
3866  }
3867}
3868function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_8_Template(rf, ctx) {
3869  if (rf & 1) {
3870    const _r17 = \u0275\u0275getCurrentView();
3871    \u0275\u0275elementStart(0, "div", 73)(1, "div", 74);
3872    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_8_Template_div_click_1_listener() {
3873      \u0275\u0275restoreView(_r17);
3874      const report_r10 = \u0275\u0275nextContext(3).$implicit;
3875      const ctx_r1 = \u0275\u0275nextContext(2);
3876      return \u0275\u0275resetView(ctx_r1.toggleTechSection(report_r10.id, "beaconPair"));
3877    });
3878    \u0275\u0275element(2, "ion-icon", 81);
3879    \u0275\u0275elementStart(3, "span");
3880    \u0275\u0275text(4);
3881    \u0275\u0275pipe(5, "translate");
3882    \u0275\u0275elementEnd();
3883    \u0275\u0275element(6, "ion-icon", 38);
3884    \u0275\u0275elementEnd();
3885    \u0275\u0275template(7, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_8_Conditional_7_Template, 12, 6, "div", 76);
3886    \u0275\u0275elementEnd();
3887  }
3888  if (rf & 2) {
3889    const report_r10 = \u0275\u0275nextContext(3).$implicit;
3890    const ctx_r1 = \u0275\u0275nextContext(2);
3891    \u0275\u0275advance(4);
3892    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 3, "bugReportAdmin.tech.beaconPair"));
3893    \u0275\u0275advance(2);
3894    \u0275\u0275property("name", ctx_r1.isTechSectionExpanded(report_r10.id, "beaconPair") ? "chevron-up-outline" : "chevron-down-outline");
3895    \u0275\u0275advance();
3896    \u0275\u0275conditional(ctx_r1.isTechSectionExpanded(report_r10.id, "beaconPair") ? 7 : -1);
3897  }
3898}
3899function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Conditional_8_Template(rf, ctx) {
3900  if (rf & 1) {
3901    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3902    \u0275\u0275text(2);
3903    \u0275\u0275pipe(3, "translate");
3904    \u0275\u0275elementEnd();
3905    \u0275\u0275elementStart(4, "span", 58);
3906    \u0275\u0275text(5);
3907    \u0275\u0275elementEnd()();
3908  }
3909  if (rf & 2) {
3910    const techData_r14 = \u0275\u0275nextContext(3);
3911    \u0275\u0275advance(2);
3912    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.strongestSignal"));
3913    \u0275\u0275advance(3);
3914    \u0275\u0275textInterpolate1("", techData_r14.beacons.signalQuality == null ? null : techData_r14.beacons.signalQuality.strongestRssi, " dBm");
3915  }
3916}
3917function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Conditional_9_Template(rf, ctx) {
3918  if (rf & 1) {
3919    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3920    \u0275\u0275text(2);
3921    \u0275\u0275pipe(3, "translate");
3922    \u0275\u0275elementEnd();
3923    \u0275\u0275elementStart(4, "span", 58);
3924    \u0275\u0275text(5);
3925    \u0275\u0275elementEnd()();
3926  }
3927  if (rf & 2) {
3928    const techData_r14 = \u0275\u0275nextContext(3);
3929    \u0275\u0275advance(2);
3930    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.avgRssi"));
3931    \u0275\u0275advance(3);
3932    \u0275\u0275textInterpolate1("", techData_r14.beacons.signalQuality == null ? null : techData_r14.beacons.signalQuality.avgRssi, " dBm");
3933  }
3934}
3935function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Conditional_10_Template(rf, ctx) {
3936  if (rf & 1) {
3937    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
3938    \u0275\u0275text(2);
3939    \u0275\u0275pipe(3, "translate");
3940    \u0275\u0275elementEnd();
3941    \u0275\u0275elementStart(4, "span", 58);
3942    \u0275\u0275text(5);
3943    \u0275\u0275elementEnd()();
3944  }
3945  if (rf & 2) {
3946    const techData_r14 = \u0275\u0275nextContext(3);
3947    const ctx_r1 = \u0275\u0275nextContext(4);
3948    \u0275\u0275advance(2);
3949    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.lastUpdate"));
3950    \u0275\u0275advance(3);
3951    \u0275\u0275textInterpolate(ctx_r1.formatTimeSince(techData_r14.beacons.timeSinceLastMs));
3952  }
3953}
3954function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Conditional_11_For_24_Template(rf, ctx) {
3955  if (rf & 1) {
3956    \u0275\u0275elementStart(0, "tr")(1, "td", 86);
3957    \u0275\u0275text(2);
3958    \u0275\u0275elementEnd();
3959    \u0275\u0275elementStart(3, "td", 87);
3960    \u0275\u0275text(4);
3961    \u0275\u0275elementEnd();
3962    \u0275\u0275elementStart(5, "td", 87);
3963    \u0275\u0275text(6);
3964    \u0275\u0275elementEnd();
3965    \u0275\u0275elementStart(7, "td");
3966    \u0275\u0275text(8);
3967    \u0275\u0275elementEnd();
3968    \u0275\u0275elementStart(9, "td");
3969    \u0275\u0275text(10);
3970    \u0275\u0275elementEnd();
3971    \u0275\u0275elementStart(11, "td");
3972    \u0275\u0275text(12);
3973    \u0275\u0275elementEnd()();
3974  }
3975  if (rf & 2) {
3976    const beacon_r19 = ctx.$implicit;
3977    const ctx_r1 = \u0275\u0275nextContext(8);
3978    \u0275\u0275advance(2);
3979    \u0275\u0275textInterpolate(beacon_r19.name);
3980    \u0275\u0275advance(2);
3981    \u0275\u0275textInterpolate1("", beacon_r19.rssi, " dBm");
3982    \u0275\u0275advance(2);
3983    \u0275\u0275textInterpolate(beacon_r19.filteredRssi.toFixed(1));
3984    \u0275\u0275advance(2);
3985    \u0275\u0275textInterpolate(ctx_r1.formatDistanceCm(beacon_r19.distanceCm));
3986    \u0275\u0275advance(2);
3987    \u0275\u0275textInterpolate(beacon_r19.batteryPercent !== null ? beacon_r19.batteryPercent + "%" : "-");
3988    \u0275\u0275advance(2);
3989    \u0275\u0275textInterpolate(ctx_r1.formatTimeSince(beacon_r19.lastSeenMs));
3990  }
3991}
3992function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Conditional_11_Template(rf, ctx) {
3993  if (rf & 1) {
3994    \u0275\u0275elementStart(0, "div", 84)(1, "table", 85)(2, "thead")(3, "tr")(4, "th");
3995    \u0275\u0275text(5);
3996    \u0275\u0275pipe(6, "translate");
3997    \u0275\u0275elementEnd();
3998    \u0275\u0275elementStart(7, "th");
3999    \u0275\u0275text(8);
4000    \u0275\u0275pipe(9, "translate");
4001    \u0275\u0275elementEnd();
4002    \u0275\u0275elementStart(10, "th");
4003    \u0275\u0275text(11);
4004    \u0275\u0275pipe(12, "translate");
4005    \u0275\u0275elementEnd();
4006    \u0275\u0275elementStart(13, "th");
4007    \u0275\u0275text(14);
4008    \u0275\u0275pipe(15, "translate");
4009    \u0275\u0275elementEnd();
4010    \u0275\u0275elementStart(16, "th");
4011    \u0275\u0275text(17);
4012    \u0275\u0275pipe(18, "translate");
4013    \u0275\u0275elementEnd();
4014    \u0275\u0275elementStart(19, "th");
4015    \u0275\u0275text(20);
4016    \u0275\u0275pipe(21, "translate");
4017    \u0275\u0275elementEnd()()();
4018    \u0275\u0275elementStart(22, "tbody");
4019    \u0275\u0275repeaterCreate(23, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Conditional_11_For_24_Template, 13, 6, "tr", null, _forTrack1);
4020    \u0275\u0275elementEnd()()();
4021  }
4022  if (rf & 2) {
4023    const techData_r14 = \u0275\u0275nextContext(3);
4024    \u0275\u0275advance(5);
4025    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(6, 6, "bugReportAdmin.tech.beacon"));
4026    \u0275\u0275advance(3);
4027    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(9, 8, "bugReportAdmin.tech.r
4027ssi"));
4028    \u0275\u0275advance(3);
4029    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(12, 10, "bugReportAdmin.tech.filteredRssi"));
4030    \u0275\u0275advance(3);
4031    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(15, 12, "bugReportAdmin.tech.distance"));
4032    \u0275\u0275advance(3);
4033    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(18, 14, "bugReportAdmin.tech.battery"));
4034    \u0275\u0275advance(3);
4035    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(21, 16, "bugReportAdmin.tech.lastSeen"));
4036    \u0275\u0275advance(3);
4037    \u0275\u0275repeater(techData_r14.beacons.activeBeacons);
4038  }
4039}
4040function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Template(rf, ctx) {
4041  if (rf & 1) {
4042    \u0275\u0275elementStart(0, "div", 76)(1, "div", 55)(2, "div", 56)(3, "span", 57);
4043    \u0275\u0275text(4);
4044    \u0275\u0275pipe(5, "translate");
4045    \u0275\u0275elementEnd();
4046    \u0275\u0275elementStart(6, "span", 58);
4047    \u0275\u0275text(7);
4048    \u0275\u0275elementEnd()();
4049    \u0275\u0275template(8, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Conditional_8_Template, 6, 4, "div", 56)(9, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Conditional_9_Template, 6, 4, "div", 56)(10, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Conditional_10_Template, 6, 4, "div", 56);
4050    \u0275\u0275elementEnd();
4051    \u0275\u0275template(11, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Conditional_11_Template, 25, 18, "div", 84);
4052    \u0275\u0275elementEnd();
4053  }
4054  if (rf & 2) {
4055    const techData_r14 = \u0275\u0275nextContext(2);
4056    \u0275\u0275advance(4);
4057    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 6, "bugReportAdmin.tech.mode"));
4058    \u0275\u0275advance(3);
4059    \u0275\u0275textInterpolate(techData_r14.beacons.mode);
4060    \u0275\u0275advance();
4061    \u0275\u0275conditional((techData_r14.beacons.signalQuality == null ? null : techData_r14.beacons.signalQuality.strongestRssi) !== void 0 ? 8 : -1);
4062    \u0275\u0275advance();
4063    \u0275\u0275conditional((techData_r14.beacons.signalQuality == null ? null : techData_r14.beacons.signalQuality.avgRssi) !== void 0 ? 9 : -1);
4064    \u0275\u0275advance();
4065    \u0275\u0275conditional(techData_r14.beacons.timeSinceLastMs !== null ? 10 : -1);
4066    \u0275\u0275advance();
4067    \u0275\u0275conditional(techData_r14.beacons.activeBeacons.length ? 11 : -1);
4068  }
4069}
4070function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Template(rf, ctx) {
4071  if (rf & 1) {
4072    const _r18 = \u0275\u0275getCurrentView();
4073    \u0275\u0275elementStart(0, "div", 73)(1, "div", 74);
4074    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Template_div_click_1_listener() {
4075      \u0275\u0275restoreView(_r18);
4076      const report_r10 = \u0275\u0275nextContext(3).$implicit;
4077      const ctx_r1 = \u0275\u0275nextContext(2);
4078      return \u0275\u0275resetView(ctx_r1.toggleTechSection(report_r10.id, "beacons"));
4079    });
4080    \u0275\u0275element(2, "ion-icon", 83);
4081    \u0275\u0275elementStart(3, "span");
4082    \u0275\u0275text(4);
4083    \u0275\u0275pipe(5, "translate");
4084    \u0275\u0275elementEnd();
4085    \u0275\u0275element(6, "ion-icon", 38);
4086    \u0275\u0275elementEnd();
4087    \u0275\u0275template(7, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Conditional_7_Template, 12, 8, "div", 76);
4088    \u0275\u0275elementEnd();
4089  }
4090  if (rf & 2) {
4091    const techData_r14 = \u0275\u0275nextContext();
4092    const report_r10 = \u0275\u0275nextContext(2).$implicit;
4093    const ctx_r1 = \u0275\u0275nextContext(2);
4094    \u0275\u0275advance(4);
4095    \u0275\u0275textInterpolate2("", \u0275\u0275pipeBind1(5, 4, "bugReportAdmin.tech.beacons"), " (", techData_r14.beacons.count, ")");
4096    \u0275\u0275advance(2);
4097    \u0275\u0275property("name", ctx_r1.isTechSectionExpanded(report_r10.id, "beacons") ? "chevron-up-outline" : "chevron-down-outline");
4098    \u0275\u0275advance();
4099    \u0275\u0275conditional(ctx_r1.isTechSectionExpanded(report_r10.id, "beacons") ? 7 : -1);
4100  }
4101}
4102function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Conditional_10_Template(rf, ctx) {
4103  if (rf & 1) {
4104    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
4105    \u0275\u0275text(2);
4106    \u0275\u0275pipe(3, "translate");
4107    \u0275\u0275elementEnd();
4108    \u0275\u0275elementStart(4, "span", 59);
4109    \u0275\u0275text(5);
4110    \u0275\u0275elementEnd()();
4111  }
4112  if (rf & 2) {
4113    const techData_r14 = \u0275\u0275nextContext(3);
4114    const ctx_r1 = \u0275\u0275nextContext(4);
4115    \u0275\u0275advance(2);
4116    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 3, "bugReportAdmin.tech.coordinates"));
4117    \u0275\u0275advance(3);
4118    \u0275\u0275textInterpolate2("", ctx_r1.formatGpsCoord(techData_r14.gps.position == null ? null : techData_r14.gps.position.latitude), ", ", ctx_r1.formatGpsCoord(techData_r14.gps.position == null ? null : techData_r14.gps.position.longitude), "");
4119  }
4120}
4121function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Conditional_11_Template(rf, ctx) {
4122  if (rf & 1) {
4123    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
4124    \u0275\u0275text(2);
4125    \u0275\u0275pipe(3, "translate");
4126    \u0275\u0275elementEnd();
4127    \u0275\u0275elementStart(4, "span", 58);
4128    \u0275\u0275text(5);
4129    \u0275\u0275elementEnd()();
4130  }
4131  if (rf & 2) {
4132    const techData_r14 = \u0275\u0275nextContext(3);
4133    \u0275\u0275advance(2);
4134    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.accuracy"));
4135    \u0275\u0275advance(3);
4136    \u0275\u0275textInterpolate1("", techData_r14.gps.position == null ? null : techData_r14.gps.position.accuracyMeters, "m");
4137  }
4138}
4139function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Conditional_12_Template(rf, ctx) {
4140  if (rf & 1) {
4141    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
4142    \u0275\u0275text(2);
4143    \u0275\u0275pipe(3, "translate");
4144    \u0275\u0275elementEnd();
4145    \u0275\u0275elementStart(4, "span", 58);
4146    \u0275\u0275text(5);
4147    \u0275\u0275elementEnd()();
4148  }
4149  if (rf & 2) {
4150    const techData_r14 = \u0275\u0275nextContext(3);
4151    const ctx_r1 = \u0275\u0275nextContext(4);
4152    \u0275\u0275advance(2);
4153    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.lastUpdate"));
4154    \u0275\u0275advance(3);
4155    \u0275\u0275textInterpolate(ctx_r1.formatTimeSince(techData_r14.gps.timeSinceLastMs));
4156  }
4157}
4158function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Conditional_13_Template(rf, ctx) {
4159  if (rf & 1) {
4160    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
4161    \u0275\u0275text(2);
4162    \u0275\u0275pipe(3, "translate");
4163    \u0275\u0275elementEnd();
4164    \u0275\u0275elementStart(4, "span", 58);
4165    \u0275\u0275text(5);
4166    \u0275\u0275elementEnd()();
4167  }
4168  if (rf & 2) {
4169    const techData_r14 = \u0275\u0275nextContext(3);
4170    \u0275\u0275advance(2);
4171    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.altitude"));
4172    \u0275\u0275advance(3);
4173    \u0275\u0275textInterpolate1("", techData_r14.gps.position == null ? null : techData_r14.gps.position.altitude == null ? null : techData_r14.gps.position.altitude.toFixed(1), "m");
4174  }
4175}
4176function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Conditional_14_Template(rf, ctx) {
4177  if (rf & 1) {
4178    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
4179    \u0275\u0275text(2);
4180    \u0275\u0275pipe(3, "translate");
4181    \u0275\u0275elementEnd();
4182    \u0275\u0275elementStart(4, "span", 58);
4183    \u0275\u0275text(5);
4184    \u0275\u0275elementEnd()();
4185  }
4186  if (rf & 2) {
4187    const techData_r14 = \u0275\u0275nextContext(3);
4188    \u0275\u0275advance(2);
4189    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.speed"));
4190    \u0275\u0275advance(3);
4191    \u0275\u0275textInterpolate1("", techData_r14.gps.position == null ? null : techData_r14.gps.position.speed == null ? null : techData_r14.gps.position.speed.toFixed(2), " m/s");
4192  }
4193}
4194function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Template(rf, ctx) {
4195  if (rf & 1) {
4196    \u0275\u0275elementStart(0, "div", 76)(1, "div", 55)(2, "div", 56)(3, "span", 57);
4197    \u0275\u0275text(4);
4198    \u0275\u0275pipe(5, "translate");
4199    \u0275\u0275elementEnd();
4200    \u0275\u0275elementStart(6, "span", 58)(7, "span", 77);
4201    \u0275\u0275element(8, "ion-icon", 38);
4202    \u0275\u0275text(9);
4203    \u0275\u0275elementEnd()()();
4204    \u0275\u0275template(10, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Conditional_10_Template, 6, 5, "div", 56)(11, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Conditional_11_Template, 6, 4, "div", 56)(12, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Conditional_12_Template, 6, 4, "div", 56)(13, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Conditional_13_Template, 6, 4, "div", 56)(14, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Conditional_14_Template, 6, 4, "div", 56);
4205    \u0275\u0275elementEnd()();
4206  }
4207  if (rf & 2) {
4208    const techData_r14 = \u0275\u0275nextContext(2);
4209    \u0275\u0275advance(4);
4210    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 12, "bugReportAdmin.tech.gpsStatus"));
4211    \u0275\u0275advance(3);
4212    \u0275\u0275classProp("true", techData_r14.gps.status.available)("false", !techData_r14.gps.status.available);
4213    \u0275\u0275advance();
4214    \u0275\u0275property("name", techData_r14.gps.status.available ? "checkmark-outline" : "close-sharp");
4215    \u0275\u0275advance();
4216    \u0275\u0275textInterpolate1(" ", techData_r14.gps.status.available ? "Available" : "Unavailable", " ");
4217    \u0275\u0275advance();
4218    \u0275\u0275conditional((techData_r14.gps.position == null ? null : techData_r14.gps.position.latitude) !== void 0 ? 10 : -1);
4219    \u0275\u0275advance();
4220    \u0275\u0275conditional((techData_r14.gps.position == null ? null : techData_r14.gps.position.accuracyMeters) !== void 0 ? 11 : -1);
4221    \u0275\u0275advance();
4222    \u0275\u0275conditional(techData_r14.gps.timeSinceLastMs !== null ? 12 : -1);
4223    \u0275\u0275advance();
4224    \u0275\u0275conditional((techData_r14.gps.position == null ? null : techData_r14.gps.position.altitude) !== void 0 ? 13 : -1);
4225    \u0275\u0275advance();
4226    \u0275\u0275conditional((techData_r14.gps.position == null ? null : techData_r14.gps.position.speed) !== void 0 ? 14 : -1);
4227  }
4228}
4229function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Template(rf, ctx) {
4230  if (rf & 1) {
4231    const _r20 = \u0275\u0275getCurrentView();
4232    \u0275\u0275elementStart(0, "div", 73)(1, "div", 74);
4233    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Template_div_click_1_listener() {
4234      \u0275\u0275restoreView(_r20);
4235      const report_r10 = \u0275\u0275nextContext(3).$implicit;
4236      const ctx_r1 = \u0275\u0275nextContext(2);
4237      return \u0275\u0275resetView(ctx_r1.toggleTechSection(report_r10.id, "gps"));
4238    });
4239    \u0275\u0275element(2, "ion-icon", 78);
4240    \u0275\u0275elementStart(3, "span");
4241    \u0275\u0275text(4);
4242    \u0275\u0275pipe(5, "translate");
4243    \u0275\u0275elementEnd();
4244    \u0275\u0275element(6, "ion-icon", 38);
4245    \u0275\u0275elementEnd();
4246    \u0275\u0275template(7, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Conditional_7_Template, 15, 14, "div", 76);
4247    \u0275\u0275elementEnd();
4248  }
4249  if (rf & 2) {
4250    const report_r10 = \u0275\u0275nextContext(3).$implicit;
4251    const ctx_r1 = \u0275\u0275nextContext(2);
4252    \u0275\u0275advance(4);
4253    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 3, "bugReportAdmin.tech.gps"));
4254    \u0275\u0275advance(2);
4255    \u0275\u0275property("name", ctx_r1.isTechSectionExpanded(report_r10.id, "gps") ? "chevron-up-outline" : "chevron-down-outline");
4256    \u0275\u0275advance();
4257    \u0275\u0275conditional(ctx_r1.isTechSectionExpanded(report_r10.id, "gps") ? 7 : -1);
4258  }
4259}
4260function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_11_Conditional_6_Conditional_42_Template(rf, ctx) {
4261  if (rf & 1) {
4262    \u0275\u0275elementStart(0, "p", 89);
4263    \u0275\u0275text(1);
4264    \u0275\u0275elementEnd();
4265  }
4266  if (rf & 2) {
4267    const rendering_r22 = \u0275\u0275nextContext(2);
4268    \u0275\u0275advance();
4269    \u0275\u0275textInterpolate(rendering_r22.latestError);
4270  }
4271}
4272function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_11_Conditional_6_Template(rf, ctx) {
4273  if (rf & 1) {
4274    \u0275\u0275elementStart(0, "div", 76)(1, "div", 55)(2, "div", 56)(3, "span", 57);
4275    \u0275\u0275text(4, "Status");
4276    \u0275\u0275elementEnd();
4277    \u0275\u0275elementStart(5, "span", 58);
4278    \u0275\u0275text(6);
4279    \u0275\u0275elementEnd()();
4280    \u0275\u0275elementStart(7, "div", 56)(8, "span", 57);
4281    \u0275\u0275text(9, "GPU");
4282    \u0275\u0275elementEnd();
4283    \u0275\u0275elementStart(10, "span", 59);
4284    \u0275\u0275text(11);
4285    \u0275\u0275elementEnd()();
4286    \u0275\u0275elementStart(12, "div", 56)(13, "span", 57);
4287    \u0275\u0275text(14, "WebGL");
4288    \u0275\u0275elementEnd();
4289    \u0275\u0275elementStart(15, "span", 58);
4290    \u0275\u0275text(16);
4291    \u0275\u0275elementEnd()();
4292    \u0275\u0275elementStart(17, "div", 56)(18, "span", 57);
4293    \u0275\u0275text(19, "Framebuffer");
4294    \u0275\u0275elementEnd();
4295    \u0275\u0275elementStart(20, "span", 58);
4296    \u0275\u0275text(21);
4297    \u0275\u0275elementEnd()();
4298    \u0275\u0275elementStart(22, "div", 56)(23, "span", 57);
4299    \u0275\u0275text(24, "Labels");
4300    \u0275\u0275elementEnd();
4301    \u0275\u0275elementStart(25, "span", 58);
4302    \u0275\u0275text(26);
4303    \u0275\u0275elementEnd()();
4304    \u0275\u0275elementStart(27, "div", 56)(28, "span", 57);
4305    \u0275\u0275text(29, "Label options");
4306    \u0275\u0275elementEnd();
4307    \u0275\u0275elementStart(30, "span", 58);
4308    \u0275\u0275text(31);
4309    \u0275\u0275elementEnd()();
4310    \u0275\u0275elementStart(32, "div", 56)(33, "span", 57);
4311    \u0275\u0275text(34, "Context events");
4312    \u0275\u0275elementEnd();
4313    \u0275\u0275elementStart(35, "span", 58);
4314    \u0275\u0275text(36);
4315    \u0275\u0275elementEnd()();
4316    \u0275\u0275elementStart(37, "div", 56)(38, "span", 57);
4317    \u0275\u0275text(39, "Actions");
4318    \u0275\u0275elementEnd();
4319    \u0275\u0275elementStart(40, "span", 58);
4320    \u0275\u0275text(41);
4321    \u0275\u0275elementEnd()()();
4322    \u0275\u0275template(42, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_11_Conditional_6_Conditional_42_Template, 2, 1, "p", 89);
4323    \u0275\u0275elementEnd();
4324  }
4325  if (rf & 2) {
4326    let tmp_22_0;
4327    const rendering_r22 = \u0275\u0275nextContext();
4328    \u0275\u0275advance(6);
4329    \u0275\u0275textInterpolate(rendering_r22.status);
4330    \u0275\u0275advance(5);
4331    \u0275\u0275textInterpolate((rendering_r22.webgl == null ? null : rendering_r22.webgl.unmaskedRenderer) || (rendering_r22.webgl == null ? null : rendering_r22.webgl.renderer) || "\u2014");
4332    \u0275\u0275advance(5);
4333    \u0275\u0275textInterpolate((rendering_r22.webgl == null ? null : rendering_r22.webgl.version) || "\u2014");
4334    \u0275\u0275advance(5);
4335    \u0275\u0275textInterpolate3("", rendering_r22.drawingBuffer.width, "\xD7", rendering_r22.drawingBuffer.height, " \xB7 DPR ", rendering_r22.rendererPixelRatio, "");
4336    \u0275\u0275advance(5);
4337    \u0275\u0275textInterpolate2("", (tmp_22_0 = rendering_r22.labels == null ? null : rendering_r22.labels.buildingCount) !== null && tmp_22_0 !== void 0 ? tmp_22_0 : 0, " building / ", (tmp_22_0 = rendering_r22.labels == null ? null : rendering_r22.labels.roomCount) !== null && tmp_22_0 !== void 0 ? tmp_22_0 : 0, " room");
4338    \u0275\u0275advance(5);
4339    \u0275\u0275textInterpolate6("mip ", rendering_r22.options.generateLabelMipmaps ? "ON" : "OFF", " \xB7 ", rendering_r22.options.labelCanvasPixelRatio, "\xD7 \xB7 ", rendering_r22.options.forcePowerOfTwoLabelTextures ? "POT" : "native size", " \xB7 ", rendering_r22.options.labelTextureFilter || "linear", " \xB7 premultiply ", rendering_r22.options.premultiplyLabelAlp
4339ha ? "ON" : "OFF", " \xB7 vertex padding ", rendering_r22.options.padLabelVertexBuffer ? "ON" : "OFF", "");
4340    \u0275\u0275advance(5);
4341    \u0275\u0275textInterpolate2("", rendering_r22.context.lossCount, " lost / ", rendering_r22.context.restorationCount, " restored");
4342    \u0275\u0275advance(5);
4343    \u0275\u0275textInterpolate(rendering_r22.actionHistory.length);
4344    \u0275\u0275advance();
4345    \u0275\u0275conditional(rendering_r22.latestError ? 42 : -1);
4346  }
4347}
4348function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_11_Template(rf, ctx) {
4349  if (rf & 1) {
4350    const _r21 = \u0275\u0275getCurrentView();
4351    \u0275\u0275elementStart(0, "div", 73)(1, "div", 74);
4352    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_11_Template_div_click_1_listener() {
4353      \u0275\u0275restoreView(_r21);
4354      const report_r10 = \u0275\u0275nextContext(3).$implicit;
4355      const ctx_r1 = \u0275\u0275nextContext(2);
4356      return \u0275\u0275resetView(ctx_r1.toggleTechSection(report_r10.id, "rendering"));
4357    });
4358    \u0275\u0275element(2, "ion-icon", 88);
4359    \u0275\u0275elementStart(3, "span");
4360    \u0275\u0275text(4, "GPU Rendering");
4361    \u0275\u0275elementEnd();
4362    \u0275\u0275element(5, "ion-icon", 38);
4363    \u0275\u0275elementEnd();
4364    \u0275\u0275template(6, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_11_Conditional_6_Template, 43, 18, "div", 76);
4365    \u0275\u0275elementEnd();
4366  }
4367  if (rf & 2) {
4368    const report_r10 = \u0275\u0275nextContext(3).$implicit;
4369    const ctx_r1 = \u0275\u0275nextContext(2);
4370    \u0275\u0275advance(5);
4371    \u0275\u0275property("name", ctx_r1.isTechSectionExpanded(report_r10.id, "rendering") ? "chevron-up-outline" : "chevron-down-outline");
4372    \u0275\u0275advance();
4373    \u0275\u0275conditional(ctx_r1.isTechSectionExpanded(report_r10.id, "rendering") ? 6 : -1);
4374  }
4375}
4376function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_12_Conditional_7_Template(rf, ctx) {
4377  if (rf & 1) {
4378    \u0275\u0275elementStart(0, "div", 76)(1, "div", 55)(2, "div", 56)(3, "span", 57);
4379    \u0275\u0275text(4);
4380    \u0275\u0275pipe(5, "translate");
4381    \u0275\u0275elementEnd();
4382    \u0275\u0275elementStart(6, "span", 58);
4383    \u0275\u0275text(7);
4384    \u0275\u0275elementEnd()();
4385    \u0275\u0275elementStart(8, "div", 56)(9, "span", 57);
4386    \u0275\u0275text(10);
4387    \u0275\u0275pipe(11, "translate");
4388    \u0275\u0275elementEnd();
4389    \u0275\u0275elementStart(12, "span", 58);
4390    \u0275\u0275text(13);
4391    \u0275\u0275elementEnd()();
4392    \u0275\u0275elementStart(14, "div", 56)(15, "span", 57);
4393    \u0275\u0275text(16);
4394    \u0275\u0275pipe(17, "translate");
4395    \u0275\u0275elementEnd();
4396    \u0275\u0275elementStart(18, "span", 58);
4397    \u0275\u0275text(19);
4398    \u0275\u0275elementEnd()();
4399    \u0275\u0275elementStart(20, "div", 56)(21, "span", 57);
4400    \u0275\u0275text(22);
4401    \u0275\u0275pipe(23, "translate");
4402    \u0275\u0275elementEnd();
4403    \u0275\u0275elementStart(24, "span", 58)(25, "span", 77);
4404    \u0275\u0275element(26, "ion-icon", 38);
4405    \u0275\u0275text(27);
4406    \u0275\u0275elementEnd()()();
4407    \u0275\u0275elementStart(28, "div", 56)(29, "span", 57);
4408    \u0275\u0275text(30);
4409    \u0275\u0275pipe(31, "translate");
4410    \u0275\u0275elementEnd();
4411    \u0275\u0275elementStart(32, "span", 58)(33, "span", 77);
4412    \u0275\u0275element(34, "ion-icon", 38);
4413    \u0275\u0275text(35);
4414    \u0275\u0275elementEnd()()()()();
4415  }
4416  if (rf & 2) {
4417    const techData_r14 = \u0275\u0275nextContext(2);
4418    \u0275\u0275advance(4);
4419    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 20, "bugReportAdmin.tech.positioningMode"));
4420    \u0275\u0275advance(3);
4421    \u0275\u0275textInterpolate(techData_r14.settings.positioningMode);
4422    \u0275\u0275advance(3);
4423    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(11, 22, "bugReportAdmin.tech.locationMode"));
4424    \u0275\u0275advance(3);
4425    \u0275\u0275textInterpolate(techData_r14.settings.locationMode);
4426    \u0275\u0275advance(3);
4427    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(17, 24, "bugReportAdmin.tech.r
4427ssiFilter"));
4428    \u0275\u0275advance(3);
4429    \u0275\u0275textInterpolate(techData_r14.settings.rssiFilterType);
4430    \u0275\u0275advance(3);
4431    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(23, 26, "bugReportAdmin.tech.kalmanFilter"));
4432    \u0275\u0275advance(3);
4433    \u0275\u0275classProp("true", techData_r14.settings.kalmanEnabled)("false", !techData_r14.settings.kalmanEnabled);
4434    \u0275\u0275advance();
4435    \u0275\u0275property("name", techData_r14.settings.kalmanEnabled ? "checkmark-outline" : "close-sharp");
4436    \u0275\u0275advance();
4437    \u0275\u0275textInterpolate1(" ", techData_r14.settings.kalmanEnabled ? "Enabled" : "Disabled", " ");
4438    \u0275\u0275advance(3);
4439    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(31, 28, "bugReportAdmin.tech.smartSwitching"));
4440    \u0275\u0275advance(3);
4441    \u0275\u0275classProp("true", techData_r14.settings.smartSwitchingEnabled)("false", !techData_r14.settings.smartSwitchingEnabled);
4442    \u0275\u0275advance();
4443    \u0275\u0275property("name", techData_r14.settings.smartSwitchingEnabled ? "checkmark-outline" : "close-sharp");
4444    \u0275\u0275advance();
4445    \u0275\u0275textInterpolate1(" ", techData_r14.settings.smartSwitchingEnabled ? "Enabled" : "Disabled", " ");
4446  }
4447}
4448function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_12_Template(rf, ctx) {
4449  if (rf & 1) {
4450    const _r23 = \u0275\u0275getCurrentView();
4451    \u0275\u0275elementStart(0, "div", 73)(1, "div", 74);
4452    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_12_Template_div_click_1_listener() {
4453      \u0275\u0275restoreView(_r23);
4454      const report_r10 = \u0275\u0275nextContext(3).$implicit;
4455      const ctx_r1 = \u0275\u0275nextContext(2);
4456      return \u0275\u0275resetView(ctx_r1.toggleTechSection(report_r10.id, "settings"));
4457    });
4458    \u0275\u0275element(2, "ion-icon", 90);
4459    \u0275\u0275elementStart(3, "span");
4460    \u0275\u0275text(4);
4461    \u0275\u0275pipe(5, "translate");
4462    \u0275\u0275elementEnd();
4463    \u0275\u0275element(6, "ion-icon", 38);
4464    \u0275\u0275elementEnd();
4465    \u0275\u0275template(7, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_12_Conditional_7_Template, 36, 30, "div", 76);
4466    \u0275\u0275elementEnd();
4467  }
4468  if (rf & 2) {
4469    const report_r10 = \u0275\u0275nextContext(3).$implicit;
4470    const ctx_r1 = \u0275\u0275nextContext(2);
4471    \u0275\u0275advance(4);
4472    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 3, "bugReportAdmin.tech.settings"));
4473    \u0275\u0275advance(2);
4474    \u0275\u0275property("name", ctx_r1.isTechSectionExpanded(report_r10.id, "settings") ? "chevron-up-outline" : "chevron-down-outline");
4475    \u0275\u0275advance();
4476    \u0275\u0275conditional(ctx_r1.isTechSectionExpanded(report_r10.id, "settings") ? 7 : -1);
4477  }
4478}
4479function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_13_Conditional_7_Conditional_2_Template(rf, ctx) {
4480  if (rf & 1) {
4481    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
4482    \u0275\u0275text(2);
4483    \u0275\u0275pipe(3, "translate");
4484    \u0275\u0275elementEnd();
4485    \u0275\u0275elementStart(4, "span", 59);
4486    \u0275\u0275text(5);
4487    \u0275\u0275elementEnd()();
4488  }
4489  if (rf & 2) {
4490    const techData_r14 = \u0275\u0275nextContext(3);
4491    \u0275\u0275advance(2);
4492    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.route"));
4493    \u0275\u0275advance(3);
4494    \u0275\u0275textInterpolate(techData_r14.route);
4495  }
4496}
4497function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_13_Conditional_7_Conditional_3_Template(rf, ctx) {
4498  if (rf & 1) {
4499    \u0275\u0275elementStart(0, "div", 56)(1, "span", 57);
4500    \u0275\u0275text(2);
4501    \u0275\u0275pipe(3, "translate");
4502    \u0275\u0275elementEnd();
4503    \u0275\u0275elementStart(4, "span", 58);
4504    \u0275\u0275text(5);
4505    \u0275\u0275elementEnd()();
4506  }
4507  if (rf & 2) {
4508    const techData_r14 = \u0275\u0275nextContext(3);
4509    const ctx_r1 = \u0275\u0275nextContext(4);
4510    \u0275\u0275advance(2);
4511    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(3, 2, "bugReportAdmin.tech.timestamp"));
4512    \u0275\u0275advance(3);
4513    \u0275\u0275textInterpolate(ctx_r1.formatTimestamp(techData_r14.timestamp));
4514  }
4515}
4516function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_13_Conditional_7_Template(rf, ctx) {
4517  if (rf & 1) {
4518    \u0275\u0275elementStart(0, "div", 76)(1, "div", 55);
4519    \u0275\u0275template(2, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_13_Conditional_7_Conditional_2_Template, 6, 4, "div", 56)(3, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_13_Conditional_7_Conditional_3_Template, 6, 4, "div", 56);
4520    \u0275\u0275elementEnd()();
4521  }
4522  if (rf & 2) {
4523    const techData_r14 = \u0275\u0275nextContext(2);
4524    \u0275\u0275advance(2);
4525    \u0275\u0275conditional(techData_r14.route ? 2 : -1);
4526    \u0275\u0275advance();
4527    \u0275\u0275conditional(techData_r14.timestamp ? 3 : -1);
4528  }
4529}
4530function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_13_Template(rf, ctx) {
4531  if (rf & 1) {
4532    const _r24 = \u0275\u0275getCurrentView();
4533    \u0275\u0275elementStart(0, "div", 73)(1, "div", 74);
4534    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_13_Template_div_click_1_listener() {
4535      \u0275\u0275restoreView(_r24);
4536      const report_r10 = \u0275\u0275nextContext(3).$implicit;
4537      const ctx_r1 = \u0275\u0275nextContext(2);
4538      return \u0275\u0275resetView(ctx_r1.toggleTechSection(report_r10.id, "meta"));
4539    });
4540    \u0275\u0275element(2, "ion-icon", 91);
4541    \u0275\u0275elementStart(3, "span");
4542    \u0275\u0275text(4);
4543    \u0275\u0275pipe(5, "translate");
4544    \u0275\u0275elementEnd();
4545    \u0275\u0275element(6, "ion-icon", 38);
4546    \u0275\u0275elementEnd();
4547    \u0275\u0275template(7, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_13_Conditional_7_Template, 4, 2, "div", 76);
4548    \u0275\u0275elementEnd();
4549  }
4550  if (rf & 2) {
4551    const report_r10 = \u0275\u0275nextContext(3).$implicit;
4552    const ctx_r1 = \u0275\u0275nextContext(2);
4553    \u0275\u0275advance(4);
4554    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(5, 3, "bugReportAdmin.tech.meta"));
4555    \u0275\u0275advance(2);
4556    \u0275\u0275property("name", ctx_r1.isTechSectionExpanded(report_r10.id, "meta") ? "chevron-up-outline" : "chevron-down-outline");
4557    \u0275\u0275advance();
4558    \u0275\u0275conditional(ctx_r1.isTechSectionExpanded(report_r10.id, "meta") ? 7 : -1);
4559  }
4560}
4561function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Template(rf, ctx) {
4562  if (rf & 1) {
4563    \u0275\u0275elementStart(0, "div", 54)(1, "h4");
4564    \u0275\u0275element(2, "ion-icon", 72);
4565    \u0275\u0275text(3);
4566    \u0275\u0275pipe(4, "translate");
4567    \u0275\u0275elementEnd();
4568    \u0275\u0275template(5, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_5_Template, 8, 5, "div", 73)(6, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_6_Template, 8, 5, "div", 73)(7, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_7_Template, 8, 5, "div", 73)(8, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_8_Template, 8, 5, "div", 73)(9, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_9_Template, 8, 6, "div", 73)(10, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_10_Template, 8, 5, "div", 73)(11, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_11_Template, 7, 2, "div", 73)(12, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_12_Template, 8, 5, "div", 73)(13, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Conditional_13_Template, 8, 5, "div", 73);
4569    \u0275\u0275elementEnd();
4570  }
4571  if (rf & 2) {
4572    let tmp_22_0;
4573    const techData_r14 = ctx;
4574    \u0275\u0275advance(3);
4575    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(4, 10, "bugReportAdmin.technicalData"), " ");
4576    \u0275\u0275advance(2);
4577    \u0275\u0275conditional(techData_r14.navigation ? 5 : -1);
4578    \u0275\u0275advance();
4579    \u0275\u0275conditional(techData_r14.position || techData_r14.confidence ? 6 : -1);
4580    \u0275\u0275advance();
4581    \u0275\u0275conditional(techData_r14.position.kalmanState ? 7 : -1);
4582    \u0275\u0275advance();
4583    \u0275\u0275conditional(techData_r14.position.stablePair.primaryBeaconId ? 8 : -1);
4584    \u0275\u0275advance();
4585    \u0275\u0275conditional(techData_r14.beacons ? 9 : -1);
4586    \u0275\u0275advance();
4587    \u0275\u0275conditional(techData_r14.gps ? 10 : -1);
4588    \u0275\u0275advance();
4589    \u0275\u0275conditional((tmp_22_0 = techData_r14.rendering) ? 11 : -1, tmp_22_0);
4590    \u0275\u0275advance();
4591    \u0275\u0275conditional(techData_r14.settings ? 12 : -1);
4592    \u0275\u0275advance();
4593    \u0275\u0275conditional(techData_r14.route || techData_r14.timestamp ? 13 : -1);
4594  }
4595}
4596function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_34_Template(rf, ctx) {
4597  if (rf & 1) {
4598    \u0275\u0275elementStart(0, "div", 54)(1, "h4");
4599    \u0275\u0275element(2, "ion-icon", 92);
4600    \u0275\u0275text(3);
4601    \u0275\u0275pipe(4, "translate");
4602    \u0275\u0275elementEnd();
4603    \u0275\u0275elementStart(5, "p", 93);
4604    \u0275\u0275text(6);
4605    \u0275\u0275elementEnd()();
4606  }
4607  if (rf & 2) {
4608    const report_r10 = \u0275\u0275nextContext(2).$implicit;
4609    \u0275\u0275advance(3);
4610    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(4, 2, "bugReportAdmin.adminNotes"), " ");
4611    \u0275\u0275advance(3);
4612    \u0275\u0275textInterpolate(report_r10.adminNotes);
4613  }
4614}
4615function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_36_Template(rf, ctx) {
4616  if (rf & 1) {
4617    const _r25 = \u0275\u0275getCurrentView();
4618    \u0275\u0275elementStart(0, "ion-button", 62);
4619    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_36_Template_ion_button_click_0_listener() {
4620      \u0275\u0275restoreView(_r25);
4621      const report_r10 = \u0275\u0275nextContext(2).$implicit;
4622      const ctx_r1 = \u0275\u0275nextContext(2);
4623      return \u0275\u0275resetView(ctx_r1.downloadScreenshot(report_r10));
4624    });
4625    \u0275\u0275element(1, "ion-icon", 71);
4626    \u0275\u0275text(2);
4627    \u0275\u0275pipe(3, "translate");
4628    \u0275\u0275elementEnd();
4629  }
4630  if (rf & 2) {
4631    \u0275\u0275advance(2);
4632    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(3, 1, "bugReportAdmin.downloadImage"), " ");
4633  }
4634}
4635function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_37_Template(rf, ctx) {
4636  if (rf & 1) {
4637    const _r26 = \u0275\u0275getCurrentView();
4638    \u0275\u0275elementStart(0, "ion-button", 62);
4639    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_37_Template_ion_button_click_0_listener() {
4640      \u0275\u0275restoreView(_r26);
4641      const report_r10 = \u0275\u0275nextContext(2).$implicit;
4642      const ctx_r1 = \u0275\u0275nextContext(2);
4643      return \u0275\u0275resetView(ctx_r1.downloadRecording(report_r10));
4644    });
4645    \u0275\u0275element(1, "ion-icon", 71);
4646    \u0275\u0275text(2);
4647    \u0275\u0275pipe(3, "translate");
4648    \u0275\u0275elementEnd();
4649  }
4650  if (rf & 2) {
4651    \u0275\u0275advance(2);
4652    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(3, 1, "bugReportAdmin.downloadRecording"), " ");
4653  }
4654}
4655function BugReportsPage_Conditional_24_For_2_Conditional_23_Template(rf, ctx) {
4656  if (rf & 1) {
4657    const _r11 = \u0275\u0275getCurrentView();
4658    \u0275\u0275elementStart(0, "ion-card-content", 50);
4659    \u0275\u0275template(1, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_1_Template, 6, 4, "div", 52)(2, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_2_Template, 9, 6, "div", 53);
4660    \u0275\u0275elementStart(3, "div", 54)(4, "h4");
4661    \u0275\u0275element(5, "ion-icon", 47);
4662    \u0275\u0275text(6);
4663    \u0275\u0275pipe(7, "translate");
4664    \u0275\u0275elementEnd();
4665    \u0275\u0275elementStart(8, "div", 55)(9, "div", 56)(10, "span", 57);
4666    \u0275\u0275text(11);
4667    \u0275\u0275pipe(12, "translate");
4668    \u0275\u0275elementEnd();
4669    \u0275\u0275elementStart(13, "span", 58);
4670    \u0275\u0275text(14);
4671    \u0275\u0275elementEnd()();
4672    \u0275\u0275elementStart(15, "div", 56)(16, "span", 57);
4673    \u0275\u0275text(17);
4674    \u0275\u0275pipe(18, "translate");
4675    \u0275\u0275elementEnd();
4676    \u0275\u0275elementStart(19, "span", 58);
4677    \u0275\u0275text(20);
4678    \u0275\u0275elementEnd()();
4679    \u0275\u0275elementStart(21, "div", 56)(22, "span", 57);
4680    \u0275\u0275text(23);
4681    \u0275\u0275pipe(24, "translate");
4682    \u0275\u0275elementEnd();
4683    \u0275\u0275elementStart(25, "span", 58);
4684    \u0275\u0275text(26);
4685    \u0275\u0275elementEnd()();
4686    \u0275\u0275elementStart(27, "div", 56)(28, "span", 57);
4687    \u0275\u0275text(29);
4688    \u0275\u0275pipe(30, "translate");
4689    \u0275\u0275elementEnd();
4690    \u0275\u0275elementStart(31, "span", 59);
4691    \u0275\u0275text(32);
4692    \u0275\u0275elementEnd()()()();
4693    \u0275\u0275template(33, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_33_Template, 14, 12, "div", 54)(34, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_34_Template, 7, 4, "div", 54);
4694    \u0275\u0275elementStart(35, "div", 60);
4695    \u0275\u0275template(36, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_36_Template, 4, 3, "ion-button", 61)(37, BugReportsPage_Conditional_24_For_2_Conditional_23_Conditional_37_Template, 4, 3, "ion-button", 61);
4696    \u0275\u0275elementStart(38, "ion-button", 62);
4697    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Template_ion_button_click_38_listener() {
4698      \u0275\u0275restoreView(_r11);
4699      const report_r10 = \u0275\u0275nextContext().$implicit;
4700      const ctx_r1 = \u0275\u0275nextContext(2);
4701      return \u0275\u0275resetView(ctx_r1.downloadReportJson(report_r10));
4702    });
4703    \u0275\u0275element(39, "ion-icon", 63);
4704    \u0275\u0275text(40);
4705    \u0275\u0275pipe(41, "translate");
4706    \u0275\u0275elementEnd();
4707    \u0275\u0275elementStart(42, "ion-button", 62);
4708    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Template_ion_button_click_42_listener() {
4709      \u0275\u0275restoreView(_r11);
4710      const report_r10 = \u0275\u0275nextContext().$implicit;
4711      const ctx_r1 = \u0275\u0275nextContext(2);
4712      return \u0275\u0275resetView(ctx_r1.downloadZip(report_r10));
4713    });
4714    \u0275\u0275element(43, "ion-icon", 64);
4715    \u0275\u0275text(44);
4716    \u0275\u0275pipe(45, "translate");
4717    \u0275\u0275elementEnd();
4718    \u0275\u0275elementStart(46, "ion-button", 62);
4719    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Template_ion_button_click_46_listener() {
4720      \u0275\u0275restoreView(_r11);
4721      const report_r10 = \u0275\u0275nextContext().$implicit;
4722      const ctx_r1 = \u0275\u0275nextContext(2);
4723      return \u0275\u0275resetView(ctx_r1.updateStatus(report_r10));
4724    });
4725    \u0275\u0275element(47, "ion-icon", 65);
4726    \u0275\u0275text(48);
4727    \u0275\u0275pipe(49, "translate");
4728    \u0275\u0275elementEnd();
4729    \u0275\u0275elementStart(50, "ion-button", 66);
4730    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Conditional_23_Template_ion_button_click_50_listener() {
4731      \u0275\u0275restoreView(_r11);
4732      const report_r10 = \u0275\u0275nextContext().$implicit;
4733      const ctx_r1 = \u0275\u0275nextContext(2);
4734      return \u0275\u0275resetView(ctx_r1.confirmDelete(report_r10));
4735    });
4736    \u0275\u0275element(51, "ion-icon", 67);
4737    \u0275\u0275text(52);
4738    \u0275\u0275pipe(53, "translate");
4739    \u0275\u0275elementEnd()()();
4740  }
4741  if (rf & 2) {
4742    let tmp_13_0;
4743    let tmp_24_0;
4744    const report_r10 = \u0275\u0275nextContext().$implicit;
4745    const ctx_r1 = \u0275\u0275nextContext(2);
4746    \u0275\u0275advance();
4747    \u0275\u0275conditional((tmp_13_0 = ctx_r1.getScreenshotUrl(report_r10)) ? 1 : -1, tmp_13_0);
4748    \u0275\u0275advance();
4749    \u0275\u0275conditional(ctx_r1.getRecordingUrl(report_r10) ? 2 : -1);
4750    \u0275\u0275advance(4);
4751    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(7, 19, "bugReportAdmin.deviceInfo"), " ");
4752    \u0275\u0275advance(5);
4753    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(12, 21, "bugReportAdmin.device"));
4754    \u0275\u0275advance(3);
4755    \u0275\u0275textInterpolate(report_r10.deviceModel || "-");
4756    \u0275\u0275advance(3);
4757    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(18, 23, "bugReportAdmin.os"));
4758    \u0275\u0275advance(3);
4759    \u0275\u0275textInterpolate(report_r10.osVersion || "-");
4760    \u0275\u0275advance(3);
4761    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(24, 25, "bugReportAdmin.appVersion"));
4762    \u0275\u0275advance(3);
4763    \u0275\u0275textInterpolate(report_r10.appVersion);
4764    \u0275\u0275advance(3);
4765    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(30, 27, "bugReportAdmin.deviceId"));
4766    \u0275\u0275advance(3);
4767    \u0275\u0275textInterpolate(report_r10.deviceIdentifier);
4768    \u0275\u0275advance();
4769    \u0275\u0275conditional((tmp_24_0 = ctx_r1.parseTechnicalData(report_r10.technicalDataJson)) ? 33 : -1, tmp_24_0);
4770    \u0275\u0275advance();
4771    \u0275\u0275conditional(report_r10.adminNotes ? 34 : -1);
4772    \u0275\u0275advance(2);
4773    \u0275\u0275conditional(ctx_r1.getScreenshotUrl(report_r10) ? 36 : -1);
4774    \u0275\u0275advance();
4775    \u0275\u0275conditional(ctx_r1.getRecordingUrl(report_r10) ? 37 : -1);
4776    \u0275\u0275advance(3);
4777    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(41, 29, "bugReportAdmin.downloadJson"), " ");
4778    \u0275\u0275advance(4);
4779    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(45, 31, "bugReportAdmin.downloadZip"), " ");
4780    \u0275\u0275advance(4);
4781    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(49, 33, "bugReportAdmin.changeStatus"), " ");
4782    \u0275\u0275advance(4);
4783    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(53, 35, "common.delete"), " ");
4784  }
4785}
4786function BugReportsPage_Conditional_24_For_2_Template(rf, ctx) {
4787  if (rf & 1) {
4788    const _r9 = \u0275\u0275getCurrentView();
4789    \u0275\u0275elementStart(0, "ion-card", 34)(1, "ion-card-header", 35);
4790    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_For_2_Template_ion_card_header_click_1_listener() {
4791      const report_r10 = \u0275\u0275restoreView(_r9).$implicit;
4792      const ctx_r1 = \u0275\u0275nextContext(2);
4793      return \u0275\u0275resetView(ctx_r1.toggleExpand(report_r10.id));
4794    });
4795    \u0275\u0275elementStart(2, "div", 36)(3, "div", 37);
4796    \u0275\u0275element(4, "ion-icon", 38);
4797    \u0275\u0275elementEnd();
4798    \u0275\u0275elementStart(5, "div", 39)(6, "div", 40)(7, "ion-badge", 41);
4799    \u0275\u0275text(8);
4800    \u0275\u0275elementEnd();
4801    \u0275\u0275elementStart(9, "ion-badge", 42);
4802    \u0275\u0275text(10);
4803    \u0275\u0275elementEnd();
4804    \u0275\u0275elementStart(11, "span", 43);
4805    \u0275\u0275text(12);
4806    \u0275\u0275elementEnd()();
4807    \u0275\u0275elementStart(13, "p", 44);
4808    \u0275\u0275text(14);
4809    \u0275\u0275elementEnd();
4810    \u0275\u0275elementStart(15, "div", 45)(16, "span", 46);
4811    \u0275\u0275element(17, "ion-icon", 47);
4812    \u0275\u0275text(18);
4813    \u0275\u0275elementEnd();
4814    \u0275\u0275template(19, BugReportsPage_Conditional_24_For_2_Conditional_19_Template, 3, 1, "span", 46);
4815    \u0275\u0275elementStart(20, "span", 48);
4816    \u0275\u0275text(21);
4817    \u0275\u0275elementEnd()()();
4818    \u0275\u0275element(22, "ion-icon", 49);
4819    \u0275\u0275elementEnd()();
4820    \u0275\u0275template(23, BugReportsPage_Conditional_24_For_2_Conditional_23_Template, 54, 37, "ion-card-content", 50);
4821    \u0275\u0275elementEnd();
4822  }
4823  if (rf & 2) {
4824    const report_r10 = ctx.$implicit;
4825    const ctx_r1 = \u0275\u0275nextContext(2);
4826    \u0275\u0275classProp("expanded", ctx_r1.isExpanded(report_r10.id));
4827    \u0275\u0275advance(3);
4828    \u0275\u0275property("ngClass", ctx_r1.getStatusClass(report_r10.status));
4829    \u0275\u0275advance();
4830    \u0275\u0275property("name", ctx_r1.getStatusIcon(report_r10.status));
4831    \u0275\u0275advance(3);
4832    \u0275\u0275property("color", ctx_r1.getStatusColor(report_r10.status));
4833    \u0275\u0275advance();
4834    \u0275\u0275textInterpolate1(" ", ctx_r1.getStatusLabel(report_r10.status), " ");
4835    \u0275\u0275advance(2);
4836    \u0275\u0275textInterpolate1(" ", ctx_r1.getCategoryLabel(report_r10.category), " ");
4837    \u0275\u0275advance(2);
4838    \u0275\u0275textInterpolate(ctx_r1.formatDate(report_r10.createdAt));
4839    \u0275\u0275advance(2);
4840    \u0275\u0275textInterpolate(report_r10.description);
4841    \u0275\u0275advance(4);
4842    \u0275\u0275textInterpolate1(" ", report_r10.deviceModel || "Unknown device", " ");
4843    \u0275\u0275advance();
4844    \u0275\u0275conditional(report_r10.campusName ? 19 : -1);
4845    \u0275\u0275advance(2);
4846    \u0275\u0275textInterpolate1(" v", report_r10.appVersion, " ");
4847    \u0275\u0275advance();
4848    \u0275\u0275property("name", ctx_r1.isExpanded(report_r10.id) ? "chevron-up-outline" : "chevron-down-outline");
4849    \u0275\u0275advance();
4850    \u0275\u0275conditional(ctx_r1.isExpanded(report_r10.id) ? 23 : -1);
4851  }
4852}
4853function BugReportsPage_Conditional_24_Conditional_3_Conditional_2_Template(rf, ctx) {
4854  if (rf & 1) {
4855    \u0275\u0275element(0, "ion-spinner", 95);
4856  }
4857}
4858function BugReportsPage_Conditional_24_Conditional_3_Conditional_3_Template(rf, ctx) {
4859  if (rf & 1) {
4860    \u0275\u0275element(0, "ion-icon", 96);
4861    \u0275\u0275text(1);
4862    \u0275\u0275pipe(2, "translate");
4863  }
4864  if (rf & 2) {
4865    \u0275\u0275advance();
4866    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind1(2, 1, "bugReportAdmin.loadMore"), " ");
4867  }
4868}
4869function BugReportsPage_Conditional_24_Conditional_3_Template(rf, ctx) {
4870  if (rf & 1) {
4871    const _r27 = \u0275\u0275getCurrentView();
4872    \u0275\u0275elementStart(0, "div", 33)(1, "ion-button", 94);
4873    \u0275\u0275listener("click", function BugReportsPage_Conditional_24_Conditional_3_Template_ion_button_click_1_listener() {
4874      \u0275\u0275restoreView(_r27);
4875      const ctx_r1 = \u0275\u0275nextContext(2);
4876      return \u0275\u0275resetView(ctx_r1.loadMore());
4877    });
4878    \u0275\u0275template(2, BugReportsPage_Conditional_24_Conditional_3_Conditional_2_Template, 1, 0, "ion-spinner", 95)(3, BugReportsPage_Conditional_24_Conditional_3_Conditional_3_Template, 3, 3);
4879    \u0275\u0275elementEnd()();
4880  }
4881  if (rf & 2) {
4882    const ctx_r1 = \u0275\u0275nextContext(2);
4883    \u0275\u0275advance();
4884    \u0275\u0275property("disabled", ctx_r1.isLoadingMore);
4885    \u0275\u0275advance();
4886    \u0275\u0275conditional(ctx_r1.isLoadingMore ? 2 : 3);
4887  }
4888}
4889function BugReportsPage_Conditional_24_Template(rf, ctx) {
4890  if (rf & 1) {
4891    \u0275\u0275elementStart(0, "ion-list", 31);
4892    \u0275\u0275repeaterCreate(1, BugReportsPage_Conditional_24_For_2_Template, 24, 14, "ion-card", 32, _forTrack1);
4893    \u0275\u0275elementEnd();
4894    \u0275\u0275template(3, BugReportsPage_Conditional_24_Conditional_3_Template, 4, 2, "div", 33);
4895  }
4896  if (rf & 2) {
4897    const ctx_r1 = \u0275\u0275nextContext();
4898    \u0275\u0275advance();
4899    \u0275\u0275repeater(ctx_r1.reports);
4900    \u0275\u0275advance(2);
4901    \u0275\u0275conditional(ctx_r1.hasMore ? 3 : -1);
4902  }
4903}
4904var _BugReportsPage = class _BugReportsPage {
4905  constructor(bugReportService, apiUrlService, alertController, loadingController, toastController, translate, userCampusService, activatedRoute) {
4906    this.bugReportService = bugReportService;
4907    this.apiUrlService = apiUrlService;
4908    this.alertController = alertController;
4909    this.loadingController = loadingController;
4910    this.toastController = toastController;
4911    this.translate = translate;
4912    this.userCampusService = userCampusService;
4913    this.activatedRoute = activatedRoute;
4914    this.breadcrumbItems = buildAdminBreadcrumbs("bug-reports");
4915    this.destroy$ = new Subject();
4916    this.reports = [];
4917    this.totalCount = 0;
4918    this.currentPage = 1;
4919    this.pageSize = 20;
4920    this.hasMore = false;
4921    this.isLoading = false;
4922    this.isLoadingMore = false;
4923    this.error = null;
4924    this.filterStatus = "";
4925    this.filterCategory = "";
4926    this.selectedCampusId = "";
4927    this.accessibleCampuses = [];
4928    this.showFilters = false;
4929    this.expandedReportIds = /* @__PURE__ */ new Set();
4930    this.expandedTechSections = /* @__PURE__ */ new Map();
4931    this.categories = BUG_REPORT_CATEGORIES;
4932    this.statuses = BUG_REPORT_STATUSES;
4933    addIcons({
4934      refreshOutline,
4935      filterOutline,
4936      searchOutline,
4937      imageOutline,
4938      chevronDownOutline,
4939      chevronUpOutline,
4940      pulseOutline,
4941      trashOutline,
4942      ellipsisVerticalOutline,
4943      bugOutline,
4944      alertCircleOutline,
4945      closeOutline,
4946      phonePortraitOutline,
4947      businessOutline,
4948      syncOutline,
4949      codeSlashOutline,
4950      documentTextOutline,
4951      addCircleOutline,
4952      eyeOutline,
4953      searchCircleOutline,
4954      checkmarkCircleOutline,
4955      closeCircleOutline,
4956      navigateOutline,
4957      locationOutline,
4958      analyticsOutline,
4959      bluetoothOutline,
4960      radioOutline,
4961      settingsOutline,
4962      timeOutline,
4963      checkmarkOutline,
4964      closeSharp,
4965      downloadOutline,
4966      documentOutline,
4967      archiveOutline
4968    });
4969    this.apiBaseUrl = this.apiUrlService.getSelectedUrl();
4970  }
4971  ngOnInit() {
4972    this.selectedCampusId = this.activatedRoute.snapshot.queryParamMap.get("campus") || "";
4973    this.userCampusService.getMyAccessibleCampuses().pipe(takeUntil(this.destroy$)).subscribe({
4974      next: (response) => {
4975        this.accessibleCampuses = response.campuses || [];
4976        if (this.selectedCampusId && !this.accessibleCampuses.some((campus) => campus.id === this.selectedCampusId)) {
4977          this.selectedCampusId = "";
4978        }
4979        this.loadReports();
4980      },
4981      error: () => this.loadReports()
4982    });
4983  }
4984  ngOnDestroy() {
4985    this.destroy$.next();
4986    this.destroy$.complete();
4987  }
4988  loadReports(showLoading = true) {
4989    return __async(this, null, function* () {
4990      if (showLoading) {
4991        this.isLoading = true;
4992      }
4993      this.error = null;
4994      this.currentPage = 1;
4995      this.bugReportService.getReportList({
4996        status: this.filterStatus || void 0,
4997        category: this.filterCategory || void 0,
4998        campusId: this.selectedCampusId || void 0,
4999        page: this.currentPage,
5000        pageSize: this.pageSize
5001      }).pipe(takeUntil(this.destroy$), finalize(() => {
5002        this.isLoading = false;
5003      })).subscribe({
5004        next: (response) => {
5005          this.reports = response.reports;
5006          this.totalCount = response.totalCount;
5007          this.hasMore = response.hasMore;
5008        },
5009        error: (err) => {
5010          console.error("Failed to load bug reports:", err);
5011          this.error = err.message || "Failed to load bug reports";
5012        }
5013      });
5014    });
5015  }
5016  loadMore() {
5017    return __async(this, null, function* () {
5018      if (this.isLoadingMore || !this.hasMore)
5019        return;
5020      this.isLoadingMore = true;
5021      this.currentPage++;
5022      this.bugReportService.getReportList({
5023        status: this.filterStatus || void 0,
5024        category: this.filterCategory || void 0,
5025        campusId: this.selectedCampusId || void 0,
5026        page: this.currentPage,
5027        pageSize: this.pageSize
5028      }).pipe(takeUntil(this.destroy$), finalize(() => {
5029        this.isLoadingMore = false;
5030      })).subscribe({
5031        next: (response) => {
5032          this.reports = [...this.reports, ...response.reports];
5033          this.hasMore = response.hasMore;
5034        },
5035        error: (err) => {
5036          console.error("Failed to load more bug reports:", err);
5037          this.currentPage--;
5038        }
5039      });
5040    });
5041  }
5042  toggleFilters() {
5043    this.showFilters = !this.showFilters;
5044  }
5045  onFilterChange() {
5046    this.loadReports();
5047  }
5048  clearFilters() {
5049    this.filterStatus = "";
5050    this.filterCategory = "";
5051    this.selectedCampusId = "";
5052    this.loadReports();
5053  }
5054  toggleExpand(reportId) {
5055    if (this.expandedReportIds.has(reportId)) {
5056      this.expandedReportIds.delete(reportId);
5057    } else {
5058      this.expandedReportIds.add(reportId);
5059    }
5060  }
5061  isExpanded(reportId) {
5062    return this.expandedReportIds.has(reportId);
5063  }
5064  // Technical data section expansion
5065  toggleTechSection(reportId, section) {
5066    if (!this.expandedTechSections.has(reportId)) {
5067      this.expandedTechSections.set(reportId, /* @__PURE__ */ new Set());
5068    }
5069    const sections = this.expandedTechSections.get(reportId);
5070    if (sections.has(section)) {
5071      sections.delete(section);
5072    } else {
5073      sections.add(section);
5074    }
5075  }
5076  isTechSectionExpanded(reportId, section) {
5077    var _a, _b;
5078    return (_b = (_a = this.expandedTechSections.get(reportId)) == null ? void 0 : _a.has(section)) != null ? _b : false;
5079  }
5080  updateStatus(report) {
5081    return __async(this, null, function* () {
5082      const inputs = this.statuses.map((s) => ({
5083        name: "status",
5084        type: "radio",
5085        label: this.translate.instant(s.labelKey),
5086        value: s.value,
5087        checked: report.status === s.value
5088      }));
5089      const alert = yield this.alertController.create({
5090        header: this.translate.instant("bugReportAdmin.updateStatus"),
5091        inputs,
5092        buttons: [
5093          {
5094            text: this.translate.instant("common.cancel"),
5095            role: "cancel"
5096          },
5097          {
5098            text: this.translate.instant("common.update"),
5099            handler: (data) => {
5100              if (data && data !== report.status) {
5101                this.doUpdateStatus(report, data);
5102              }
5103            }
5104          }
5105        ]
5106      });
5107      yield alert.present();
5108    });
5109  }
5110  doUpdateStatus(report, newStatus) {
5111    return __async(this, null, function* () {
5112      const loading = yield this.loadingController.create({
5113        message: this.translate.instant("bugReportAdmin.updating")
5114      });
5115      yield loading.present();
5116      this.bugReportService.updateReportStatus(report.id, newStatus, report.adminNotes).pipe(takeUntil(this.destroy$), finalize(() => loading.dismiss())).subscribe({
5117        next: (updated) => {
5118          const idx = this.reports.findIndex((r) => r.id === report.id);
5119          if (idx !== -1) {
5120            this.reports[idx] = updated;
5121          }
5122          this.presentToast(this.translate.instant("bugReportAdmin.statusUpdated"), "success");
5123        },
5124        error: (err) => {
5125          console.error("Failed to update status:", err);
5126          this.presentToast(this.translate.instant("bugReportAdmin.updateFailed"), "danger");
5127        }
5128      });
5129    });
5130  }
5131  confirmDelete(report) {
5132    return __async(this, null, function* () {
5133      const alert = yield this.alertController.create({
5134        header: this.translate.instant("bugReportAdmin.confirmDelete"),
5135        message: this.translate.instant("bugReportAdmin.deleteMessage"),
5136        buttons: [
5137          {
5138            text: this.translate.instant("common.cancel"),
5139            role: "cancel"
5140          },
5141          {
5142            text: this.translate.instant("common.delete"),
5143            handler: () => this.doDelete(report)
5144          }
5145        ]
5146      });
5147      yield alert.present();
5148    });
5149  }
5150  doDelete(report) {
5151    return __async(this, null, function* () {
5152      const loading = yield this.loadingController.create({
5153        message: this.translate.instant("bugReportAdmin.deleting")
5154      });
5155      yield loading.present();
5156      this.bugReportService.deleteReport(report.id).pipe(takeUntil(this.destroy$), finalize(() => loading.dismiss())).subscribe({
5157        next: () => {
5158          this.reports = this.reports.filter((r) => r.id !== report.id);
5159          this.totalCount--;
5160          this.presentToast(this.translate.instant("bugReportAdmin.deleted"), "success");
5161        },
5162        error: (err) => {
5163          console.error("Failed to delete report:", err);
5164          this.presentToast(this.translate.instant("bugReportAdmin.deleteFailed"), "danger");
5165        }
5166      });
5167    });
5168  }
5169  presentToast(message, color) {
5170    return __async(this, null, function* () {
5171      const toast = yield this.toastController.create({
5172        message,
5173        duration: 2e3,
5174        color,
5175        position: "bottom"
5176      });
5177      yield toast.present();
5178    });
5179  }
5180  // Helpers
5181  getScreenshotUrl(report) {
5182    if (report.screenshotUrl) {
5183      return this.apiBaseUrl + report.screenshotUrl;
5184    }
5185    return null;
5186  }
5187  getRecordingUrl(report) {
5188    if (report.recordingUrl) {
5189      return this.apiBaseUrl + report.recordingUrl;
5190    }
5191    return null;
5192  }
5193  getStatusColor(status) {
5194    switch (status) {
5195      case "new":
5196        return "primary";
5197      case "acknowledged":
5198        return "warning";
5199      case "in_progress":
5200        return "tertiary";
5201      case "resolved":
5202        return "success";
5203      case "closed":
5204        return "medium";
5205      default:
5206        return "medium";
5207    }
5208  }
5209  getStatusClass(status) {
5210    switch (status) {
5211      case "new":
5212        return "status-new";
5213      case "acknowledged":
5214        return "status-acknowledged";
5215      case "in_progress":
5216        return "status-investigating";
5217      case "resolved":
5218        return "status-resolved";
5219      case "closed":
5220        return "status-closed";
5221      default:
5222        return "status-new";
5223    }
5224  }
5225  getStatusIcon(status) {
5226    switch (status) {
5227      case "new":
5228        return "add-circle-outline";
5229      case "acknowledged":
5230        return "eye-outline";
5231      case "in_progress":
5232        return "search-circle-outline";
5233      case "resolved":
5234        return "checkmark-circle-outline";
5235      case "closed":
5236        return "close-circle-outline";
5237      default:
5238        return "bug-outline";
5239    }
5240  }
5241  getCategoryLabel(category) {
5242    const cat = this.categories.find((c) => c.value === category);
5243    return cat ? this.translate.instant(cat.labelKey) : category;
5244  }
5245  getStatusLabel(status) {
5246    const s = this.statuses.find((st) => st.value === status);
5247    return s ? this.translate.instant(s.labelKey) : status;
5248  }
5249  formatDate(date) {
5250    const d = new Date(date);
5251    const now = /* @__PURE__ */ new Date();
5252    const diff = now.getTime() - d.getTime();
5253    if (diff < 24 * 60 * 60 * 1e3) {
5254      const hours = Math.floor(diff / (60 * 60 * 1e3));
5255      if (hours < 1) {
5256        const minutes = Math.floor(diff / (60 * 1e3));
5257        return `${minutes}m ago`;
5258      }
5259      return `${hours}h ago`;
5260    }
5261    if (diff < 7 * 24 * 60 * 60 * 1e3) {
5262      const days = Math.floor(diff / (24 * 60 * 60 * 1e3));
5263      return `${days}d ago`;
5264    }
5265    return RigaDateTimeService.formatInRiga(d, { year: "numeric", month: "short", day: "
5265numeric" });
5266  }
5267  parseTechnicalData(json) {
5268    if (!json)
5269      return null;
5270    try {
5271      return JSON.parse(json);
5272    } catch {
5273      return null;
5274    }
5275  }
5276  hasActiveFilters() {
5277    return !!this.filterStatus || !!this.filterCategory || !!this.selectedCampusId;
5278  }
5279  // Formatting helpers for technical data
5280  formatDistanceCm(cm) {
5281    if (cm === void 0 || cm === null)
5282      return "-";
5283    if (cm >= 100) {
5284      return `${(cm / 100).toFixed(1)}m`;
5285    }
5286    return `${Math.round(cm)}cm`;
5287  }
5288  formatTimeSince(ms) {
5289    if (ms === void 0 || ms === null)
5290      return "-";
5291    if (ms >= 1e3) {
5292      return `${(ms / 1e3).toFixed(1)}s`;
5293    }
5294    return `${Math.round(ms)}ms`;
5295  }
5296  formatCoord(val) {
5297    if (val === void 0 || val === null)
5298      return "-";
5299    return Math.round(val).toString();
5300  }
5301  formatConfidence(raw, adjusted) {
5302    if (raw === void 0 || raw === null)
5303      return "-";
5304    const rawStr = raw.toFixed(2);
5305    if (adjusted !== void 0 && adjusted !== null) {
5306      return `${rawStr} (${adjusted.toFixed(2)})`;
5307    }
5308    return rawStr;
5309  }
5310  formatGpsCoord(val) {
5311    if (val === void 0 || val === null)
5312      return "-";
5313    return val.toFixed(6);
5314  }
5315  formatTimestamp(ts) {
5316    if (!ts)
5317      return "-";
5318    try {
5319      const d = new Date(ts);
5320      return RigaDateTimeService.formatInRiga(d, {
5321        year: "numeric",
5322        month: "short",
5323        day: "numeric",
5324        hour: "2-digit",
5325        minute: "2-digit",
5326        second: "2-digit"
5327      });
5328    } catch {
5329      return ts;
5330    }
5331  }
5332  /**
5333   * Download screenshot image for a bug report
5334   */
5335  downloadScreenshot(report) {
5336    return __async(this, null, function* () {
5337      var _a;
5338      const screenshotUrl = this.getScreenshotUrl(report);
5339      if (!screenshotUrl)
5340        return;
5341      try {
5342        const response = yield fetch(screenshotUrl);
5343        if (!response.ok)
5344          throw new Error(`HTTP ${response.status}`);
5345        const blob = yield response.blob();
5346        const filename = `bugreport-${(_a = report.id) == null ? void 0 : _a.substring(0, 8)}-screenshot.jpg`;
5347        this.triggerDownload(blob, filename);
5348        this.presentToast(this.translate.instant("bugReportAdmin.downloadSuccess"), "success");
5349      } catch (error) {
5350        console.error("Failed to download screenshot:", error);
5351        this.presentToast(this.translate.instant("bugReportAdmin.downloadFailed"), "danger");
5352      }
5353    });
5354  }
5355  /**
5356   * Download signal recording JSON for a bug report
5357   */
5358  downloadRecording(report) {
5359    return __async(this, null, function* () {
5360      var _a;
5361      const recordingUrl = this.getRecordingUrl(report);
5362      if (!recordingUrl)
5363        return;
5364      try {
5365        const response = yield fetch(recordingUrl);
5366        if (!response.ok)
5367          throw new Error(`HTTP ${response.status}`);
5368        const blob = yield response.blob();
5369        const filename = `bugreport-${(_a = report.id) == null ? void 0 : _a.substring(0, 8)}-recording.json`;
5370        this.triggerDownload(blob, filename);
5371        this.presentToast(this.translate.instant("bugReportAdmin.downloadSuccess"), "success");
5372      } catch (error) {
5373        console.error("Failed to download signal recording:", error);
5374        this.presentToast(this.translate.instant("bugReportAdmin.downloadFailed"), "danger");
5375      }
5376    });
5377  }
5378  /**
5379   * Download full bug report as JSON
5380   */
5381  downloadReportJson(report) {
5382    var _a;
5383    try {
5384      const exportData = {
5385        id: report.id,
5386        description: report.description,
5387        category: report.category,
5388        status: report.status,
5389        createdAt: report.createdAt,
5390        updatedAt: report.updatedAt,
5391        deviceIdentifier: report.deviceIdentifier,
5392        deviceModel: report.deviceModel,
5393        osVersion: report.osVersion,
5394        appVersion: report.appVersion,
5395        campusId: report.campusId,
5396        campusName: report.campusName,
5397        adminNotes: report.adminNotes,
5398        technicalData: this.parseTechnicalData(report.technicalDataJson)
5399      };
5400      const json = JSON.stringify(exportData, null, 2);
5401      const blob = new Blob([json], { type: "application/json" });
5402      const date = new Date(report.createdAt).toISOString().split("T")[0];
5403      const filename = `bugreport-${(_a = report.id) == null ? void 0 : _a.substring(0, 8)}-${date}.json`;
5404      this.triggerDownload(blob, filename);
5405      this.presentToast(this.translate.instant("bugReportAdmin.downloadSuccess"), "success");
5406    } catch (error) {
5407      console.error("Failed to download report JSON:", error);
5408      this.presentToast(this.translate.instant("bugReportAdmin.downloadFailed"), "danger");
5409    }
5410  }
5411  /**
5412   * Download bug report as ZIP containing JSON and screenshot
5413   */
5414  downloadZip(report) {
5415    return __async(this, null, function* () {
5416      var _a, _b;
5417      try {
5418        const zip = new import_jszip.default();
5419        const idPrefix = (_b = (_a = report.id) == null ? void 0 : _a.substring(0, 8)) != null ? _b : "unknown";
5420        const date = new Date(report.createdAt).toISOString().split("T")[0];
5421        const exportData = {
5422          id: report.id,
5423          description: report.description,
5424          category: report.category,
5425          status: report.status,
5426          createdAt: report.createdAt,
5427          updatedAt: report.updatedAt,
5428          deviceIdentifier: report.deviceIdentifier,
5429          deviceModel: report.deviceModel,
5430          osVersion: report.osVersion,
5431          appVersion: report.appVersion,
5432          campusId: report.campusId,
5433          campusName: report.campusName,
5434          adminNotes: report.adminNotes,
5435          technicalData: this.parseTechnicalData(report.technicalDataJson)
5436        };
5437        zip.file("report.json", JSON.stringify(exportData, null, 2));
5438        const screenshotUrl = this.getScreenshotUrl(report);
5439        if (screenshotUrl) {
5440          const response = yield fetch(screenshotUrl);
5441          if (response.ok) {
5442            const blob = yield response.blob();
5443            zip.file("screenshot.jpg", blob);
5444          }
5445        }
5446        const recordingUrl = this.getRecordingUrl(report);
5447        if (recordingUrl) {
5448          try {
5449            const response = yield fetch(recordingUrl);
5450            if (response.ok) {
5451              const blob = yield response.blob();
5452              zip.file("signal-recording.json", blob);
5453            }
5454          } catch (recordingError) {
5455            console.warn("Failed to include signal recording in ZIP:", recordingError);
5456          }
5457        }
5458        const zipBlob = yield zip.generateAsync({ type: "blob" });
5459        this.triggerDownload(zipBlob, `bugreport-${idPrefix}-${date}.zip`);
5460        this.presentToast(this.translate.instant("bugReportAdmin.downloadSuccess"), "success");
5461      } catch (error) {
5462        console.error("Failed to create ZIP:", error);
5463        this.presentToast(this.translate.instant("bugReportAdmin.downloadFailed"), "danger");
5464      }
5465    });
5466  }
5467  /**
5468   * Trigger browser download for a blob
5469   */
5470  triggerDownload(blob, filename) {
5471    const url = URL.createObjectURL(blob);
5472    const a = document.createElement("a");
5473    a.href = url;
5474    a.download = filename;
5475    document.body.appendChild(a);
5476    a.click();
5477    document.body.removeChild(a);
5478    URL.revokeObjectURL(url);
5479  }
5480};
5481_BugReportsPage.\u0275fac = function BugReportsPage_Factory(__ngFactoryType__) {
5482  return new (__ngFactoryType__ || _BugReportsPage)(\u0275\u0275directiveInject(BugReportService), \u0275\u0275directiveInject(ApiUrlService), \u0275\u0275directiveInject(AlertController), \u0275\u0275directiveInject(LoadingController), \u0275\u0275directiveInject(ToastController), \u0275\u0275directiveInject(TranslateService), \u0275\u0275directiveInject(UserCampusService), \u0275\u0275directiveInject(ActivatedRoute));
5483};
5484_BugReportsPage.\u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({ type: _BugReportsPage, selectors: [["app-bug-reports"]], decls: 25, vars: 24, consts: [[3, "fullscreen"], [1, "admin-navigation", 3, "items"], [1, "admin-content"], [1, "stats-bar"], [1, "stats-icon-wrapper"], ["name", "bug-outline"], [1, "stats-info"], [1, "stats-label"], [1, "stats-value"], [1, "admin-page-actions"], ["fill", "clear", 3, "click", "color"], ["slot", "icon-only", "name", "filter-outline"], ["fill", "clear", 3, "click"], ["slot", "icon-only", "name", "refresh-outline"], [1, "filter-toolbar"], [1, "loading-container"], [1, "error-container"], [1, "empty-state"], [1, "filter-row"], ["interface", "popover", 1, "filter-select", 3, "ngModelChange", "ionChange", "ngModel", "placeholder"], ["value", ""], [3, "value"], ["fill", "clear", "size", "small", 1, "clear-filters-btn"], ["fill", "clear", "size", "small", 1, "clear-filters-btn", 3, "click"], ["slot", "start", "name", "close-outline"], [1, "error-icon-wrapper"], ["name", "alert-circle-outline"], [3, "click"], ["slot", "start", "name", "refresh-outline"], [1, "empty-state-card"], [1, "empty-icon-wrapper"], [1, "report-list"], [1, "report-card", 3, "expanded"], [1, "load-more"], [1, "report-card"], [1, "report-header", 3, "click"], [1, "report-header-inner"], [1, "report-icon-wrapper", 3, "ngClass"], [3, "name"], [1, "report-header-content"], [1, "report-status-row"], [1, "status-badge", 3, "color"], ["color", "light", 1, "category-badge"], [1, "report-time"], [1, "report-description"], [1, "report-meta"], [1, "meta-item"], ["name", "phone-portrait-outline"], [1, "meta-item", "version"], [1, "expand-icon", 3, "name"], [1, "report-details"], ["name", "business-outline"], [1, "detail-section", "screenshot-section"], [1, "detail-section", "recording-section"], [1, "detail-section"], [1, "detail-grid"], [1, "detail-item"], [1, "detail-label"], [1, "detail-value"], [1, "detail-value", "device-id"], [1, "actions-row"], ["fill", "outline", "size", "small"], ["fill", "outline", "size", "small", 3, "click"], ["slot", "start", "name", "document-outline"], ["slot", "start", "name", "archive-outline"], ["slot", "start", "name", "sync-outline"], ["fill", "outline", "size", "small", "color", "danger", 3, "click"], ["slot", "start", "name", "trash-outline"], ["name", "image-outline"], ["alt", "Bug report screenshot", 1, "screenshot-img", 3, "src"], ["name", "pulse-outline"], ["slot", "start", "name", "download-outline"], ["name", "code-slash-outline"], [1, "tech-section"], [1, "tech-section-header", 3, "click"], ["name", "navigate-outline"], [1, "tech-section-content"], [1, "bool-indicator"], ["name", "location-outline"], [1, "source-badge", 3, "ngClass"], ["name", "anal
5484ytics-outline"], ["name", "radio-outline"], [1, "device-id"], ["name", "bluetooth-outline"], [1, "beacon-table-wrapper"], [1, "beacon-table"], [1, "beacon-name"], [1, "monospace"], ["name", "hardware-chip-outline"], [1, "error-message"], ["name", "settings-outline"], ["name", "time-outline"], ["name", "document-text-outline"], [1, "admin-notes"], ["fill", "outline", 3, "click", "disabled"], ["name", "crescent"], ["slot", "start", "name", "chevron-down-outline"]], template: function BugReportsPage_Template(rf, ctx) {
5485  if (rf & 1) {
5486    \u0275\u0275elementStart(0, "ion-content", 0);
5487    \u0275\u0275element(1, "app-breadcrumb-navigation", 1);
5488    \u0275\u0275elementStart(2, "div", 2)(3, "div", 3)(4, "div", 4);
5489    \u0275\u0275element(5, "ion-icon", 5);
5490    \u0275\u0275elementEnd();
5491    \u0275\u0275elementStart(6, "div", 6)(7, "span", 7);
5492    \u0275\u0275text(8);
5493    \u0275\u0275pipe(9, "translate");
5494    \u0275\u0275elementEnd();
5495    \u0275\u0275elementStart(10, "span", 8);
5496    \u0275\u0275text(11);
5497    \u0275\u0275pipe(12, "translate");
5498    \u0275\u0275elementEnd()();
5499    \u0275\u0275elementStart(13, "div", 9)(14, "ion-button", 10);
5500    \u0275\u0275pipe(15, "translate");
5501    \u0275\u0275listener("click", function BugReportsPage_Template_ion_button_click_14_listener() {
5502      return ctx.toggleFilters();
5503    });
5504    \u0275\u0275element(16, "ion-icon", 11);
5505    \u0275\u0275elementEnd();
5506    \u0275\u0275elementStart(17, "ion-button", 12);
5507    \u0275\u0275pipe(18, "translate");
5508    \u0275\u0275listener("click", function BugReportsPage_Template_ion_button_click_17_listener() {
5509      return ctx.loadReports();
5510    });
5511    \u0275\u0275element(19, "ion-icon", 13);
5512    \u0275\u0275elementEnd()()();
5513    \u0275\u0275template(20, BugReportsPage_Conditional_20_Template, 24, 22, "div", 14)(21, BugReportsPage_Conditional_21_Template, 5, 3, "div", 15)(22, BugReportsPage_Conditional_22_Template, 11, 4, "div", 16)(23, BugReportsPage_Conditional_23_Template, 10, 4, "div", 17)(24, BugReportsPage_Conditional_24_Template, 4, 1);
5514    \u0275\u0275elementEnd()();
5515  }
5516  if (rf & 2) {
5517    \u0275\u0275property("fullscreen", true);
5518    \u0275\u0275advance();
5519    \u0275\u0275property("items", ctx.breadcrumbItems);
5520    \u0275\u0275advance(7);
5521    \u0275\u0275textInterpolate(\u0275\u0275pipeBind1(9, 12, "bugReportAdmin.title"));
5522    \u0275\u0275advance(3);
5523    \u0275\u0275textInterpolate1(" ", \u0275\u0275pipeBind2(12, 14, "bugReportAdmin.showingReports", \u0275\u0275pureFunction2(21, _c0, ctx.reports.length, ctx.totalCount)), " ");
5524    \u0275\u0275advance(3);
5525    \u0275\u0275property("color", ctx.hasActiveFilters() ? "primary" : "");
5526    \u0275\u0275attribute("aria-label", \u0275\u0275pipeBind1(15, 17, "bugReportAdmin.toggleFilters"));
5527    \u0275\u0275advance(3);
5528    \u0275\u0275attribute("aria-label", \u0275\u0275pipeBind1(18, 19, "bugReportAdmin.refresh"));
5529    \u0275\u0275advance(3);
5530    \u0275\u0275conditional(ctx.showFilters ? 20 : -1);
5531    \u0275\u0275advance();
5532    \u0275\u0275conditional(ctx.isLoading ? 21 : -1);
5533    \u0275\u0275advance();
5534    \u0275\u0275conditional(ctx.error && !ctx.isLoading ? 22 : -1);
5535    \u0275\u0275advance();
5536    \u0275\u0275conditional(!ctx.isLoading && !ctx.error && ctx.reports.length === 0 ? 23 : -1);
5537    \u0275\u0275advance();
5538    \u0275\u0275conditional(!ctx.isLoading && !ctx.error && ctx.reports.length > 0 ? 24 : -1);
5539  }
5540}, dependencies: [CommonModule, NgClass, UpperCasePipe, FormsModule, NgControlStatus, NgModel, IonicModule, IonBadge, IonButton, IonCard, IonCardContent, IonCardHeader, IonContent, IonIcon, IonList, IonSelect, IonSelectOption, IonSpinner, SelectValueAccessorDirective, TranslateModule, TranslatePipe, BreadcrumbNavigationComponent], styles: ["\n\n.admin-navigation[_ngcontent-%COMP%] {\n  position: sticky;\n  top: 0;\n  z-index: 20;\n  display: block;\n}\n.admin-page-actions[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 0.25rem;\n  margin-left: auto;\n  flex-shrink: 0;\n}\n.admin-container[_ngcontent-%COMP%] {\n  min-height: 100%;\n  background: var(--ion-background-color);\n  padding-top: constant(safe-area-inset-top);\n  padding-top: env(safe-area-inset-top);\n  padding-top: var(--safe-area-inset-top, 0px);\n}\n.admin-content[_ngcontent-%COMP%] {\n  padding: 1rem;\n  max-width: 900px;\n  margin: 0 auto;\n}\n.loading-container[_ngcontent-%COMP%] {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  min-height: 200px;\n  padding: 2rem;\n}\n.loading-container[_ngcontent-%COMP%]   ion-spinner[_ngcontent-%COMP%] {\n  margin-bottom: 1rem;\n  width: 48px;\n  height: 48px;\n  --color: var(--ion-color-primary);\n}\n.loading-container[_ngcontent-%COMP%]   p[_ngcontent-%COMP%] {\n  color: var(--ion-color-medium);\n  font-size: 0.95rem;\n  margin: 0;\n}\n.error-container[_ngcontent-%COMP%] {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 3rem 2rem;\n  text-align: center;\n}\n.error-container[_ngcontent-%COMP%]   .error-icon-wrapper[_ngcontent-%COMP%] {\n  width: 80px;\n  height: 80px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(239, 68, 68, 0.15) 0%,\n      rgba(239, 68, 68, 0.05) 100%);\n  border-radius: 50%;\n  margin-bottom: 1.5rem;\n}\n.error-container[_ngcontent-%COMP%]   .error-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 40px;\n  color: #ef4444;\n}\n.error-container[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%] {\n  font-size: 1.25rem;\n  font-weight: 600;\n  margin: 0 0 0.5rem;\n  color: var(--ion-text-color);\n}\n.error-container[_ngcontent-%COMP%]   p[_ngcontent-%COMP%] {\n  color: var(--ion-color-medium);\n  margin: 0 0 1.5rem;\n  font-size: 0.95rem;\n}\n.error-container[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%] {\n  --box-sha
5540dow: 0 4px 12px rgba(var(--ion-color-primary-rgb), 0.3);\n}\n.empty-state[_ngcontent-%COMP%] {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  min-height: calc(100vh - 350px);\n  padding: 2rem;\n}\n.empty-state-card[_ngcontent-%COMP%] {\n  text-align: center;\n  max-width: 400px;\n}\n.empty-state-card[_ngcontent-%COMP%]   .empty-icon-wrapper[_ngcontent-%COMP%] {\n  width: 100px;\n  height: 100px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--ion-color-medium-rgb), 0.1) 0%,\n      rgba(var(--ion-color-medium-rgb), 0.05) 100%);\n  border-radius: 24px;\n  margin: 0 auto 1.5rem;\n}\n.empty-state-card[_ngcontent-%COMP%]   .empty-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 48px;\n  color: var(--ion-color-medium);\n  opacity: 0.6;\n}\n.empty-state-card[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%] {\n  font-size: 1.5rem;\n  font-weight: 600;\n  color: var(--ion-text-color);\n  margin: 0 0 0.5rem;\n}\n.empty-state-card[_ngcontent-%COMP%]   p[_ngcontent-%COMP%] {\n  font-size: 1rem;\n  color: var(--ion-color-medium);\n  margin: 0 0 2rem;\n  line-height: 1.5;\n}\n.empty-state-card[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%] {\n  --box-shadow: 0 4px 12px rgba(var(--ion-color-primary-rgb), 0.3);\n  --padding-start: 20px;\n  --padding-end: 24px;\n  --padding-top: 12px;\n  --padding-bottom: 12px;\n  font-weight: 600;\n  font-size: 1rem;\n}\n.empty-state-card[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%]:hover {\n  transform: translateY(-2px);\n  --box-shadow: 0 6px 20px rgba(var(--ion-color-primary-rgb), 0.4);\n}\n.nav-card[_ngcontent-%COMP%] {\n  margin-bottom: 1rem;\n  border-radius: 16px;\n  overflow: hidden;\n  box-shadow: 0 4px 16px var(--shadow-color-light);\n  cursor: pointer;\n  transition: all 0.3s ease;\n}\n.nav-card[_ngcontent-%COMP%]:hover {\n  transform: translateY(-2px);\n  box-shadow: 0 8px 24px var(--shadow-color-light);\n}\n.nav-card[_ngcontent-%COMP%]:hover   .nav-icon-wrapper[_ngcontent-%COMP%] {\n  transform: scale(1.05);\n}\n.nav-card[_ngcontent-%COMP%]   ion-card-content[_ngcontent-%COMP%] {\n  padding: 0;\n}\n.nav-card-inner[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 1rem;\n  padding: 1.25rem;\n}\n.nav-icon-wrapper[_ngcontent-%COMP%] {\n  width: 56px;\n  height: 56px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background:\n    linear-gradient(\n      135deg,\n      var(--ion-color-primary),\n      var(--ion-color-primary-shade));\n  border-radius: 14px;\n  flex-shrink: 0;\n  transition: transform 0.3s ease;\n}\n.nav-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 28px;\n  color: white;\n}\n.nav-card-text[_ngcontent-%COMP%] {\n  flex: 1;\n}\n.nav-card-text[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%] {\n  margin: 0 0 4px;\n  font-size: 1.1rem;\n  font-weight: 600;\n  color: var(--ion-text-color);\n}\n.nav-card-text[_ngcontent-%COMP%]   p[_ngcontent-%COMP%] {\n  margin: 0;\n  font-size: 0.9rem;\n  color: var(--ion-color-medium);\n  line-height: 1.4;\n}\n.nav-arrow[_ngcontent-%COMP%] {\n  color: var(--ion-color-medium);\n  opacity: 0.5;\n  font-size: 1.5rem;\n  transition: transform 0.2s ease;\n}\n.nav-card[_ngcontent-%COMP%]:hover   .nav-arrow[_ngcontent-%COMP%] {\n  transform: translateX(4px);\n  opacity: 0.8;\n}\n.section-card[_ngcontent-%COMP%] {\n  margin-bottom: 1rem;\n  border-radius: 16px;\n  overflow: hidden;\n  box-shadow: 0 4px 16px var(--shadow-color-light);\n}\n.section-card[_ngcontent-%COMP%]   ion-card-header[_ngcontent-%COMP%] {\n  padding: 1.25rem;\n  background: var(--ion-item-background);\n}\n.section-card[_ngcontent-%COMP%]   ion-card-content[_ngcontent-%COMP%] {\n  padding: 1rem 1.25rem 1.25rem;\n}\n.section-header-row[_ngcontent-%COMP%] {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 1rem;\n  flex-wrap: wrap;\n}\n.section-header-info[_ngcontent-%COMP%] {\n  flex: 1;\n  min-width: 200px;\n}\n.section-header-info[_ngcontent-%COMP%]   ion-card-title[_ngcontent-%COMP%] {\n  font-size: 1.25rem;\n  font-weight: 700;\n  margin-bottom: 0.25rem;\n}\n.section-header-info[_ngcontent-%COMP%]   ion-card-subtitle[_ngcontent-%COMP%] {\n  font-size: 0.9rem;\n  color: var(--ion-color-medium);\n}\n.section-header-actions[_ngcontent-%COMP%] {\n  display: flex;\n  gap: 0.5rem;\n}\n.section-header-actions[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%] {\n  --box-sha
5540dow: 0 2px 8px rgba(var(--ion-color-primary-rgb), 0.25);\n  font-weight: 600;\n}\n.section-header-actions[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%]:hover {\n  --box-shadow: 0 4px 12px rgba(var(--ion-color-primary-rgb), 0.35);\n}\n.info-notice[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 14px 16px;\n  margin-bottom: 1rem;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--ion-color-primary-rgb), 0.12) 0%,\n      rgba(var(--ion-color-primary-rgb), 0.06) 100%);\n  border-radius: 12px;\n  border-left: 4px solid var(--ion-color-primary);\n}\n.info-notice[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  flex-shrink: 0;\n  font-size: 1.5rem;\n  color: var(--ion-color-primary);\n}\n.info-notice[_ngcontent-%COMP%]   span[_ngcontent-%COMP%] {\n  font-size: 0.9rem;\n  color: var(--ion-text-color);\n  line-height: 1.4;\n}\n.custom-searchbar[_ngcontent-%COMP%] {\n  --background: var(--ion-item-background);\n  --box-shadow: 0 2px 12px var(--shadow-color-light);\n  --border-radius: 12px;\n  --placeholder-opacity: 0.6;\n  margin-bottom: 1rem;\n  padding: 0;\n}\n.custom-searchbar.searchbar-has-value[_ngcontent-%COMP%] {\n  --clear-button-color: var(--ion-color-medium);\n}\n.list-section-header[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 0.75rem;\n  margin: 1.5rem 0 1rem;\n}\n.list-section-header[_ngcontent-%COMP%]:first-child {\n  margin-top: 0;\n}\n.list-section-header[_ngcontent-%COMP%]   .section-icon[_ngcontent-%COMP%] {\n  width: 28px;\n  height: 28px;\n  color: var(--ion-color-primary);\n}\n.list-section-header[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%] {\n  flex: 1;\n  margin: 0;\n  font-size: 1.1rem;\n  font-weight: 600;\n  color: var(--ion-text-color);\n}\n.list-section-header[_ngcontent-%COMP%]   .count-badge[_ngcontent-%COMP%] {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: 32px;\n  height: 28px;\n  padding: 0 12px;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--ion-color-primary-rgb), 0.15) 0%,\n      rgba(var(--ion-color-primary-rgb), 0.08) 100%);\n  color: var(--ion-color-primary);\n  font-size: 0.85rem;\n  font-weight: 600;\n  border-radius: 14px;\n}\n.entity-list[_ngcontent-%COMP%] {\n  background: transparent;\n  margin-bottom: 1rem;\n  padding: 0;\n}\n.entity-list[_ngcontent-%COMP%]   ion-item[_ngcontent-%COMP%] {\n  margin-bottom: 0.75rem;\n  border-radius: 14px;\n  overflow: hidden;\n  box-shadow: 0 2px 12px var(--shadow-color-light);\n}\n.entity-item[_ngcontent-%COMP%] {\n  --background: var(--ion-item-background);\n  --padding-start: 1rem;\n  --padding-end: 1rem;\n  --inner-padding-end: 0;\n  --min-height: 84px;\n  --transition: all 0.2s ease;\n  --border-color: transparent;\n  position: relative;\n}\n.entity-item[_ngcontent-%COMP%]::part(native) {\n  border-radius: 14px;\n}\n.entity-item[_ngcontent-%COMP%]:hover {\n  --background: var(--ion-color-step-50);\n}\n.entity-item[_ngcontent-%COMP%]:hover   .entity-icon-wrapper[_ngcontent-%COMP%] {\n  transform: scale(1.05);\n}\n.entity-item[_ngcontent-%COMP%]:hover   .entity-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  transform: scale(1.1);\n}\n.entity-item[_ngcontent-%COMP%]   ion-label[_ngcontent-%COMP%] {\n  margin: 0.75rem 0;\n}\n.entity-item[_ngcontent-%COMP%]   ion-label[_ngcontent-%COMP%]   h2[_ngcontent-%COMP%] {\n  font-size: 1.05rem;\n  font-weight: 600;\n  color: var(--ion-text-color);\n  margin-bottom: 0.25rem;\n}\n.entity-item[_ngcontent-%COMP%]   ion-label[_ngcontent-%COMP%]   p[_ngcontent-%COMP%] {\n  font-size: 0.9rem;\n  color: var(--ion-color-medium);\n  margin: 0.2rem 0;\n  line-height: 1.4;\n}\n.entity-icon-wrapper[_ngcontent-%COMP%] {\n  --icon-color: var(--ion-color-primary);\n  --icon-rgb: var(--ion-color-primary-rgb);\n  width: 56px;\n  height: 56px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--icon-rgb), 0.15) 0%,\n      rgba(var(--icon-rgb), 0.06) 100%);\n  border-radius: 14px;\n  margin-right: 1rem;\n  flex-shrink: 0;\n  transition: all 0.3s ease;\n}\n.entity-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 1.75rem;\n  color: var(--icon-color);\n  transition: transform 0.3s ease;\n}\n.entity-icon-wrapper.role-superadmin[_ngcontent-%COMP%] {\n  --icon-color: #6030ff;\n  --icon-rgb:\n    96,\n    48,\n    255;\n}\n.entity-icon-wrapper.role-admin[_ngcontent-%COMP%] {\n  --icon-color: #c5000f;\n  --icon-rgb:\n    197,\n    0,\n    15;\n}
5540\n.entity-icon-wrapper.role-moderator[_ngcontent-%COMP%] {\n  --icon-color: #f59e0b;\n  --icon-rgb:\n    245,\n    158,\n    11;\n}\n.entity-icon-wrapper.role-user[_ngcontent-%COMP%] {\n  --icon-color: var(--ion-color-primary);\n  --icon-rgb: var(--ion-color-primary-rgb);\n}\n.role-badge[_ngcontent-%COMP%] {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  padding: 4px 10px;\n  border-radius: 6px;\n  font-size: 0.75rem;\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: 0.02em;\n}\n.role-badge.role-superadmin[_ngcontent-%COMP%] {\n  background: rgba(96, 48, 255, 0.15);\n  color: #6030ff;\n}\n.role-badge.role-admin[_ngcontent-%COMP%] {\n  background: rgba(197, 0, 15, 0.15);\n  color: #c5000f;\n}\n.role-badge.role-moderator[_ngcontent-%COMP%] {\n  background: rgba(245, 158, 11, 0.15);\n  color: #f59e0b;\n}\n.role-badge.role-user[_ngcontent-%COMP%] {\n  background: rgba(var(--ion-color-primary-rgb), 0.15);\n  color: var(--ion-color-primary);\n}\n.meta-info[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  margin-top: 0.5rem;\n  font-size: 0.85rem;\n  color: var(--ion-color-medium);\n}\n.meta-info[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 1rem;\n  opacity: 0.7;\n}\n.action-buttons[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 0.25rem;\n}\n.action-buttons[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%] {\n  --padding-start: 10px;\n  --padding-end: 10px;\n  --padding-top: 10px;\n  --padding-bottom: 10px;\n  margin: 0;\n}\n.action-buttons[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 1.25rem;\n}\n.action-buttons[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%]:hover {\n  --background-hover: var(--ion-color-light);\n}\n.action-buttons[_ngcontent-%COMP%]   .desktop-actions[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 0.25rem;\n}\n.action-buttons[_ngcontent-%COMP%]   .mobile-menu-button[_ngcontent-%COMP%] {\n  display: none;\n}\n.edit-form-card[_ngcontent-%COMP%] {\n  border-radius: 16px;\n  overflow: hidden;\n  box-shadow: 0 4px 20px var(--shadow-color-light);\n}\n.edit-form-card[_ngcontent-%COMP%]   ion-card-header[_ngcontent-%COMP%] {\n  padding: 1.25rem;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--ion-color-primary-rgb), 0.08) 0%,\n      rgba(var(--ion-color-primary-rgb), 0.02) 100%);\n  border-bottom: 1px solid var(--ion-border-color);\n}\n.edit-form-card[_ngcontent-%COMP%]   ion-card-content[_ngcontent-%COMP%] {\n  padding: 1.5rem;\n}\n.edit-form-card[_ngcontent-%COMP%]   ion-item[_ngcontent-%COMP%] {\n  --background: transparent;\n  --border-color: var(--ion-border-color);\n  margin-bottom: 1rem;\n}\n.edit-form-card[_ngcontent-%COMP%]   ion-item[_ngcontent-%COMP%]:last-of-type {\n  margin-bottom: 0;\n}\n.form-actions[_ngcontent-%COMP%] {\n  display: flex;\n  justify-content: flex-end;\n  gap: 1rem;\n  padding-top: 1.5rem;\n  margin-top: 1.5rem;\n  border-top: 1px solid var(--ion-border-color);\n}\n.form-actions[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%] {\n  min-width: 120px;\n}\n@keyframes _ngcontent-%COMP%_slideIn {\n  from {\n    opacity: 0;\n    transform: translateX(-12px);\n  }\n  to {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n@keyframes _ngcontent-%COMP%_fadeIn {\n  from {\n    opacity: 0;\n    transform: translateY(8px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n.entity-item[_ngcontent-%COMP%] {\n  animation: _ngcontent-%COMP%_slideIn 0.35s ease-out;\n  animation-fill-mode: both;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(1) {\n  animation-delay: 0.04s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(2) {\n  animation-delay: 0.08s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(3) {\n  animation-delay: 0.12s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(4) {\n  animation-delay: 0.16s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(5) {\n  animation-delay: 0.2s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(6) {\n  animation-delay: 0.24s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(7) {\n  animation-delay: 0.28s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(8) {\n  animation-delay: 0.32s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(9) {\n  animation-delay: 0.36s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(10) {\n  animation-delay: 0.4s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(11) {\n  animation-delay: 0.44s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(12) {\n  animation-delay: 0.48s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(13) {\n  animation-delay: 0.52s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(14) {\n  animation-delay: 0.56s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(15) {\n  animation-delay: 0.6s;\n}
5540\n.entity-item[_ngcontent-%COMP%]:nth-child(16) {\n  animation-delay: 0.64s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(17) {\n  animation-delay: 0.68s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(18) {\n  animation-delay: 0.72s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(19) {\n  animation-delay: 0.76s;\n}\n.entity-item[_ngcontent-%COMP%]:nth-child(20) {\n  animation-delay: 0.8s;\n}\n.nav-card[_ngcontent-%COMP%], \n.section-card[_ngcontent-%COMP%] {\n  animation: _ngcontent-%COMP%_fadeIn 0.4s ease-out;\n}\n@media (max-width: 768px) {\n  .admin-content[_ngcontent-%COMP%] {\n    padding: 0.75rem;\n  }\n  .section-header-row[_ngcontent-%COMP%] {\n    flex-direction: column;\n    align-items: stretch;\n    gap: 0.75rem;\n  }\n  .section-header-actions[_ngcontent-%COMP%] {\n    justify-content: flex-end;\n  }\n  .entity-item[_ngcontent-%COMP%] {\n    --min-height: 76px;\n    --padding-start: 0.75rem;\n    --padding-end: 0.75rem;\n  }\n  .entity-icon-wrapper[_ngcontent-%COMP%] {\n    width: 46px;\n    height: 46px;\n    margin-right: 0.75rem;\n    border-radius: 12px;\n  }\n  .entity-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n    font-size: 1.5rem;\n  }\n  .action-buttons[_ngcontent-%COMP%] {\n    gap: 0;\n  }\n  .action-buttons[_ngcontent-%COMP%]   .desktop-actions[_ngcontent-%COMP%] {\n    display: none;\n  }\n  .action-buttons[_ngcontent-%COMP%]   .mobile-menu-button[_ngcontent-%COMP%] {\n    display: flex;\n  }\n  ion-label[_ngcontent-%COMP%]   h2[_ngcontent-%COMP%] {\n    font-size: 1rem;\n  }\n  ion-label[_ngcontent-%COMP%]   .meta-info[_ngcontent-%COMP%] {\n    font-size: 0.8rem;\n    gap: 4px;\n  }\n  ion-label[_ngcontent-%COMP%]   .meta-info[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n    font-size: 0.9rem;\n  }\n  .nav-card-inner[_ngcontent-%COMP%] {\n    padding: 1rem;\n  }\n  .nav-icon-wrapper[_ngcontent-%COMP%] {\n    width: 48px;\n    height: 48px;\n    border-radius: 12px;\n  }\n  .nav-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n    font-size: 24px;\n  }\n}\n@media (prefers-color-scheme: dark) {\n  .nav-card[_ngcontent-%COMP%], \n   .section-card[_ngcontent-%COMP%], \n   .entity-list[_ngcontent-%COMP%]   ion-item[_ngcontent-%COMP%] {\n    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);\n  }\n  .info-notice[_ngcontent-%COMP%] {\n    background:\n      linear-gradient(\n        135deg,\n        rgba(var(--ion-color-primary-rgb), 0.2) 0%,\n        rgba(var(--ion-color-primary-rgb), 0.1) 100%);\n  }\n}\n.filter-toolbar[_ngcontent-%COMP%] {\n  background: var(--ion-item-background, var(--ion-background-color, #ffffff));\n  padding: 0.75rem 1rem;\n  border: 1px solid var(--ion-border-color, var(--ion-color-step-200, #e2e8f0));\n  border-radius: 12px;\n  margin-bottom: 1rem;\n}\n.filter-row[_ngcontent-%COMP%] {\n  display: flex;\n  gap: 0.75rem;\n  align-items: center;\n  flex-wrap: wrap;\n}\n.filter-select[_ngcontent-%COMP%] {\n  flex: 1;\n  min-width: 140px;\n  max-width: 200px;\n  --padding-start: 12px;\n  --padding-end: 12px;\n  font-size: 14px;\n  background: var(--ion-background-color);\n  border-radius: 10px;\n  border: 1px solid var(--ion-border-color);\n}\n.filter-select[_ngcontent-%COMP%]:hover {\n  border-color: var(--ion-color-primary);\n}\n.clear-filters-btn[_ngcontent-%COMP%] {\n  --color: var(--ion-color-medium);\n  font-weight: 500;\n}\n.clear-filters-btn[_ngcontent-%COMP%]:hover {\n  --color: var(--ion-color-primary);\n}\n.stats-bar[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 1rem;\n  padding: 1rem 1.25rem;\n  background: var(--ion-item-background);\n  border-radius: 14px;\n  margin-bottom: 1rem;\n  box-shadow: 0 2px 12px var(--shadow-color-light);\n}\n.stats-icon-wrapper[_ngcontent-%COMP%] {\n  width: 48px;\n  height: 48px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--ion-color-primary-rgb), 0.15) 0%,\n      rgba(var(--ion-color-primary-rgb), 0.06) 100%);\n  border-radius: 12px;\n  flex-shrink: 0;\n}\n.stats-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 1.5rem;\n  color: var(--ion-color-primary);\n}\n.stats-info[_ngcontent-%COMP%] {\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n}\n.stats-label[_ngcontent-%COMP%] {\n  font-size: 0.8rem;\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n  color: var(--ion-color-medium);\n}\n.stats-value[_ngcontent-%COMP%] {\n  font-size: 0.95rem;\n  color: var(--ion-text-color);\n}\n.report-list[_ngcontent-%COMP%] {\n  background: transparent;\n  padding: 0;\n}\n.report-card[_ngcontent-%COMP%] {\n  margin: 0 0 0.75rem 0;\n  border-radius: 14px;\n  overflow: hidden;\n  box-shadow: 0 2px 12px var(--shadow-color-light);\n  transition: all 0.3s ease;\n  animation: _ngcontent-%COMP%_fadeSlideIn 0.35s ease-out;\n  animation-fill-mode: both;\n}\n.report-card[_ngcontent-%COMP%]:hover {\n  box-shadow: 0 4px 20px var(--shadow-color-light);\n}\n.report-card.expanded[_ngcontent-%COMP%] {\n  box-shadow: 0 6px 24px var(--shadow-color-light);\n}
5540\n.report-card[_ngcontent-%COMP%]:nth-child(1) {\n  animation-delay: 0.04s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(2) {\n  animation-delay: 0.08s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(3) {\n  animation-delay: 0.12s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(4) {\n  animation-delay: 0.16s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(5) {\n  animation-delay: 0.2s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(6) {\n  animation-delay: 0.24s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(7) {\n  animation-delay: 0.28s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(8) {\n  animation-delay: 0.32s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(9) {\n  animation-delay: 0.36s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(10) {\n  animation-delay: 0.4s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(11) {\n  animation-delay: 0.44s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(12) {\n  animation-delay: 0.48s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(13) {\n  animation-delay: 0.52s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(14) {\n  animation-delay: 0.56s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(15) {\n  animation-delay: 0.6s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(16) {\n  animation-delay: 0.64s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(17) {\n  animation-delay: 0.68s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(18) {\n  animation-delay: 0.72s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(19) {\n  animation-delay: 0.76s;\n}\n.report-card[_ngcontent-%COMP%]:nth-child(20) {\n  animation-delay: 0.8s;\n}\n@keyframes _ngcontent-%COMP%_fadeSlideIn {\n  from {\n    opacity: 0;\n    transform: translateY(8px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n.report-header[_ngcontent-%COMP%] {\n  cursor: pointer;\n  padding: 1rem 1.25rem;\n  transition: background 0.2s ease;\n}\n.report-header[_ngcontent-%COMP%]:hover {\n  background: var(--ion-color-step-50);\n}\n.report-header-inner[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: flex-start;\n  gap: 1rem;\n}\n.report-icon-wrapper[_ngcontent-%COMP%] {\n  width: 48px;\n  height: 48px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 12px;\n  flex-shrink: 0;\n  transition: transform 0.3s ease;\n}\n.report-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 1.5rem;\n  transition: transform 0.3s ease;\n}\n.report-header[_ngcontent-%COMP%]:hover   .report-icon-wrapper[_ngcontent-%COMP%] {\n  transform: scale(1.05);\n}\n.report-header[_ngcontent-%COMP%]:hover   .report-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  transform: scale(1.1);\n}\n.report-icon-wrapper.status-new[_ngcontent-%COMP%] {\n  background:\n    linear-gradient(\n      135deg,\n      rgba(59, 130, 246, 0.15) 0%,\n      rgba(59, 130, 246, 0.06) 100%);\n}\n.report-icon-wrapper.status-new[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  color: #3b82f6;\n}\n.report-icon-wrapper.status-acknowledged[_ngcontent-%COMP%] {\n  background:\n    linear-gradient(\n      135deg,\n      rgba(245, 158, 11, 0.15) 0%,\n      rgba(245, 158, 11, 0.06) 100%);\n}\n.report-icon-wrapper.status-acknowledged[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  color: #f59e0b;\n}\n.report-icon-wrapper.status-investigating[_ngcontent-%COMP%] {\n  background:\n    linear-gradient(\n      135deg,\n      rgba(139, 92, 246, 0.15) 0%,\n      rgba(139, 92, 246, 0.06) 100%);\n}\n.report-icon-wrapper.status-investigating[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  color: #8b5cf6;\n}\n.report-icon-wrapper.status-resolved[_ngcontent-%COMP%] {\n  background:\n    linear-gradient(\n      135deg,\n      rgba(16, 185, 129, 0.15) 0%,\n      rgba(16, 185, 129, 0.06) 100%);\n}\n.report-icon-wrapper.status-resolved[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  color: #10b981;\n}\n.report-icon-wrapper.status-closed[_ngcontent-%COMP%] {\n  background:\n    linear-gradient(\n      135deg,\n      rgba(107, 114, 128, 0.15) 0%,\n      rgba(107, 114, 128, 0.06) 100%);\n}\n.report-icon-wrapper.status-closed[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  color: #6b7280;\n}\n.report-header-content[_ngcontent-%COMP%] {\n  flex: 1;\n  min-width: 0;\n}\n.report-status-row[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  flex-wrap: wrap;\n  margin-bottom: 8px;\n}\n.status-badge[_ngcontent-%COMP%] {\n  font-size: 0.7rem;\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n  padding: 4px 10px;\n}\n.category-badge[_ngcontent-%COMP%] {\n  font-size: 0.7rem;\n  font-weight: 500;\n  padding: 4px 10px;\n}
5540\n.report-time[_ngcontent-%COMP%] {\n  font-size: 0.8rem;\n  color: var(--ion-color-medium);\n  margin-left: auto;\n}\n.report-description[_ngcontent-%COMP%] {\n  font-size: 0.95rem;\n  line-height: 1.5;\n  color: var(--ion-text-color);\n  margin: 0 0 10px 0;\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n}\n.report-meta[_ngcontent-%COMP%] {\n  display: flex;\n  gap: 16px;\n  flex-wrap: wrap;\n}\n.meta-item[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 5px;\n  font-size: 0.8rem;\n  color: var(--ion-color-medium);\n}\n.meta-item[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 1rem;\n  opacity: 0.7;\n}\n.meta-item.version[_ngcontent-%COMP%] {\n  padding: 2px 8px;\n  background: var(--ion-color-light);\n  border-radius: 4px;\n  font-family: monospace;\n  font-size: 0.75rem;\n}\n.expand-icon[_ngcontent-%COMP%] {\n  font-size: 1.25rem;\n  color: var(--ion-color-medium);\n  opacity: 0.6;\n  transition: transform 0.2s ease;\n  flex-shrink: 0;\n  margin-top: 4px;\n}\n.report-card.expanded[_ngcontent-%COMP%]   .expand-icon[_ngcontent-%COMP%] {\n  transform: rotate(180deg);\n}\n.report-details[_ngcontent-%COMP%] {\n  border-top: 1px solid var(--ion-border-color);\n  padding: 1.25rem;\n  background: var(--ion-color-step-50);\n  animation: _ngcontent-%COMP%_expandIn 0.3s ease-out;\n}\n@keyframes _ngcontent-%COMP%_expandIn {\n  from {\n    opacity: 0;\n    transform: translateY(-8px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n.detail-section[_ngcontent-%COMP%] {\n  margin-bottom: 1.5rem;\n}\n.detail-section[_ngcontent-%COMP%]:last-of-type {\n  margin-bottom: 0;\n}\n.detail-section[_ngcontent-%COMP%]   h4[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 0.8rem;\n  font-weight: 600;\n  color: var(--ion-color-medium);\n  margin: 0 0 12px 0;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n}\n.detail-section[_ngcontent-%COMP%]   h4[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 1.1rem;\n  opacity: 0.8;\n}\n.screenshot-section[_ngcontent-%COMP%]   .screenshot-img[_ngcontent-%COMP%] {\n  width: 100%;\n  max-width: 400px;\n  border-radius: 12px;\n  border: 1px solid var(--ion-border-color);\n  box-shadow: 0 2px 12px var(--shadow-color-light);\n}\n.detail-grid[_ngcontent-%COMP%] {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n  gap: 1rem;\n}\n.detail-item[_ngcontent-%COMP%] {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  padding: 12px;\n  background: var(--ion-item-background);\n  border-radius: 10px;\n  border: 1px solid var(--ion-border-color);\n}\n.detail-label[_ngcontent-%COMP%] {\n  font-size: 0.7rem;\n  font-weight: 600;\n  color: var(--ion-color-medium);\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n}\n.detail-value[_ngcontent-%COMP%] {\n  font-size: 0.9rem;\n  color: var(--ion-text-color);\n  word-break: break-word;\n}\n.detail-value.device-id[_ngcontent-%COMP%] {\n  font-family: monospace;\n  font-size: 0.8rem;\n}\n.admin-notes[_ngcontent-%COMP%] {\n  font-size: 0.9rem;\n  color: var(--ion-text-color);\n  background: var(--ion-item-background);\n  padding: 1rem;\n  border-radius: 10px;\n  border: 1px solid var(--ion-border-color);\n  margin: 0;\n  line-height: 1.5;\n}\n.actions-row[_ngcontent-%COMP%] {\n  display: flex;\n  gap: 0.75rem;\n  flex-wrap: wrap;\n  padding-top: 1rem;\n  margin-top: 1.5rem;\n  border-top: 1px solid var(--ion-border-color);\n}\n.actions-row[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%] {\n  --border-radius: 10px;\n  font-weight: 500;\n}\n.load-more[_ngcontent-%COMP%] {\n  display: flex;\n  justify-content: center;\n  padding: 1.5rem;\n}\n.load-more[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%] {\n  --border-radius: 12px;\n  --padding-start: 24px;\n  --padding-end: 24px;\n  font-weight: 500;\n}\n@media (max-width: 768px) {\n  .filter-row[_ngcontent-%COMP%] {\n    flex-direction: column;\n    align-items: stretch;\n    gap: 0.5rem;\n  }\n  .filter-select[_ngcontent-%COMP%] {\n    max-width: none;\n  }
5540\n  .stats-bar[_ngcontent-%COMP%] {\n    padding: 0.875rem 1rem;\n  }\n  .stats-icon-wrapper[_ngcontent-%COMP%] {\n    width: 40px;\n    height: 40px;\n  }\n  .stats-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n    font-size: 1.25rem;\n  }\n  .report-header[_ngcontent-%COMP%] {\n    padding: 0.875rem 1rem;\n  }\n  .report-icon-wrapper[_ngcontent-%COMP%] {\n    width: 42px;\n    height: 42px;\n  }\n  .report-icon-wrapper[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n    font-size: 1.25rem;\n  }\n  .report-time[_ngcontent-%COMP%] {\n    width: 100%;\n    margin-left: 0;\n    margin-top: 4px;\n    order: 1;\n  }\n  .report-meta[_ngcontent-%COMP%] {\n    gap: 10px;\n  }\n  .meta-item[_ngcontent-%COMP%] {\n    font-size: 0.75rem;\n  }\n  .detail-grid[_ngcontent-%COMP%] {\n    grid-template-columns: 1fr;\n  }\n  .report-details[_ngcontent-%COMP%] {\n    padding: 1rem;\n  }\n  .actions-row[_ngcontent-%COMP%] {\n    flex-direction: column;\n  }\n  .actions-row[_ngcontent-%COMP%]   ion-button[_ngcontent-%COMP%] {\n    width: 100%;\n  }\n}\n.tech-section[_ngcontent-%COMP%] {\n  margin-bottom: 0.75rem;\n  border: 1px solid var(--ion-border-color);\n  border-radius: 10px;\n  overflow: hidden;\n}\n.tech-section[_ngcontent-%COMP%]:last-child {\n  margin-bottom: 0;\n}\n.tech-section-header[_ngcontent-%COMP%] {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 12px;\n  background: var(--ion-item-background);\n  cursor: pointer;\n  font-weight: 600;\n  font-size: 0.8rem;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n  color: var(--ion-color-medium);\n  transition: background 0.2s ease;\n}\n.tech-section-header[_ngcontent-%COMP%]:hover {\n  background: var(--ion-color-step-50);\n}\n.tech-section-header[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%]:first-child {\n  font-size: 1.1rem;\n  opacity: 0.8;\n}\n.tech-section-header[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%]:last-child {\n  margin-left: auto;\n  font-size: 1rem;\n  opacity: 0.6;\n}\n.tech-section-content[_ngcontent-%COMP%] {\n  padding: 12px;\n  background: var(--ion-color-step-50);\n  animation: _ngcontent-%COMP%_expandIn 0.2s ease-out;\n}\n.beacon-table-wrapper[_ngcontent-%COMP%] {\n  overflow-x: auto;\n  margin-top: 12px;\n  border-radius: 8px;\n  border: 1px solid var(--ion-border-color);\n}\n.beacon-table[_ngcontent-%COMP%] {\n  width: 100%;\n  font-size: 0.8rem;\n  border-collapse: collapse;\n  min-width: 500px;\n}\n.beacon-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%], \n.beacon-table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%] {\n  padding: 8px 12px;\n  text-align: left;\n  white-space: nowrap;\n}\n.beacon-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%] {\n  background: var(--ion-color-step-100);\n  font-weight: 600;\n  text-transform: uppercase;\n  font-size: 0.7rem;\n  color: var(--ion-color-medium);\n  letter-spacing: 0.03em;\n}\n.beacon-table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%] {\n  border-bottom: 1px solid var(--ion-border-color);\n  background: var(--ion-item-background);\n}\n.beacon-table[_ngcontent-%COMP%]   tr[_ngcontent-%COMP%]:last-child   td[_ngcontent-%COMP%] {\n  border-bottom: none;\n}\n.beacon-table[_ngcontent-%COMP%]   .monospace[_ngcontent-%COMP%] {\n  font-family: monospace;\n  font-size: 0.75rem;\n}\n.beacon-table[_ngcontent-%COMP%]   .beacon-name[_ngcontent-%COMP%] {\n  font-weight: 500;\n  color: var(--ion-text-color);\n}\n.bool-indicator[_ngcontent-%COMP%] {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  font-size: 0.85rem;\n}\n.bool-indicator[_ngcontent-%COMP%]   ion-icon[_ngcontent-%COMP%] {\n  font-size: 1rem;\n}\n.bool-indicator.true[_ngcontent-%COMP%] {\n  color: var(--ion-color-success);\n}\n.bool-indicator.false[_ngcontent-%COMP%] {\n  color: var(--ion-color-medium);\n}\n.source-badge[_ngcontent-%COMP%] {\n  display: inline-block;\n  padding: 2px 8px;\n  border-radius: 4px;\n  font-size: 0.75rem;\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n}\n.source-badge.beacon[_ngcontent-%COMP%] {\n  background: rgba(59, 130, 246, 0.15);\n  color: #3b82f6;\n}\n.source-badge.gps[_ngcontent-%COMP%] {\n  background: rgba(16, 185, 129, 0.15);\n  color: #10b981;\n}\n.source-badge.none[_ngcontent-%COMP%] {\n  background: var(--ion-color-light);\n  color: var(--ion-color-medium);\n}
5540\n@media (prefers-color-scheme: dark) {\n  .stats-bar[_ngcontent-%COMP%], \n   .report-card[_ngcontent-%COMP%] {\n    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);\n  }\n  .report-card.expanded[_ngcontent-%COMP%] {\n    box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4);\n  }\n  .report-details[_ngcontent-%COMP%] {\n    background: var(--ion-color-step-100);\n  }\n  .detail-item[_ngcontent-%COMP%] {\n    background: var(--ion-background-color);\n  }\n  .tech-section-content[_ngcontent-%COMP%] {\n    background: var(--ion-color-step-100);\n  }\n  .beacon-table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%] {\n    background: var(--ion-background-color);\n  }\n  .beacon-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%] {\n    background: var(--ion-color-step-150);\n  }\n}"] });
5541var BugReportsPage = _BugReportsPage;
5542(() => {
5543  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BugReportsPage, [{
5544    type: Component,
5545    args: [{ selector: "app-bug-reports", standalone: true, imports: [
5546      CommonModule,
5547      FormsModule,
5548      IonicModule,
5549      TranslateModule,
5550      BreadcrumbNavigationComponent
5551    ], template: `<ion-content [fullscreen]="true">
5552  <app-breadcrumb-navigation class="admin-navigation" [items]="breadcrumbItems"></app-breadcrumb-navigation>
5553
5554  <div class="admin-content">
5555    <!-- Stats Bar -->
5556    <div class="stats-bar">
5557      <div class="stats-icon-wrapper">
5558        <ion-icon name="bug-outline"></ion-icon>
5559      </div>
5560      <div class="stats-info">
5561        <span class="stats-label">{{ 'bugReportAdmin.title' | translate }}</span>
5562        <span class="stats-value">
5563          {{ 'bugReportAdmin.showingReports' | translate: { count: reports.length, total: totalCount } }}
5564        </span>
5565      </div>
5566      <div class="admin-page-actions">
5567        <ion-button fill="clear" (click)="toggleFilters()" [color]="hasActiveFilters() ? 'primary' : ''" [attr.aria-label]="'bugReportAdmin.toggleFilters' | translate">
5568          <ion-icon slot="icon-only" name="filter-outline"></ion-icon>
5569        </ion-button>
5570        <ion-button fill="clear" (click)="loadReports()" [attr.aria-label]="'bugReportAdmin.refresh' | translate">
5571          <ion-icon slot="icon-only" name="refresh-outline"></ion-icon>
5572        </ion-button>
5573      </div>
5574    </div>
5575
5576    <!-- Filters -->
5577    @if (showFilters) {
5578      <div class="filter-toolbar">
5579        <div class="filter-row">
5580          <ion-select
5581            [(ngModel)]="filterStatus"
5582            (ionChange)="onFilterChange()"
5583            [placeholder]="'bugReportAdmin.filterStatus' | translate"
5584            interface="popover"
5585            class="filter-select">
5586            <ion-select-option value="">{{ 'bugReportAdmin.allStatuses' | translate }}</ion-select-option>
5587            @for (status of statuses; track status.value) {
5588              <ion-select-option [value]="status.value">
5589                {{ status.labelKey | translate }}
5590              </ion-select-option>
5591            }
5592          </ion-select>
5593
5594          <ion-select
5595            [(ngModel)]="filterCategory"
5596            (ionChange)="onFilterChange()"
5597            [placeholder]="'bugReportAdmin.filterCategory' | translate"
5598            interface="popover"
5599            class="filter-select">
5600            <ion-select-option value="">{{ 'bugReportAdmin.allCategories' | translate }}</ion-select-option>
5601            @for (cat of categories; track cat.value) {
5602              <ion-select-option [value]="cat.value">
5603                {{ cat.labelKey | translate }}
5604              </ion-select-option>
5605            }
5606          </ion-select>
5607
5608          <ion-select
5609            [(ngModel)]="selectedCampusId"
5610            (ionChange)="onFilterChange()"
5611            [placeholder]="'admin.users.campusFilter' | translate"
5612            interface="popover"
5613            class="filter-select">
5614            <ion-select-option value="">{{ 'admin.users.allCampuses' | translate }}</ion-select-option>
5615            @for (campus of accessibleCampuses; track campus.id) {
5616              <ion-select-option [value]="campus.id">{{ campus.name }}</ion-select-option>
5617            }
5618          </ion-select>
5619
5620          @if (hasActiveFilters()) {
5621            <ion-button fill="clear" size="small" (click)="clearFilters()" class="clear-filters-btn">
5622              <ion-icon slot="start" name="close-outline"></ion-icon>
5623              {{ 'bugReportAdmin.clearFilters' | translate }}
5624            </ion-button>
5625          }
5626        </div>
5627      </div>
5628    }
5629
5630    <!-- Loading State -->
5631    @if (isLoading) {
5632      <div class="loading-container">
5633        <ion-spinner></ion-spinner>
5634        <p>{{ 'bugReportAdmin.loading' | translate }}</p>
5635      </div>
5636    }
5637
5638    <!-- Error State -->
5639    @if (error && !isLoading) {
5640      <div class="error-container">
5641        <div class="error-icon-wrapper">
5642          <ion-icon name="alert-circle-outline"></ion-icon>
5643        </div>
5644        <h3>Unable to load reports</h3>
5645        <p>{{ error }}</p>
5646        <ion-button (click)="loadReports()">
5647          <ion-icon slot="start" name="refresh-outline"></ion-icon>
5648          {{ 'common.retry' | translate }}
5649        </ion-button>
5650      </div>
5651    }
5652
5653    <!-- Empty State -->
5654    @if (!isLoading && !error && reports.length === 0) {
5655      <div class="empty-state">
5656        <div class="empty-state-card">
5657          <div class="empty-icon-wrapper">
5658            <ion-icon name="bug-outline"></ion-icon>
5659          </div>
5660          <h3>{{ 'bugReportAdmin.noReports' | translate }}</h3>
5661          <p>No bug reports have been submitted yet.</p>
5662          @if (hasActiveFilters()) {
5663            <ion-button (click)="clearFilters()">
5664              <ion-icon slot="start" name="close-outline"></ion-icon>
5665              {{ 'bugReportAdmin.clearFilters' | translate }}
5666            </ion-button>
5667          }
5668        </div>
5669      </div>
5670    }
5671
5672    <!-- Reports List -->
5673    @if (!isLoading && !error && reports.length > 0) {
5674      <ion-list class="report-list">
5675        @for (report of reports; track report.id; let idx = $index) {
5676          <ion-card class="report-card" [class.expanded]="isExpanded(report.id!)">
5677            <!-- Header Row -->
5678            <ion-card-header class="report-header" (click)="toggleExpand(report.id!)">
5679              <div class="report-header-inner">
5680                <!-- Status Icon -->
5681                <div class="report-icon-wrapper" [ngClass]="getStatusClass(report.status)">
5682                  <ion-icon [name]="getStatusIcon(report.status)"></ion-icon>
5683                </div>
5684
5685                <div class="report-header-content">
5686                  <!-- Status Row -->
5687                  <div class="report-status-row">
5688                    <ion-badge [color]="getStatusColor(report.status)" class="status-badge">
5689                      {{ getStatusLabel(report.status) }}
5690                    </ion-badge>
5691                    <ion-badge color="light" class="category-badge">
5692                      {{ getCategoryLabel(report.category) }}
5693                    </ion-badge>
5694                    <span class="report-time">{{ formatDate(report.createdAt) }}</span>
5695                  </div>
5696
5697                  <!-- Description -->
5698                  <p class="report-description">{{ report.description }}</p>
5699
5700                  <!-- Meta Info -->
5701                  <div class="report-meta">
5702                    <span class="meta-item">
5703                      <ion-icon name="phone-portrait-outline"></ion-icon>
5704                      {{ report.deviceModel || 'Unknown device' }}
5705                    </span>
5706                    @if (report.campusName) {
5707                      <span class="meta-item">
5708                        <ion-icon name="business-outline"></ion-icon>
5709                        {{ report.campusName }}
5710                      </span>
5711                    }
5712                    <span class="meta-item version">
5713                      v{{ report.appVersion }}
5714                    </span>
5715                  </div>
5716                </div>
5717
5718                <!-- Expand Icon -->
5719                <ion-icon
5720                  [name]="isExpanded(report.id!) ? 'chevron-up-outline' : 'chevron-down-outline'"
5721                  class="expand-icon">
5722                </ion-icon>
5723              </div>
5724            </ion-card-header>
5725
5726            <!-- Expanded Content -->
5727            @if (isExpanded(report.id!)) {
5728              <ion-card-content class="report-details">
5729                <!-- Screenshot -->
5730                @if (getScreenshotUrl(report); as screenshotUrl) {
5731                  <div class="detail-section screenshot-section">
5732                    <h4>
5733                      <ion-icon name="image-outline"></ion-icon>
5734                      {{ 'bugReportAdmin.screenshot' | translate }}
5735                    </h4>
5736                    <img [src]="screenshotUrl" alt="Bug report screenshot" class="screenshot-img" />
5737                  </div>
5738                }
5739
5740                <!-- Signal Recording -->
5741                @if (getRecordingUrl(report)) {
5742                  <div class="detail-section recording-section">
5743                    <h4>
5744                      <ion-icon name="pulse-outline"></ion-icon>
5745                      {{ 'bugReportAdmin.recording' | translate }}
5746                    </h4>
5747                    <ion-button fill="outline" size="small" (click)="downloadRecording(report)">
5748                      <ion-icon slot="start" name="download-outline"></ion-icon>
5749                      {{ 'bugReportAdmin.downloadRecording' | translate }}
5750                    </ion-button>
5751                  </div>
5752                }
5753
5754                <!-- Device Info -->
5755                <div class="detail-section">
5756                  <h4>
5757                    <ion-icon name="phone-portrait-outline"></ion-icon>
5758                    {{ 'bugReportAdmin.deviceInfo' | translate }}
5759                  </h4>
5760                  <div class="detail-grid">
5761                    <div class="detail-item">
5762                      <span class="detail-label">{{ 'bugReportAdmin.device' | translate }}</span>
5763                      <span class="detail-value">{{ report.deviceModel || '-' }}</span>
5764                    </div>
5765                    <div class="detail-item">
5766                      <span class="detail-label">{{ 'bugReportAdmin.os' | translate }}</span>
5767                      <span class="detail-value">{{ report.osVersion || '-' }}</span>
5768                    </div>
5769                    <div class="detail-item">
5770                      <span class="detail-label">{{ 'bugReportAdmin.appVersion' | translate }}</span>
5771                      <span class="detail-value">{{ report.appVersion }}</span>
5772                    </div>
5773                    <div class="detail-item">
5774                      <span class="detail-label">{{ 'bugReportAdmin.deviceId' | translate }}</span>
5775                      <span class="detail-value device-id">{{ report.deviceIdentifier }}</span>
5776                    </div>
5777                  </div>
5778                </div>
5779
5780                <!-- Technical Data -->
5781                @if (parseTechnicalData(report.technicalDataJson); as techData) {
5782                  <div class="detail-section">
5783                    <h4>
5784                      <ion-icon name="code-slash-outline"></ion-icon>
5785                      {{ 'bugReportAdmin.technicalData' | translate }}
5786                    </h4>
5787
5788                    <!-- Navigation Section -->
5789                    @if (techData.navigation) {
5790                      <div class="tech-section">
5791                        <div class="tech-section-header" (click)="toggleTechSection(report.id!, 'navigation')">
5792                          <ion-icon name="navigate-outline"></ion-icon>
5793                          <span>{{ 'bugReportAdmin.tech.navigation' | translate }}</span>
5794                          <ion-icon [name]="isTechSectionExpanded(report.id!, 'navigation') ? 'chevron-up-outline' : 'chevron-down-outline'"></ion-icon>
5795                        </div>
5796                        @if (isTechSectionExpanded(report.id!, 'navigation')) {
5797                          <div class="tech-section-content">
5798                            <div class="detail-grid">
5799                              <div class="detail-item">
5800                                <span class="detail-label">{{ 'bugReportAdmin.tech.mode' | translate }}</span>
5801                                <span class="detail-value">{{ techData.navigation.mode }}</span>
5802                              </div>
5803                              @if (techData.navigation.targetName) {
5804                                <div class="detail-item">
5805                                  <span class="detail-label">{{ 'bugReportAdmin.tech.target' | translate }}</span>
5806                                  <span class="detail-value">{{ techData.navigation.targetName }}</span>
5807                                </div>
5808                              }
5809                              @if (techData.navigation.currentDirection) {
5810                                <div class="detail-item">
5811                                  <span class="detail-label">{{ 'bugReportAdmin.tech.direction' | translate }}</span>
5812                                  <span class="detail-value">{{ techData.navigation.currentDirection }}</span>
5813                                </div>
5814                              }
5815                              @if (techData.navigation.distanceRemaining !== undefined) {
5816                                <div class="detail-item">
5817                                  <span class="detail-label">{{ 'bugReportAdmin.tech.distanceRemaining' | translate }}</span>
5818                                  <span class="detail-value">{{ formatDistanceCm(techData.navigation.distanceRemaining) }}</span>
5819                                </div>
5820                              }
5821                              <div class="detail-item">
5822                                <span class="detail-label">{{ 'bugReportAdmin.tech.offRoute' | translate }}</span>
5823                                <span class="detail-value">
5824                                  <span class="bool-indicator" [class.true]="techData.navigation.isOffRoute" [class.false]="!techData.navigation.isOffRoute">
5825                                    <ion-icon [name]="techData.navigation.isOffRoute ? 'checkmark-outline' : 'close-sharp'"></ion-icon>
5826                                    {{ techData.navigation.isOffRoute ? 'Yes' : 'No' }}
5827                                  </span>
5828                                </span>
5829                              </div>
5830                            </div>
5831                          </div>
5832                        }
5833                      </div>
5834                    }
5835
5836                    <!-- Position & Confidence Section -->
5837                    @if (techData.position || techData.confidence) {
5838                      <div class="tech-section">
5839                        <div class="tech-section-header" (click)="toggleTechSection(report.id!, 'position')">
5840                          <ion-icon name="location-outline"></ion-icon>
5841                          <span>{{ 'bugReportAdmin.tech.position' | translate }}</span>
5842                          <ion-icon [name]="isTechSectionExpanded(report.id!, 'position') ? 'chevron-up-outline' : 'chevron-down-outline'"></ion-icon>
5843                        </div>
5844                        @if (isTechSectionExpanded(report.id!, 'position')) {
5845                          <div class="tech-section-content">
5846                            <div class="detail-grid">
5847                              @if (techData.position.x !== undefined && techData.position.y !== undefined) {
5848                                <div class="detail-item">
5849                                  <span class="detail-label">{{ 'bugReportAdmin.tech.coordinates' | translate }}</span>
5850                                  <span class="detail-value device-id">{{ formatCoord(techData.position.x) }}, {{ formatCoord(techData.position.y) }}</span>
5851                                </div>
5852                              }
5853                              @if (techData.position.floorName) {
5854                                <div class="detail-item">
5855                                  <span class="detail-label">{{ 'bugReportAdmin.floor' | translate }}</span>
5856                                  <span class="detail-value">{{ techData.position.floorName }}</span>
5857                                </div>
5858                              }
5859                              @if (techData.position.buildingName) {
5860                                <div class="detail-item">
5861                                  <span class="detail-label">{{ 'bugReportAdmin.building' | translate }}</span>
5862                                  <span class="detail-value">{{ techData.position.buildingName }}</span>
5863                                </div>
5864                              }
5865                              @if (techData.position.activeSource) {
5866                                <div class="detail-item">
5867                                  <span class="detail-label">{{ 'bugReportAdmin.tech.activeSource' | translate }}</span>
5868                                  <span class="detail-value">
5869                                    <span class="source-badge" [ngClass]="techData.position.activeSource">{{ techData.position.activeSource | uppercase }}</span>
5870                                  </span>
5871                                </div>
5872                              }
5873                              @if (techData.confidence.beacon) {
5874                                <div class="detail-item">
5875                                  <span class="detail-label">{{ 'bugReportAdmin.tech.beaconConfidence' | translate }}</span>
5876                                    <span class="detail-value">{{ formatConfidence(techData.confidence.beacon.raw, techData.confidence.beacon.adjusted) }}</span>
5877                                </div>
5878                              }
5879                              @if (techData.confidence.gps) {
5880                                <div class="detail-item">
5881                                  <span class="detail-label">{{ 'bugReportAdmin.tech.gpsConfidence' | translate }}</span>
5882                                    <span class="detail-value">{{ formatConfidence(techData.confidence.gps.raw, techData.confidence.gps.adjusted) }}</span>
5883                                </div>
5884                              }
5885                              @if (techData.confidence.delta !== undefined) {
5886                                <div class="detail-item">
5887                                  <span class="detail-label">{{ 'bugReportAdmin.tech.delta' | translate }}</span>
5888                                   <span class="detail-value">{{ techData.confidence.delta.toFixed(2) }}</span>
5889                                </div>
5890                              }
5891                            </div>
5892                          </div>
5893                        }
5894                      </div>
5895                    }
5896
5897                    <!-- Kalman Filter Section -->
5898                    @if (techData.position.kalmanState) {
5899                      <div class="tech-section">
5900                        <div class="tech-section-header" (click)="toggleTechSection(report.id!, 'kalman')">
5901                          <ion-icon name="analytics-outline"></ion-icon>
5902                          <span>{{ 'bugReportAdmin.tech.kalman' | translate }}</span>
5903                          <ion-icon [name]="isTechSectionExpanded(report.id!, 'kalman') ? 'chevron-up-outline' : 'chevron-down-outline'"></ion-icon>
5904                        </div>
5905                        @if (isTechSectionExpanded(report.id!, 'kalman')) {
5906                          <div class="tech-section-content">
5907                            <div class="detail-grid">
5908                              <div class="detail-item">
5909                                <span class="detail-label">{{ 'bugReportAdmin.tech.enabled' | translate }}</span>
5910                                <span class="detail-value">
5911                                  <span class="bool-indicator" [class.true]="techData.position.kalmanState.enabled" [class.false]="!techData.position.kalmanState.enabled">
5912                                    <ion-icon [name]="techData.position.kalmanState.enabled ? 'checkmark-outline' : 'close-sharp'"></ion-icon>
5913                                    {{ techData.position.kalmanState.enabled ? 'Yes' : 'No' }}
5914                                  </span>
5915                                </span>
5916                              </div>
5917                              <div class="detail-item">
5918                                <span class="detail-label">{{ 'bugReportAdmin.tech.speed' | translate }}</span>
5919                                <span class="detail-value">{{ techData.position.kalmanState.speed.toFixed(4) }} cm/s</span>
5920                              </div>
5921                              <div class="detail-item">
5922                                <span class="detail-label">{{ 'bugReportAdmin.tech.velocityX' | translate }}</span>
5923                                <span class="detail-value">{{ techData.position.kalmanState.velocityX.toFixed(4) }} cm/s</span>
5924                              </div>
5925                              <div class="detail-item">
5926                                <span class="detail-label">{{ 'bugReportAdmin.tech.velocityY' | translate }}</span>
5927                                <span class="detail-value">{{ techData.position.kalmanState.velocityY.toFixed(4) }} cm/s</span>
5928                              </div>
5929                              <div class="detail-item">
5930                                <span class="detail-label">{{ 'bugReportAdmin.tech.uncertainty' | translate }}</span>
5931                                <span class="detail-value">{{ techData.position.kalmanState.uncertainty.toFixed(2) }} cm</span>
5932                              </div>
5933                            </div>
5934                          </div>
5935                        }
5936                      </div>
5937                    }
5938
5939                    <!-- Stable Beacon Pair Section -->
5940                    @if (techData.position.stablePair.primaryBeaconId) {
5941                      <div class="tech-section">
5942                        <div class="tech-section-header" (click)="toggleTechSection(report.id!, 'beaconPair')">
5943                          <ion-icon name="radio-outline"></ion-icon>
5944                          <span>{{ 'bugReportAdmin.tech.beaconPair' | translate }}</span>
5945                          <ion-icon [name]="isTechSectionExpanded(report.id!, 'beaconPair') ? 'chevron-up-outline' : 'chevron-down-outline'"></ion-icon>
5946                        </div>
5947                        @if (isTechSectionExpanded(report.id!, 'beaconPair')) {
5948                          <div class="tech-section-content">
5949                            <div class="detail-grid">
5950                              <div class="detail-item">
5951                                <span class="detail-label">{{ 'bugReportAdmin.tech.primaryBeacon' | translate }}</span>
5952                                <span class="detail-value">
5953                                  {{ techData.position.stablePair.primaryBeaconName || '-' }}
5954                                  <br><span class="device-id">{{ techData.position.stablePair.primaryBeaconId }}</span>
5955                                </span>
5956                              </div>
5957                              @if (techData.position.stablePair.secondaryBeaconId) {
5958                                <div class="detail-item">
5959                                  <span class="detail-label">{{ 'bugReportAdmin.tech.secondaryBeacon' | translate }}</span>
5960                                  <span class="detail-value">
5961                                    {{ techData.position.stablePair.secondaryBeaconName || '-' }}
5962                                    <br><span class="device-id">{{ techData.position.stablePair.secondaryBeaconId }}</span>
5963                                  </span>
5964                                </div>
5965                              }
5966                            </div>
5967                          </div>
5968                        }
5969                      </div>
5970                    }
5971
5972                    <!-- Beacons Section -->
5973                    @if (techData.beacons) {
5974                      <div class="tech-section">
5975                        <div class="tech-section-header" (click)="toggleTechSection(report.id!, 'beacons')">
5976                          <ion-icon name="bluetooth-outline"></ion-icon>
5977                          <span>{{ 'bugReportAdmin.tech.beacons' | translate }} ({{ techData.beacons.count }})</span>
5978                          <ion-icon [name]="isTechSectionExpanded(report.id!, 'beacons') ? 'chevron-up-outline' : 'chevron-down-outline'"></ion-icon>
5979                        </div>
5980                        @if (isTechSectionExpanded(report.id!, 'beacons')) {
5981                          <div class="tech-section-content">
5982                            <div class="detail-grid">
5983                              <div class="detail-item">
5984                                <span class="detail-label">{{ 'bugReportAdmin.tech.mode' | translate }}</span>
5985                                <span class="detail-value">{{ techData.beacons.mode }}</span>
5986                              </div>
5987                              @if (techData.beacons.signalQuality?.strongestRssi !== undefined) {
5988                                <div class="detail-item">
5989                                  <span class="detail-label">{{ 'bugReportAdmin.tech.strongestSignal' | translate }}</span>
5990                                  <span class="detail-value">{{ techData.beacons.signalQuality?.strongestRssi }} dBm</span>
5991                                </div>
5992                              }
5993                              @if (techData.beacons.signalQuality?.avgRssi !== undefined) {
5994                                <div class="detail-item">
5995                                  <span class="detail-label">{{ 'bugReportAdmin.tech.avgRssi' | translate }}</span>
5996                                  <span class="detail-value">{{ techData.beacons.signalQuality?.avgRssi }} dBm</span>
5997                                </div>
5998                              }
5999                              @if (techData.beacons.timeSinceLastMs !== null) {
6000                                <div class="detail-item">
6001                                  <span class="detail-label">{{ 'bugReportAdmin.tech.lastUpdate' | translate }}</span>
6002                                  <span class="detail-value">{{ formatTimeSince(techData.beacons.timeSinceLastMs) }}</span>
6003                                </div>
6004                              }
6005                            </div>
6006                            <!-- Beacon Table -->
6007                             @if (techData.beacons.activeBeacons.length) {
6008                              <div class="beacon-table-wrapper">
6009                                <table class="beacon-table">
6010                                  <thead>
6011                                    <tr>
6012                                      <th>{{ 'bugReportAdmin.tech.beacon' | translate }}</th>
6013                                      <th>{{ 'bugReportAdmin.tech.rssi' | translate }}</th>
6014                                      <th>{{ 'bugReportAdmin.tech.filteredRssi' | translate }}</th>
6015                                      <th>{{ 'bugReportAdmin.tech.distance' | translate }}</th>
6016                                      <th>{{ 'bugReportAdmin.tech.battery' | translate }}</th>
6017                                      <th>{{ 'bugReportAdmin.tech.lastSeen' | translate }}</th>
6018                                    </tr>
6019                                  </thead>
6020                                  <tbody>
6021                                    @for (beacon of techData.beacons.activeBeacons; track beacon.id) {
6022                                      <tr>
6023                                        <td class="beacon-name">{{ beacon.name }}</td>
6024                                        <td class="monospace">{{ beacon.rssi }} dBm</td>
6025                                        <td class="monospace">{{ beacon.filteredRssi.toFixed(1) }}</td>
6026                                        <td>{{ formatDistanceCm(beacon.distanceCm) }}</td>
6027                                        <td>{{ beacon.batteryPercent !== null ? beacon.batteryPercent + '%' : '-' }}</td>
6028                                        <td>{{ formatTimeSince(beacon.lastSeenMs) }}</td>
6029                                      </tr>
6030                                    }
6031                                  </tbody>
6032                                </table>
6033                              </div>
6034                            }
6035                          </div>
6036                        }
6037                      </div>
6038                    }
6039
6040                    <!-- GPS Section -->
6041                    @if (techData.gps) {
6042                      <div class="tech-section">
6043                        <div class="tech-section-header" (click)="toggleTechSection(report.id!, 'gps')">
6044                          <ion-icon name="location-outline"></ion-icon>
6045                          <span>{{ 'bugReportAdmin.tech.gps' | translate }}</span>
6046                          <ion-icon [name]="isTechSectionExpanded(report.id!, 'gps') ? 'chevron-up-outline' : 'chevron-down-outline'"></ion-icon>
6047                        </div>
6048                        @if (isTechSectionExpanded(report.id!, 'gps')) {
6049                          <div class="tech-section-content">
6050                            <div class="detail-grid">
6051                              <div class="detail-item">
6052                                <span class="detail-label">{{ 'bugReportAdmin.tech.gpsStatus' | translate }}</span>
6053                                <span class="detail-value">
6054                                   <span class="bool-indicator" [class.true]="techData.gps.status.available" [class.false]="!techData.gps.status.available">
6055                                     <ion-icon [name]="techData.gps.status.available ? 'checkmark-outline' : 'close-sharp'"></ion-icon>
6056                                     {{ techData.gps.status.available ? 'Available' : 'Unavailable' }}
6057                                  </span>
6058                                </span>
6059                              </div>
6060                              @if (techData.gps.position?.latitude !== undefined) {
6061                                <div class="detail-item">
6062                                  <span class="detail-label">{{ 'bugReportAdmin.tech.coordinates' | translate }}</span>
6063                                   <span class="detail-value device-id">{{ formatGpsCoord(techData.gps.position?.latitude) }}, {{ formatGpsCoord(techData.gps.position?.longitude) }}</span>
6064                                </div>
6065                              }
6066                              @if (techData.gps.position?.accuracyMeters !== undefined) {
6067                                <div class="detail-item">
6068                                  <span class="detail-label">{{ 'bugReportAdmin.tech.accuracy' | translate }}</span>
6069                                   <span class="detail-value">{{ techData.gps.position?.accuracyMeters }}m</span>
6070                                </div>
6071                              }
6072                              @if (techData.gps.timeSinceLastMs !== null) {
6073                                <div class="detail-item">
6074                                  <span class="detail-label">{{ 'bugReportAdmin.tech.lastUpdate' | translate }}</span>
6075                                  <span class="detail-value">{{ formatTimeSince(techData.gps.timeSinceLastMs) }}</span>
6076                                </div>
6077                              }
6078                              @if (techData.gps.position?.altitude !== undefined) {
6079                                <div class="detail-item">
6080                                  <span class="detail-label">{{ 'bugReportAdmin.tech.altitude' | translate }}</span>
6081                                   <span class="detail-value">{{ techData.gps.position?.altitude?.toFixed(1) }}m</span>
6082                                </div>
6083                              }
6084                              @if (techData.gps.position?.speed !== undefined) {
6085                                <div class="detail-item">
6086                                  <span class="detail-label">{{ 'bugReportAdmin.tech.speed' | translate }}</span>
6087                                   <span class="detail-value">{{ techData.gps.position?.speed?.toFixed(2) }} m/s</span>
6088                                </div>
6089                              }
6090                            </div>
6091                          </div>
6092                        }
6093                      </div>
6094                    }
6095
6096                    @if (techData.rendering; as rendering) {
6097                      <div class="tech-section">
6098                        <div class="tech-section-header" (click)="toggleTechSection(report.id!, 'rendering')">
6099                          <ion-icon name="hardware-chip-outline"></ion-icon>
6100                          <span>GPU Rendering</span>
6101                          <ion-icon [name]="isTechSectionExpanded(report.id!, 'rendering') ? 'chevron-up-outline' : 'chevron-down-outline'"></ion-icon>
6102                        </div>
6103                        @if (isTechSectionExpanded(report.id!, 'rendering')) {
6104                          <div class="tech-section-content">
6105                            <div class="detail-grid">
6106                              <div class="detail-item"><span class="detail-label">Status</span><span class="detail-value">{{ rendering.status }}</span></div>
6107                              <div class="detail-item"><span class="detail-label">GPU</span><span class="detail-value device-id">{{ rendering.webgl?.unmaskedRenderer || rendering.webgl?.renderer || '\u2014' }}</span></div>
6108                              <div class="detail-item"><span class="detail-label">WebGL</span><span class="detail-value">{{ rendering.webgl?.version || '\u2014' }}</span></div>
6109                              <div class="detail-item"><span class="detail-label">Framebuffer</span><span class="detail-value">{{ rendering.drawingBuffer.width }}\xD7{{ rendering.drawingBuffer.height }} \xB7 DPR {{ rendering.rendererPixelRatio }}</span></div>
6110                              <div class="detail-item"><span class="detail-label">Labels</span><span class="detail-value">{{ rendering.labels?.buildingCount ?? 0 }} building / {{ rendering.labels?.roomCount ?? 0 }} room</span></div>
6111                              <div class="detail-item"><span class="detail-label">Label options</span><span class="detail-value">mip {{ rendering.options.generateLabelMipmaps ? 'ON' : 'OFF' }} \xB7 {{ rendering.options.labelCanvasPixelRatio }}\xD7 \xB7 {{ rendering.options.forcePowerOfTwoLabelTextures ? 'POT' : 'native size' }} \xB7 {{ rendering.options.labelTextureFilter || 'linear' }}
6111 \xB7 premultiply {{ rendering.options.premultiplyLabelAlpha ? 'ON' : 'OFF' }} \xB7 vertex padding {{ rendering.options.padLabelVertexBuffer ? 'ON' : 'OFF' }}</span></div>
6112                              <div class="detail-item"><span class="detail-label">Context events</span><span class="detail-value">{{ rendering.context.lossCount }} lost / {{ rendering.context.restorationCount }} restored</span></div>
6113                              <div class="detail-item"><span class="detail-label">Actions</span><span class="detail-value">{{ rendering.actionHistory.length }}</span></div>
6114                            </div>
6115                            @if (rendering.latestError) { <p class="error-message">{{ rendering.latestError }}</p> }
6116                          </div>
6117                        }
6118                      </div>
6119                    }
6120
6121                    <!-- Settings Section -->
6122                    @if (techData.settings) {
6123                      <div class="tech-section">
6124                        <div class="tech-section-header" (click)="toggleTechSection(report.id!, 'settings')">
6125                          <ion-icon name="settings-outline"></ion-icon>
6126                          <span>{{ 'bugReportAdmin.tech.settings' | translate }}</span>
6127                          <ion-icon [name]="isTechSectionExpanded(report.id!, 'settings') ? 'chevron-up-outline' : 'chevron-down-outline'"></ion-icon>
6128                        </div>
6129                        @if (isTechSectionExpanded(report.id!, 'settings')) {
6130                          <div class="tech-section-content">
6131                            <div class="detail-grid">
6132                              <div class="detail-item">
6133                                <span class="detail-label">{{ 'bugReportAdmin.tech.positioningMode' | translate }}</span>
6134                                <span class="detail-value">{{ techData.settings.positioningMode }}</span>
6135                              </div>
6136                              <div class="detail-item">
6137                                <span class="detail-label">{{ 'bugReportAdmin.tech.locationMode' | translate }}</span>
6138                                <span class="detail-value">{{ techData.settings.locationMode }}</span>
6139                              </div>
6140                              <div class="detail-item">
6141                                <span class="detail-label">{{ 'bugReportAdmin.tech.rssiFilter' | translate }}</span>
6142                                <span class="detail-value">{{ techData.settings.rssiFilterType }}</span>
6143                              </div>
6144                              <div class="detail-item">
6145                                <span class="detail-label">{{ 'bugReportAdmin.tech.kalmanFilter' | translate }}</span>
6146                                <span class="detail-value">
6147                                  <span class="bool-indicator" [class.true]="techData.settings.kalmanEnabled" [class.false]="!techData.settings.kalmanEnabled">
6148                                    <ion-icon [name]="techData.settings.kalmanEnabled ? 'checkmark-outline' : 'close-sharp'"></ion-icon>
6149                                    {{ techData.settings.kalmanEnabled ? 'Enabled' : 'Disabled' }}
6150                                  </span>
6151                                </span>
6152                              </div>
6153                              <div class="detail-item">
6154                                <span class="detail-label">{{ 'bugReportAdmin.tech.smartSwitching' | translate }}</span>
6155                                <span class="detail-value">
6156                                  <span class="bool-indicator" [class.true]="techData.settings.smartSwitchingEnabled" [class.false]="!techData.settings.smartSwitchingEnabled">
6157                                    <ion-icon [name]="techData.settings.smartSwitchingEnabled ? 'checkmark-outline' : 'close-sharp'"></ion-icon>
6158                                    {{ techData.settings.smartSwitchingEnabled ? 'Enabled' : 'Disabled' }}
6159                                  </span>
6160                                </span>
6161                              </div>
6162                            </div>
6163                          </div>
6164                        }
6165                      </div>
6166                    }
6167
6168                    <!-- Meta Section (Route & Timestamp) -->
6169                    @if (techData.route || techData.timestamp) {
6170                      <div class="tech-section">
6171                        <div class="tech-section-header" (click)="toggleTechSection(report.id!, 'meta')">
6172                          <ion-icon name="time-outline"></ion-icon>
6173                          <span>{{ 'bugReportAdmin.tech.meta' | translate }}</span>
6174                          <ion-icon [name]="isTechSectionExpanded(report.id!, 'meta') ? 'chevron-up-outline' : 'chevron-down-outline'"></ion-icon>
6175                        </div>
6176                        @if (isTechSectionExpanded(report.id!, 'meta')) {
6177                          <div class="tech-section-content">
6178                            <div class="detail-grid">
6179                              @if (techData.route) {
6180                                <div class="detail-item">
6181                                  <span class="detail-label">{{ 'bugReportAdmin.route' | translate }}</span>
6182                                  <span class="detail-value device-id">{{ techData.route }}</span>
6183                                </div>
6184                              }
6185                              @if (techData.timestamp) {
6186                                <div class="detail-item">
6187                                  <span class="detail-label">{{ 'bugReportAdmin.tech.timestamp' | translate }}</span>
6188                                  <span class="detail-value">{{ formatTimestamp(techData.timestamp) }}</span>
6189                                </div>
6190                              }
6191                            </div>
6192                          </div>
6193                        }
6194                      </div>
6195                    }
6196                  </div>
6197                }
6198
6199                <!-- Admin Notes -->
6200                @if (report.adminNotes) {
6201                  <div class="detail-section">
6202                    <h4>
6203                      <ion-icon name="document-text-outline"></ion-icon>
6204                      {{ 'bugReportAdmin.adminNotes' | translate }}
6205                    </h4>
6206                    <p class="admin-notes">{{ report.adminNotes }}</p>
6207                  </div>
6208                }
6209
6210                <!-- Actions -->
6211                <div class="actions-row">
6212                  @if (getScreenshotUrl(report)) {
6213                    <ion-button fill="outline" size="small" (click)="downloadScreenshot(report)">
6214                      <ion-icon slot="start" name="download-outline"></ion-icon>
6215                      {{ 'bugReportAdmin.downloadImage' | translate }}
6216                    </ion-button>
6217                  }
6218                  @if (getRecordingUrl(report)) {
6219                    <ion-button fill="outline" size="small" (click)="downloadRecording(report)">
6220                      <ion-icon slot="start" name="download-outline"></ion-icon>
6221                      {{ 'bugReportAdmin.downloadRecording' | translate }}
6222                    </ion-button>
6223                  }
6224                  <ion-button fill="outline" size="small" (click)="downloadReportJson(report)">
6225                    <ion-icon slot="start" name="document-outline"></ion-icon>
6226                    {{ 'bugReportAdmin.downloadJson' | translate }}
6227                  </ion-button>
6228                  <ion-button fill="outline" size="small" (click)="downloadZip(report)">
6229                    <ion-icon slot="start" name="archive-outline"></ion-icon>
6230                    {{ 'bugReportAdmin.downloadZip' | translate }}
6231                  </ion-button>
6232                  <ion-button fill="outline" size="small" (click)="updateStatus(report)">
6233                    <ion-icon slot="start" name="sync-outline"></ion-icon>
6234                    {{ 'bugReportAdmin.changeStatus' | translate }}
6235                  </ion-button>
6236                  <ion-button fill="outline" size="small" color="danger" (click)="confirmDelete(report)">
6237                    <ion-icon slot="start" name="trash-outline"></ion-icon>
6238                    {{ 'common.delete' | translate }}
6239                  </ion-button>
6240                </div>
6241              </ion-card-content>
6242            }
6243          </ion-card>
6244        }
6245      </ion-list>
6246
6247      <!-- Load More -->
6248      @if (hasMore) {
6249        <div class="load-more">
6250          <ion-button
6251            fill="outline"
6252            (click)="loadMore()"
6253            [disabled]="isLoadingMore">
6254            @if (isLoadingMore) {
6255              <ion-spinner name="crescent"></ion-spinner>
6256            } @else {
6257              <ion-icon slot="start" name="chevron-down-outline"></ion-icon>
6258              {{ 'bugReportAdmin.loadMore' | translate }}
6259            }
6260          </ion-button>
6261        </div>
6262      }
6263    }
6264  </div>
6265</ion-content>
6266`, styles: ["/* src/app/pages/admin/bug-reports/bug-reports.page.scss */\n.admin-navigation {\n  position: sticky;\n  top: 0;\n  z-index: 20;\n  display: block;\n}
6266\n.admin-page-actions {\n  display: flex;\n  align-items: center;\n  gap: 0.25rem;\n  margin-left: auto;\n  flex-shrink: 0;\n}\n.admin-container {\n  min-height: 100%;\n  background: var(--ion-background-color);\n  padding-top: constant(safe-area-inset-top);\n  padding-top: env(safe-area-inset-top);\n  padding-top: var(--safe-area-inset-top, 0px);\n}\n.admin-content {\n  padding: 1rem;\n  max-width: 900px;\n  margin: 0 auto;\n}\n.loading-container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  min-height: 200px;\n  padding: 2rem;\n}\n.loading-container ion-spinner {\n  margin-bottom: 1rem;\n  width: 48px;\n  height: 48px;\n  --color: var(--ion-color-primary);\n}\n.loading-container p {\n  color: var(--ion-color-medium);\n  font-size: 0.95rem;\n  margin: 0;\n}\n.error-container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 3rem 2rem;\n  text-align: center;\n}\n.error-container .error-icon-wrapper {\n  width: 80px;\n  height: 80px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(239, 68, 68, 0.15) 0%,\n      rgba(239, 68, 68, 0.05) 100%);\n  border-radius: 50%;\n  margin-bottom: 1.5rem;\n}\n.error-container .error-icon-wrapper ion-icon {\n  font-size: 40px;\n  color: #ef4444;\n}\n.error-container h3 {\n  font-size: 1.25rem;\n  font-weight: 600;\n  margin: 0 0 0.5rem;\n  color: var(--ion-text-color);\n}\n.error-container p {\n  color: var(--ion-color-medium);\n  margin: 0 0 1.5rem;\n  font-size: 0.95rem;\n}\n.error-container ion-button {\n  --box-shadow: 0 4px 12px rgba(var(--ion-color-primary-rgb), 0.3);\n}\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  min-height: calc(100vh - 350px);\n  padding: 2rem;\n}\n.empty-state-card {\n  text-align: center;\n  max-width: 400px;\n}\n.empty-state-card .empty-icon-wrapper {\n  width: 100px;\n  height: 100px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--ion-color-medium-rgb), 0.1) 0%,\n      rgba(var(--ion-color-medium-rgb), 0.05) 100%);\n  border-radius: 24px;\n  margin: 0 auto 1.5rem;\n}\n.empty-state-card .empty-icon-wrapper ion-icon {\n  font-size: 48px;\n  color: var(--ion-color-medium);\n  opacity: 0.6;\n}\n.empty-state-card h3 {\n  font-size: 1.5rem;\n  font-weight: 600;\n  color: var(--ion-text-color);\n  margin: 0 0 0.5rem;\n}\n.empty-state-card p {\n  font-size: 1rem;\n  color: var(--ion-color-medium);\n  margin: 0 0 2rem;\n  line-height: 1.5;\n}\n.empty-state-card ion-button {\n  --box-shadow: 0 4px 12px rgba(var(--ion-color-primary-rgb), 0.3);\n  --padding-start: 20px;\n  --padding-end: 24px;\n  --padding-top: 12px;\n  --padding-bottom: 12px;\n  font-weight: 600;\n  font-size: 1rem;\n}\n.empty-state-card ion-button:hover {\n  transform: translateY(-2px);\n  --box-shadow: 0 6px 20px rgba(var(--ion-color-primary-rgb), 0.4);\n}\n.nav-card {\n  margin-bottom: 1rem;\n  border-radius: 16px;\n  overflow: hidden;\n  box-shadow: 0 4px 16px var(--shadow-color-light);\n  cursor: pointer;\n  transition: all 0.3s ease;\n}\n.nav-card:hover {\n  transform: translateY(-2px);\n  box-shadow: 0 8px 24px var(--shadow-color-light);\n}\n.nav-card:hover .nav-icon-wrapper {\n  transform: scale(1.05);\n}\n.nav-card ion-card-content {\n  padding: 0;\n}\n.nav-card-inner {\n  display: flex;\n  align-items: center;\n  gap: 1rem;\n  padding: 1.25rem;\n}\n.nav-icon-wrapper {\n  width: 56px;\n  height: 56px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background:\n    linear-gradient(\n      135deg,\n      var(--ion-color-primary),\n      var(--ion-color-primary-shade));\n  border-radius: 14px;\n  flex-shrink: 0;\n  transition: transform 0.3s ease;\n}\n.nav-icon-wrapper ion-icon {\n  font-size: 28px;\n  color: white;\n}\n.nav-card-text {\n  flex: 1;\n}\n.nav-card-text h3 {\n  margin: 0 0 4px;\n  font-size: 1.1rem;\n  font-weight: 600;\n  color: var(--ion-text-color);\n}\n.nav-card-text p {\n  margin: 0;\n  font-size: 0.9rem;\n  color: var(--ion-color-medium);\n  line-height: 1.4;\n}\n.nav-arrow {\n  color: var(--ion-color-medium);\n  opacity: 0.5;\n  font-size: 1.5rem;\n  transition: transform 0.2s ease;\n}\n.nav-card:hover .nav-arrow {\n  transform: translateX(4px);\n  opacity: 0.8;\n}\n.section-card {\n  margin-bottom: 1rem;\n  border-radius: 16px;\n  overflow: hidden;\n  box-shadow: 0 4px 16px var(--shadow-color-light);\n}\n.section-card ion-card-header {\n  padding: 1.25rem;\n  background: var(--ion-item-background);\n}\n.section-card ion-card-content {\n  padding: 1rem 1.25rem 1.25rem;\n}\n.section-header-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 1rem;\n  flex-wrap: wrap;\n}\n.section-header-info {\n  flex: 1;\n  min-width: 200px;\n}\n.section-header-info ion-card-title {\n  font-size: 1.25rem;\n  font-weight: 700;\n  margin-bottom: 0.25rem;\n}\n.section-header-info ion-card-subtitle {\n  font-size: 0.9rem;\n  color: var(--ion-color-medium);\n}\n.section-header-actions {\n  display: flex;\n  gap: 0.5rem;\n}
6266\n.section-header-actions ion-button {\n  --box-shadow: 0 2px 8px rgba(var(--ion-color-primary-rgb), 0.25);\n  font-weight: 600;\n}\n.section-header-actions ion-button:hover {\n  --box-shadow: 0 4px 12px rgba(var(--ion-color-primary-rgb), 0.35);\n}\n.info-notice {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 14px 16px;\n  margin-bottom: 1rem;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--ion-color-primary-rgb), 0.12) 0%,\n      rgba(var(--ion-color-primary-rgb), 0.06) 100%);\n  border-radius: 12px;\n  border-left: 4px solid var(--ion-color-primary);\n}\n.info-notice ion-icon {\n  flex-shrink: 0;\n  font-size: 1.5rem;\n  color: var(--ion-color-primary);\n}\n.info-notice span {\n  font-size: 0.9rem;\n  color: var(--ion-text-color);\n  line-height: 1.4;\n}\n.custom-searchbar {\n  --background: var(--ion-item-background);\n  --box-shadow: 0 2px 12px var(--shadow-color-light);\n  --border-radius: 12px;\n  --placeholder-opacity: 0.6;\n  margin-bottom: 1rem;\n  padding: 0;\n}\n.custom-searchbar.searchbar-has-value {\n  --clear-button-color: var(--ion-color-medium);\n}\n.list-section-header {\n  display: flex;\n  align-items: center;\n  gap: 0.75rem;\n  margin: 1.5rem 0 1rem;\n}\n.list-section-header:first-child {\n  margin-top: 0;\n}\n.list-section-header .section-icon {\n  width: 28px;\n  height: 28px;\n  color: var(--ion-color-primary);\n}\n.list-section-header h3 {\n  flex: 1;\n  margin: 0;\n  font-size: 1.1rem;\n  font-weight: 600;\n  color: var(--ion-text-color);\n}\n.list-section-header .count-badge {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-width: 32px;\n  height: 28px;\n  padding: 0 12px;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--ion-color-primary-rgb), 0.15) 0%,\n      rgba(var(--ion-color-primary-rgb), 0.08) 100%);\n  color: var(--ion-color-primary);\n  font-size: 0.85rem;\n  font-weight: 600;\n  border-radius: 14px;\n}\n.entity-list {\n  background: transparent;\n  margin-bottom: 1rem;\n  padding: 0;\n}\n.entity-list ion-item {\n  margin-bottom: 0.75rem;\n  border-radius: 14px;\n  overflow: hidden;\n  box-shadow: 0 2px 12px var(--shadow-color-light);\n}\n.entity-item {\n  --background: var(--ion-item-background);\n  --padding-start: 1rem;\n  --padding-end: 1rem;\n  --inner-padding-end: 0;\n  --min-height: 84px;\n  --transition: all 0.2s ease;\n  --border-color: transparent;\n  position: relative;\n}\n.entity-item::part(native) {\n  border-radius: 14px;\n}\n.entity-item:hover {\n  --background: var(--ion-color-step-50);\n}\n.entity-item:hover .entity-icon-wrapper {\n  transform: scale(1.05);\n}\n.entity-item:hover .entity-icon-wrapper ion-icon {\n  transform: scale(1.1);\n}\n.entity-item ion-label {\n  margin: 0.75rem 0;\n}\n.entity-item ion-label h2 {\n  font-size: 1.05rem;\n  font-weight: 600;\n  color: var(--ion-text-color);\n  margin-bottom: 0.25rem;\n}\n.entity-item ion-label p {\n  font-size: 0.9rem;\n  color: var(--ion-color-medium);\n  margin: 0.2rem 0;\n  line-height: 1.4;\n}\n.entity-icon-wrapper {\n  --icon-color: var(--ion-color-primary);\n  --icon-rgb: var(--ion-color-primary-rgb);\n  width: 56px;\n  height: 56px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--icon-rgb), 0.15) 0%,\n      rgba(var(--icon-rgb), 0.06) 100%);\n  border-radius: 14px;\n  margin-right: 1rem;\n  flex-shrink: 0;\n  transition: all 0.3s ease;\n}\n.entity-icon-wrapper ion-icon {\n  font-size: 1.75rem;\n  color: var(--icon-color);\n  transition: transform 0.3s ease;\n}\n.entity-icon-wrapper.role-superadmin {\n  --icon-color: #6030ff;\n  --icon-rgb:\n    96,\n    48,\n    255;\n}\n.entity-icon-wrapper.role-admin {\n  --icon-color: #c5000f;\n  --icon-rgb:\n    197,\n    0,\n    15;\n}\n.entity-icon-wrapper.role-moderator {\n  --icon-color: #f59e0b;\n  --icon-rgb:\n    245,\n    158,\n    11;\n}\n.entity-icon-wrapper.role-user {\n  --icon-color: var(--ion-color-primary);\n  --icon-rgb: var(--ion-color-primary-rgb);\n}\n.role-badge {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  padding: 4px 10px;\n  border-radius: 6px;\n  font-size: 0.75rem;\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: 0.02em;\n}\n.role-badge.role-superadmin {\n  background: rgba(96, 48, 255, 0.15);\n  color: #6030ff;\n}\n.role-badge.role-admin {\n  background: rgba(197, 0, 15, 0.15);\n  color: #c5000f;\n}\n.role-badge.role-moderator {\n  background: rgba(245, 158, 11, 0.15);\n  color: #f59e0b;\n}\n.role-badge.role-user {\n  background: rgba(var(--ion-color-primary-rgb), 0.15);\n  color: var(--ion-color-primary);\n}\n.meta-info {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  margin-top: 0.5rem;\n  font-size: 0.85rem;\n  color: var(--ion-color-medium);\n}\n.meta-info ion-icon {\n  font-size: 1rem;\n  opacity: 0.7;\n}\n.action-buttons {\n  display: flex;\n  align-items: center;\n  gap: 0.25rem;\n}\n.action-buttons ion-button {\n  --padding-start: 10px;\n  --padding-end: 10px;\n  --padding-top: 10px;\n  --padding-bottom: 10px;\n  margin: 0;\n}\n.action-buttons ion-button ion-icon {\n  font-size: 1.25rem;\n}\n.action-buttons ion-button:hover {\n  --background-hover: var(--ion-color-light);\n}\n.action-buttons .desktop-actions {\n  display: flex;\n  align-items: center;\n  gap: 0.25rem;\n}\n.action-buttons .mobile-menu-button {\n  display: none;\n}\n.edit-form-card {\n  border-radius: 16px;\n  overflow: hidden;\n  box-shadow: 0 4px 20px var(--shadow-color-light);\n}\n.edit-form-card ion-card-header {\n  padding: 1.25rem;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--ion-color-primary-rgb), 0.08) 0%,\n      rgba(var(--ion-color-primary-rgb), 0.02) 100%);\n  border-bottom: 1px solid var(--ion-border-color);\n}\n.edit-form-card ion-card-content {\n  padding: 1.5rem;\n}\n.edit-form-card ion-item {\n  --background: transparent;\n  --border-color: var(--ion-border-color);\n  margin-bottom: 1rem;\n}\n.edit-form-card ion-item:last-of-type {\n  margin-bottom: 0;\n}\n.form-actions {\n  display: flex;\n  justify-content: flex-end;\n  gap: 1rem;\n  padding-top: 1.5rem;\n  margin-top: 1.5rem;\n  border-top: 1px solid var(--ion-border-color);\n}\n.form-actions ion-button {\n  min-width: 120px;\n}\n@keyframes slideIn {\n  from {\n    opacity: 0;\n    transform: translateX(-12px);\n  }\n  to {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n@keyframes fadeIn {\n  from {\n    opacity: 0;\n    transform: translateY(8px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n.entity-item {\n  animation: slideIn 0.35s ease-out;\n  animation-fill-mode: both;\n}
6266\n.entity-item:nth-child(1) {\n  animation-delay: 0.04s;\n}\n.entity-item:nth-child(2) {\n  animation-delay: 0.08s;\n}\n.entity-item:nth-child(3) {\n  animation-delay: 0.12s;\n}\n.entity-item:nth-child(4) {\n  animation-delay: 0.16s;\n}\n.entity-item:nth-child(5) {\n  animation-delay: 0.2s;\n}\n.entity-item:nth-child(6) {\n  animation-delay: 0.24s;\n}\n.entity-item:nth-child(7) {\n  animation-delay: 0.28s;\n}\n.entity-item:nth-child(8) {\n  animation-delay: 0.32s;\n}\n.entity-item:nth-child(9) {\n  animation-delay: 0.36s;\n}\n.entity-item:nth-child(10) {\n  animation-delay: 0.4s;\n}\n.entity-item:nth-child(11) {\n  animation-delay: 0.44s;\n}\n.entity-item:nth-child(12) {\n  animation-delay: 0.48s;\n}\n.entity-item:nth-child(13) {\n  animation-delay: 0.52s;\n}\n.entity-item:nth-child(14) {\n  animation-delay: 0.56s;\n}\n.entity-item:nth-child(15) {\n  animation-delay: 0.6s;\n}\n.entity-item:nth-child(16) {\n  animation-delay: 0.64s;\n}\n.entity-item:nth-child(17) {\n  animation-delay: 0.68s;\n}\n.entity-item:nth-child(18) {\n  animation-delay: 0.72s;\n}\n.entity-item:nth-child(19) {\n  animation-delay: 0.76s;\n}\n.entity-item:nth-child(20) {\n  animation-delay: 0.8s;\n}\n.nav-card,\n.section-card {\n  animation: fadeIn 0.4s ease-out;\n}\n@media (max-width: 768px) {\n  .admin-content {\n    padding: 0.75rem;\n  }\n  .section-header-row {\n    flex-direction: column;\n    align-items: stretch;\n    gap: 0.75rem;\n  }\n  .section-header-actions {\n    justify-content: flex-end;\n  }\n  .entity-item {\n    --min-height: 76px;\n    --padding-start: 0.75rem;\n    --padding-end: 0.75rem;\n  }\n  .entity-icon-wrapper {\n    width: 46px;\n    height: 46px;\n    margin-right: 0.75rem;\n    border-radius: 12px;\n  }\n  .entity-icon-wrapper ion-icon {\n    font-size: 1.5rem;\n  }\n  .action-buttons {\n    gap: 0;\n  }\n  .action-buttons .desktop-actions {\n    display: none;\n  }\n  .action-buttons .mobile-menu-button {\n    display: flex;\n  }\n  ion-label h2 {\n    font-size: 1rem;\n  }\n  ion-label .meta-info {\n    font-size: 0.8rem;\n    gap: 4px;\n  }\n  ion-label .meta-info ion-icon {\n    font-size: 0.9rem;\n  }\n  .nav-card-inner {\n    padding: 1rem;\n  }\n  .nav-icon-wrapper {\n    width: 48px;\n    height: 48px;\n    border-radius: 12px;\n  }\n  .nav-icon-wrapper ion-icon {\n    font-size: 24px;\n  }\n}\n@media (prefers-color-scheme: dark) {\n  .nav-card,\n  .section-card,\n  .entity-list ion-item {\n    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);\n  }\n  .info-notice {\n    background:\n      linear-gradient(\n        135deg,\n        rgba(var(--ion-color-primary-rgb), 0.2) 0%,\n        rgba(var(--ion-color-primary-rgb), 0.1) 100%);\n  }\n}\n.filter-toolbar {\n  background: var(--ion-item-background, var(--ion-background-color, #ffffff));\n  padding: 0.75rem 1rem;\n  border: 1px solid var(--ion-border-color, var(--ion-color-step-200, #e2e8f0));\n  border-radius: 12px;\n  margin-bottom: 1rem;\n}\n.filter-row {\n  display: flex;\n  gap: 0.75rem;\n  align-items: center;\n  flex-wrap: wrap;\n}\n.filter-select {\n  flex: 1;\n  min-width: 140px;\n  max-width: 200px;\n  --padding-start: 12px;\n  --padding-end: 12px;\n  font-size: 14px;\n  background: var(--ion-background-color);\n  border-radius: 10px;\n  border: 1px solid var(--ion-border-color);\n}\n.filter-select:hover {\n  border-color: var(--ion-color-primary);\n}\n.clear-filters-btn {\n  --color: var(--ion-color-medium);\n  font-weight: 500;\n}\n.clear-filters-btn:hover {\n  --color: var(--ion-color-primary);\n}\n.stats-bar {\n  display: flex;\n  align-items: center;\n  gap: 1rem;\n  padding: 1rem 1.25rem;\n  background: var(--ion-item-background);\n  border-radius: 14px;\n  margin-bottom: 1rem;\n  box-shadow: 0 2px 12px var(--shadow-color-light);\n}\n.stats-icon-wrapper {\n  width: 48px;\n  height: 48px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background:\n    linear-gradient(\n      135deg,\n      rgba(var(--ion-color-primary-rgb), 0.15) 0%,\n      rgba(var(--ion-color-primary-rgb), 0.06) 100%);\n  border-radius: 12px;\n  flex-shrink: 0;\n}\n.stats-icon-wrapper ion-icon {\n  font-size: 1.5rem;\n  color: var(--ion-color-primary);\n}\n.stats-info {\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n}\n.stats-label {\n  font-size: 0.8rem;\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n  color: var(--ion-color-medium);\n}\n.stats-value {\n  font-size: 0.95rem;\n  color: var(--ion-text-color);\n}\n.report-list {\n  background: transparent;\n  padding: 0;\n}\n.report-card {\n  margin: 0 0 0.75rem 0;\n  border-radius: 14px;\n  overflow: hidden;\n  box-shadow: 0 2px 12px var(--shadow-color-light);\n  transition: all 0.3s ease;\n  animation: fadeSlideIn 0.35s ease-out;\n  animation-fill-mode: both;\n}\n.report-card:hover {\n  box-shadow: 0 4px 20px var(--shadow-color-light);\n}\n.report-card.expanded {\n  box-shadow: 0 6px 24px var(--shadow-color-light);\n}
6266\n.report-card:nth-child(1) {\n  animation-delay: 0.04s;\n}\n.report-card:nth-child(2) {\n  animation-delay: 0.08s;\n}\n.report-card:nth-child(3) {\n  animation-delay: 0.12s;\n}\n.report-card:nth-child(4) {\n  animation-delay: 0.16s;\n}\n.report-card:nth-child(5) {\n  animation-delay: 0.2s;\n}\n.report-card:nth-child(6) {\n  animation-delay: 0.24s;\n}\n.report-card:nth-child(7) {\n  animation-delay: 0.28s;\n}\n.report-card:nth-child(8) {\n  animation-delay: 0.32s;\n}\n.report-card:nth-child(9) {\n  animation-delay: 0.36s;\n}\n.report-card:nth-child(10) {\n  animation-delay: 0.4s;\n}\n.report-card:nth-child(11) {\n  animation-delay: 0.44s;\n}\n.report-card:nth-child(12) {\n  animation-delay: 0.48s;\n}\n.report-card:nth-child(13) {\n  animation-delay: 0.52s;\n}\n.report-card:nth-child(14) {\n  animation-delay: 0.56s;\n}\n.report-card:nth-child(15) {\n  animation-delay: 0.6s;\n}\n.report-card:nth-child(16) {\n  animation-delay: 0.64s;\n}\n.report-card:nth-child(17) {\n  animation-delay: 0.68s;\n}\n.report-card:nth-child(18) {\n  animation-delay: 0.72s;\n}\n.report-card:nth-child(19) {\n  animation-delay: 0.76s;\n}\n.report-card:nth-child(20) {\n  animation-delay: 0.8s;\n}\n@keyframes fadeSlideIn {\n  from {\n    opacity: 0;\n    transform: translateY(8px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n.report-header {\n  cursor: pointer;\n  padding: 1rem 1.25rem;\n  transition: background 0.2s ease;\n}\n.report-header:hover {\n  background: var(--ion-color-step-50);\n}\n.report-header-inner {\n  display: flex;\n  align-items: flex-start;\n  gap: 1rem;\n}\n.report-icon-wrapper {\n  width: 48px;\n  height: 48px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 12px;\n  flex-shrink: 0;\n  transition: transform 0.3s ease;\n}\n.report-icon-wrapper ion-icon {\n  font-size: 1.5rem;\n  transition: transform 0.3s ease;\n}\n.report-header:hover .report-icon-wrapper {\n  transform: scale(1.05);\n}\n.report-header:hover .report-icon-wrapper ion-icon {\n  transform: scale(1.1);\n}\n.report-icon-wrapper.status-new {\n  background:\n    linear-gradient(\n      135deg,\n      rgba(59, 130, 246, 0.15) 0%,\n      rgba(59, 130, 246, 0.06) 100%);\n}\n.report-icon-wrapper.status-new ion-icon {\n  color: #3b82f6;\n}\n.report-icon-wrapper.status-acknowledged {\n  background:\n    linear-gradient(\n      135deg,\n      rgba(245, 158, 11, 0.15) 0%,\n      rgba(245, 158, 11, 0.06) 100%);\n}\n.report-icon-wrapper.status-acknowledged ion-icon {\n  color: #f59e0b;\n}\n.report-icon-wrapper.status-investigating {\n  background:\n    linear-gradient(\n      135deg,\n      rgba(139, 92, 246, 0.15) 0%,\n      rgba(139, 92, 246, 0.06) 100%);\n}\n.report-icon-wrapper.status-investigating ion-icon {\n  color: #8b5cf6;\n}\n.report-icon-wrapper.status-resolved {\n  background:\n    linear-gradient(\n      135deg,\n      rgba(16, 185, 129, 0.15) 0%,\n      rgba(16, 185, 129, 0.06) 100%);\n}\n.report-icon-wrapper.status-resolved ion-icon {\n  color: #10b981;\n}\n.report-icon-wrapper.status-closed {\n  background:\n    linear-gradient(\n      135deg,\n      rgba(107, 114, 128, 0.15) 0%,\n      rgba(107, 114, 128, 0.06) 100%);\n}\n.report-icon-wrapper.status-closed ion-icon {\n  color: #6b7280;\n}\n.report-header-content {\n  flex: 1;\n  min-width: 0;\n}\n.report-status-row {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  flex-wrap: wrap;\n  margin-bottom: 8px;\n}\n.status-badge {\n  font-size: 0.7rem;\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n  padding: 4px 10px;\n}\n.category-badge {\n  font-size: 0.7rem;\n  font-weight: 500;\n  padding: 4px 10px;\n}\n.report-time {\n  font-size: 0.8rem;\n  color: var(--ion-color-medium);\n  margin-left: auto;\n}\n.report-description {\n  font-size: 0.95rem;\n  line-height: 1.5;\n  color: var(--ion-text-color);\n  margin: 0 0 10px 0;\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n}\n.report-meta {\n  display: flex;\n  gap: 16px;\n  flex-wrap: wrap;\n}\n.meta-item {\n  display: flex;\n  align-items: center;\n  gap: 5px;\n  font-size: 0.8rem;\n  color: var(--ion-color-medium);\n}\n.meta-item ion-icon {\n  font-size: 1rem;\n  opacity: 0.7;\n}\n.meta-item.version {\n  padding: 2px 8px;\n  background: var(--ion-color-light);\n  border-radius: 4px;\n  font-family: monospace;\n  font-size: 0.75rem;\n}\n.expand-icon {\n  font-size: 1.25rem;\n  color: var(--ion-color-medium);\n  opacity: 0.6;\n  transition: transform 0.2s ease;\n  flex-shrink: 0;\n  margin-top: 4px;\n}\n.report-card.expanded .expand-icon {\n  transform: rotate(180deg);\n}\n.report-details {\n  border-top: 1px solid var(--ion-border-color);\n  padding: 1.25rem;\n  background: var(--ion-color-step-50);\n  animation: expandIn 0.3s ease-out;\n}\n@keyframes expandIn {\n  from {\n    opacity: 0;\n    transform: translateY(-8px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n.detail-section {\n  margin-bottom: 1.5rem;\n}\n.detail-section:last-of-type {\n  margin-bottom: 0;\n}\n.detail-section h4 {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 0.8rem;\n  font-weight: 600;\n  color: var(--ion-color-medium);\n  margin: 0 0 12px 0;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n}\n.detail-section h4 ion-icon {\n  font-size: 1.1rem;\n  opacity: 0.8;\n}\n.screenshot-section .screenshot-img {\n  width: 100%;\n  max-width: 400px;\n  border-radius: 12px;\n  border: 1px solid var(--ion-border-color);\n  box-shadow: 0 2px 12px var(--shadow-color-light);\n}\n.detail-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n  gap: 1rem;\n}\n.detail-item {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  padding: 12px;\n  background: var(--ion-item-background);\n  border-radius: 10px;\n  border: 1px solid var(--ion-border-color);\n}\n.detail-label {\n  font-size: 0.7rem;\n  font-weight: 600;\n  color: var(--ion-color-medium);\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n}\n.detail-value {\n  font-size: 0.9rem;\n  color: var(--ion-text-color);\n  word-break: break-word;\n}\n.detail-value.device-id {\n  font-family: monospace;\n  font-size: 0.8rem;\n}\n.admin-notes {\n  font-size: 0.9rem;\n  color: var(--ion-text-color);\n  background: var(--ion-item-background);\n  padding: 1rem;\n  border-radius: 10px;\n  border: 1px solid var(--ion-border-color);\n  margin: 0;\n  line-height: 1.5;\n}\n.actions-row {\n  display: flex;\n  gap: 0.75rem;\n  flex-wrap: wrap;\n  padding-top: 1rem;\n  margin-top: 1.5rem;\n  border-top: 1px solid var(--ion-border-color);\n}\n.actions-row ion-button {\n  --border-radius: 10px;\n  font-weight: 500;\n}\n.load-more {\n  display: flex;\n  justify-content: center;\n  padding: 1.5rem;\n}\n.load-more ion-button {\n  --border-radius: 12px;\n  --padding-start: 24px;\n  --padding-end: 24px;\n  font-weight: 500;\n}\n@media (max-width: 768px) {\n  .filter-row {\n    flex-direction: column;
6266\n    align-items: stretch;\n    gap: 0.5rem;\n  }\n  .filter-select {\n    max-width: none;\n  }\n  .stats-bar {\n    padding: 0.875rem 1rem;\n  }\n  .stats-icon-wrapper {\n    width: 40px;\n    height: 40px;\n  }\n  .stats-icon-wrapper ion-icon {\n    font-size: 1.25rem;\n  }\n  .report-header {\n    padding: 0.875rem 1rem;\n  }\n  .report-icon-wrapper {\n    width: 42px;\n    height: 42px;\n  }\n  .report-icon-wrapper ion-icon {\n    font-size: 1.25rem;\n  }\n  .report-time {\n    width: 100%;\n    margin-left: 0;\n    margin-top: 4px;\n    order: 1;\n  }\n  .report-meta {\n    gap: 10px;\n  }\n  .meta-item {\n    font-size: 0.75rem;\n  }\n  .detail-grid {\n    grid-template-columns: 1fr;\n  }\n  .report-details {\n    padding: 1rem;\n  }\n  .actions-row {\n    flex-direction: column;\n  }\n  .actions-row ion-button {\n    width: 100%;\n  }\n}\n.tech-section {\n  margin-bottom: 0.75rem;\n  border: 1px solid var(--ion-border-color);\n  border-radius: 10px;\n  overflow: hidden;\n}\n.tech-section:last-child {\n  margin-bottom: 0;\n}\n.tech-section-header {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 12px;\n  background: var(--ion-item-background);\n  cursor: pointer;\n  font-weight: 600;\n  font-size: 0.8rem;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n  color: var(--ion-color-medium);\n  transition: background 0.2s ease;\n}\n.tech-section-header:hover {\n  background: var(--ion-color-step-50);\n}\n.tech-section-header ion-icon:first-child {\n  font-size: 1.1rem;\n  opacity: 0.8;\n}\n.tech-section-header ion-icon:last-child {\n  margin-left: auto;\n  font-size: 1rem;\n  opacity: 0.6;\n}\n.tech-section-content {\n  padding: 12px;\n  background: var(--ion-color-step-50);\n  animation: expandIn 0.2s ease-out;\n}\n.beacon-table-wrapper {\n  overflow-x: auto;\n  margin-top: 12px;\n  border-radius: 8px;\n  border: 1px solid var(--ion-border-color);\n}\n.beacon-table {\n  width: 100%;\n  font-size: 0.8rem;\n  border-collapse: collapse;\n  min-width: 500px;\n}\n.beacon-table th,\n.beacon-table td {\n  padding: 8px 12px;\n  text-align: left;\n  white-space: nowrap;\n}\n.beacon-table th {\n  background: var(--ion-color-step-100);\n  font-weight: 600;\n  text-transform: uppercase;\n  font-size: 0.7rem;\n  color: var(--ion-color-medium);\n  letter-spacing: 0.03em;\n}\n.beacon-table td {\n  border-bottom: 1px solid var(--ion-border-color);\n  background: var(--ion-item-background);\n}\n.beacon-table tr:last-child td {\n  border-bottom: none;\n}\n.beacon-table .monospace {\n  font-family: monospace;\n  font-size: 0.75rem;\n}\n.beacon-table .beacon-name {\n  font-weight: 500;\n  color: var(--ion-text-color);\n}\n.bool-indicator {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  font-size: 0.85rem;\n}\n.bool-indicator ion-icon {\n  font-size: 1rem;\n}\n.bool-indicator.true {\n  color: var(--ion-color-success);\n}\n.bool-indicator.false {\n  color: var(--ion-color-medium);\n}\n.source-badge {\n  display: inline-block;\n  padding: 2px 8px;\n  border-radius: 4px;\n  font-size: 0.75rem;\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n}\n.source-badge.beacon {\n  background: rgba(59, 130, 246, 0.15);\n  color: #3b82f6;\n}\n.source-badge.gps {\n  background: rgba(16, 185, 129, 0.15);\n  color: #10b981;\n}\n.source-badge.none {\n  background: var(--ion-color-light);\n  color: var(--ion-color-medium);\n}\n@media (prefers-color-scheme: dark) {\n  .stats-bar,\n  .report-card {\n    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);\n  }\n  .report-card.expanded {\n    box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4);\n  }\n  .report-details {\n    background: var(--ion-color-step-100);\n  }\n  .detail-item {\n    background: var(--ion-background-color);\n  }\n  .tech-section-content {\n    background: var(--ion-color-step-100);\n  }\n  .beacon-table td {\n    background: var(--ion-background-color);\n  }\n  .beacon-table th {\n    background: var(--ion-color-step-150);\n  }\n}\n"] }]
6267  }], () => [{ type: BugReportService }, { type: ApiUrlService }, { type: AlertController }, { type: LoadingController }, { type: ToastController }, { type: TranslateService }, { type: UserCampusService }, { type: ActivatedRoute }], null);
6268})();
6269(() => {
6270  (typeof ngDevMode === "undefined" || ngDevMode) && \u0275setClassDebugInfo(BugReportsPage, { className: "BugReportsPage", filePath: "src/app/pages/admin/bug-reports/bug-reports.page.ts", lineNumber: 82 });
6271})();
6272export {
6273  BugReportsPage
6274};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.