diff --git a/HISTORY.md b/HISTORY.md index 0747e683..4f2240d6 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,594 @@ # History +## [0.81.0] - 2026-09-05 + +CV610 gains PQTools `.bin` import and export, so the whole ISP parameter image +can be moved at once instead of one `/api/v1/iq` knob at a time. +`contract_version` moves to **0.29.0** — one new endpoint, and `isp.sensorBin` +flips from unsupported to live on this backend. + +- **`isp.sensorBin` is honoured on CV610**, applied live and at cold boot + through the vendor `libbin.so`. The call contract was recovered from the + stripped blob; the package we have ships the library but not `ot_pq_bin.h`, + and the older `HI_PQ_BIN` API on Hi3516CV100 is a different shape whose error + codes do not apply. A file is `[ISP image of OT_PQ_GetISPDataTotalLen() + bytes][OTPQNRX 3DNR section]` — asking the library for that length is also + the version check. +- **`GET /api/v1/iq/export_bin`** serializes the live ISP back out to + `/tmp/isp_export.bin` and answers `{"path":…,"bytes":N}`. The destination is + fixed because the endpoint is unauthenticated. 501 on Star6E/Maruko, which + round-trip IQ as JSON instead; advertised as `routes.iq_export_bin`. +- **A `.bin` is locked to the chip register map and the SDK ISP version, not + to the sensor.** Import validates an address/size walk against what the + running chip's ISP reports and carries no sensor identity. Device-verified on + a Hi3516CV610 + IMX662 bench: a tune built for an os02h10 imported cleanly, + moved 39 of the 102 fields `/api/v1/iq` reads back across ten ISP groups, and + turned the picture red — which is the expected outcome, since a foreign tune + brings its own CCM, AWB, black level and noise calibration. +- **Round trip is exact.** Importing our own exported file restored an + identical read-back. A live import and a cold-boot import of the same file + produce read-backs that differ in **0 of 102 fields**, so the running ISP + thread does not re-assert over an imported image. +- **The cold-boot order is load-bearing**: the image lands before + `isp.gainMax` / `isp.shutterMaxUs`, because a `.bin` carries an AE + ext-register record of its own and would otherwise overwrite the config's + ceilings on every boot while `/api/v1/get` kept reporting them. A successful + import also drops `cv610_iq.c`'s cached cold-boot AE ceilings, which would + otherwise write pre-import values back on the next `isp.gainMax=0`. +- **A `.bin` is integrity-checked and cannot be edited or spliced in place** — + one flipped byte returns `0xcb000005`. Both truncation classes are rejected: + a file shorter than the ISP image by our own gate, naming both numbers, and a + headed-but-truncated 3DNR section by a length check against + `OT_PQ_GetStructParamLen` (the library does not bound that read itself, and + would otherwise push uninitialised heap into the 3DNR registers). +- `iq-profiles/cv610-bin/imx662.bin` vendors an export of the reference bench's + cold-boot state as a restore point — not a measured tune; nobody has run + PQTools against this sensor yet. `make stage SOC_BUILD=cv610` ships it in + `isp-bins/`. +- Requires `libbin.so` on the craft (`/usr/lib`); without it the import warns + and no-ops, and the craft still boots. + +## [0.80.0] - 2026-08-30 + +A sustained bitrate overrun is now reported instead of being silent, and the +`roiQp` bound gets the caveat 0.79.0 shipped without. `contract_version` stays +**0.28.0** — no field, endpoint or payload changes. + +- **The ±20 bound in 0.79.0 is calibrated for the DEFAULT QP ceiling, and + `video0.maxQp` moves that ceiling.** `roiQp` is a relative delta, so CBR + raises the base QP ~1:1 to pay for it and pins once + `base_qp + |roiQp|` passes the ceiling. Measured on a CV610 bench at a fixed + `roiQp -20` — a value 0.79.0 calls safe — against a 9264 kbps target: + + | `video0.maxQp` | frame QP | delivered | vs target | + |---|---|---|---| + | default | 44.9 (44-47) | 9502 | 1.0x | + | 45 | 45.0 (36-45) | 12528 | 1.4x | + | 40 | **40.0 (40-40)** | 53493 | **5.8x** | + | 35 | **35.0 (35-35)** | 111085 | **12.0x** | + + So an operator who lowers `maxQp` to control bitrate silently re-enters the + failure 0.79.0 closed. Documented in the field table and the backend matrix. + +- **Star6E's default ceiling is 48, not 51** — `MaxQp 48 MinQp 12` from + `/proc/mi_modules/mi_venc/mi_venc0`. It therefore has three fewer QP of + margin than CV610 at the same `roiQp`. `MinQp 12` may also be why Star6E + never reproduced the collapse: if the post-ROI QP is clamped into + `[MinQp, MaxQp]` the band cannot starve the controller. Not tested. + +- **`pipeline_common_rate_watch()` reports a sustained overrun.** Two + consecutive 2 s windows delivering >=150% of the configured target log once, + naming `roiQp` and the ceiling when ROI is on. It clears below 120% and can + arm again. + +- **It watches the consequence, not the cause, and that is deliberate.** The + frame QP that explains the failure is CV610-only — SigmaStar fills only + `refType` in its stream info (0.79.0 HISTORY). Frame size is available on + every backend, and the collapse is far easier to see in the delivered rate + than in the QP anyway: 1.9x-39x, sustained, versus a controller reading a + number near its ceiling. + +- **Thresholds are compiled in, not configurable.** The measurement left no + room to tune: normal operation ran 0.96-1.06x of target across every arm, the + worst benign scene transient reached 1.43x for a single window, and a real + collapse ran 1.9x-39x and did not decay. Two windows is what separates the + transient from the failure. + +## [0.79.0] - 2026-08-30 + +`fpv.roiQp` is bounded to **±20**, down from ±30. `contract_version` **0.27.0 +-> 0.28.0** — this is a *narrowing*, not an addition: a client sending ±21..±30 +now gets 400 where it previously got 200. + +- **Past ±20 the delta stops being honoured, at both ends.** `roiQp` is a + RELATIVE delta and H.265 caps QP at 51. Positive is the benign end and merely + truncates: at `+30` the frame's base QP sat at 21.5, so the region wanted 51.5 + and got 51. + +- **Negative is the expensive end, and it was a real defect.** CBR pays for the + ROI discount by raising the frame's base QP roughly 1:1 with `|roiQp|`. Once + `base_qp + |roiQp|` passes 51 the rate controller saturates — every frame at + `qp 51/51/51`, zero variance, no authority left — while the ROI band still + encodes at `51 - |roiQp|`, which is expensive. Measured on a CV610 bench, + 720p60, via the sidecar's per-frame `frame_size_bytes` and `qp`: + + | target kbps | roiQp | base QP | delivered | vs target | + |---|---|---|---|---| + | 2829 | 0 | 25.4 | 2849 | 1.01x | + | 2829 | -20 | 45.1 | 2802 | 0.99x | + | 2829 | -25 | 49.9 (max 51) | 2991 | 1.06x | + | 2829 | **-30** | **51/51/51** | 16976 | **6.0x** | + | 9000 | -20 | 42.5 | 8888 | 0.99x | + | 9000 | **-30** | **51/51/51** | 17300 | **1.9x** | + | 1200 | -15 | 42.4 (max 51) | 1186 | 0.99x | + + The rule `base_qp + |roiQp| > 51` predicts all three targets. **The QP column + is the instrument** — delivered rate alone cannot see this, because below the + cliff CBR absorbs the whole delta and the total does not move. + +- **The band width does not move the cliff, only its severity.** At `roiQp -30`, + `roiCenter` 0.6 / 0.4 / 0.2 all pinned at qp 51 and delivered 17661 / 12520 / + 6977 kbps. Base QP rises by the full delta however narrow the band is, so + there is nothing to bound on that axis instead. + +- **A config file is clamped, not rejected.** `load_fpv()` clamps at parse time, + so a craft already carrying `-30` still boots and lands on `-20` — the fix + applying itself. Only `/api/v1/set` rejects, so an operator typing `-30` is + told rather than reading back a value they did not write. + +- Shipped default `fpv.roiQp` **-25 -> -20**, so the default sits inside the + range it documents (`venc_config.c`, `config/waybeam.default.json`, + `config/waybeam.default.maruko.json`). + +- **NOT reproduced on Star6E.** 1080p60 held its target at `roiQp` 0/-15/-25/-30, + both at its configured 19092 kbps and forced down to 1500. Its sidecar reports + `qp=0`, so its rate controller could not be watched directly — that is + unreproduced, not immune. The bound applies on all three backends anyway, + because the QP ceiling it derives from is an H.265 limit rather than a vendor + one. + +## [0.78.0] - 2026-08-30 + +The two portable AE ceilings reach the CV610 ISP. `contract_version` **0.26.0 +-> 0.27.0**: `isp.gain_max` and `isp.shutter_max_us` flip from +`supported:false` to `supported:true` on that backend. Both were already +`MUT_LIVE` in the shared table, so nothing about mutability changes. + +- **They map with no unit conversion, which is the only reason they are wired + at all.** `isp.shutter_max_us` -> `exposure.auto.exp_time_max`, documented + "sensor exposure time (unit: us)"; `isp.gain_max` -> + `exposure.auto.a_gain_max`, documented "Format:22.10 ... unit: times, 10bit + precision", i.e. 1024 == 1x, which is the same scale the SigmaStar + supervisory AE uses (`maruko_cus3a.c`'s `AE_GAIN_MIN 1024`). The live board + confirms the gain format independently of the header: `sys_gain_max` 1630616 + == `a_gain_max` 407654 x `ispd_gain_max` 4096 / 1024. + +- **Analog gain, not system gain.** `sys_gain_range` caps the product of + analog, sensor-digital and ISP-digital gain; the portable name means the + SENSOR's ceiling on every other backend. Mapping it to the product would + make the same number mean something different here. + +- **Measured, not assumed.** On a CV610 bench (sc4336p, `ave_lum` 43), capping + `shutterMaxUs` to 4000 pulled the applied `exp_time` from 16560 to exactly + 4000 us and the AE raised `a_gain` 1497 -> 6611 to hold the same luma. + Capping `gainMax` to 2048 clamped the applied `a_gain` to 2043 while the ISP + took up the slack in DIGITAL gain (`isp_d_gain` 1024 -> 1948) — which is also + what shows the field is the analog ceiling rather than the system one. + Readings come from `/api/v1/awb`, which reports the AE's own output, so this + is the loop moving rather than a value reading back. + +- **`0` restores the plugin default instead of sticking.** `0` means "use the + sensor plugin's default" on every backend. The default is snapshotted before + the first write of ours lands, so clearing a ceiling puts 873800 / 407654 + back. Without that snapshot, setting a ceiling and then clearing it would + have left the ISP on the last non-zero value forever while the config read + `0` — a one-way door, and the exact shape of bug this milestone keeps + finding. + +- **Applied at cold boot, not only on a live write.** The ISP is seeded by the + sensor plugin, which has never seen the config file, so a value already in + the file would otherwise never be programmed. Verified: a restart with + 6000/8192 in the file came up honouring both, `exp_time` 6000 and `a_gain` + 4220. + +- **`isp.gain_min`, `isp.shutter_min_us`, `isp.awb_mode` and `isp.awb_ct` stay + unsupported and still 501.** Neither pair was measured in this slice. For + the AWB pair that is a two-call flow, not a missing capability: `ct_manual` + means "pin white balance to a colour temperature", and where SigmaStar has + one call (`MI_ISP_AWB_SetCTMwbAttr(ct)`) this SDK has + `ss_mpi_isp_cal_gain_by_temp()` — declared in `ss_mpi_awb.h` and present in + `libss_mpi_awb.so` — which converts Kelvin to r/gr/gb/b gains against the + *current* `ot_isp_wb_attr`, after which those gains go back through + `set_wb_attr` with `op_type` manual. The result depends on the sensor's AWB + calibration, so it needs the same device measurement every other entry in + the allowlist had to clear. Wiring `awbMode` while ignoring `awbCt` would + meanwhile ship a name that reads back fine and means something different per + backend. Manual white balance on CV610 is reachable today, under its own + name, through `/api/v1/iq`'s `wb` group. + + An earlier draft of this entry claimed the ISP had "no Kelvin input" and + that `ss_mpi_awb.h` exported "only register/unregister". Both were wrong — + that header exports 14 functions, and a grep pattern anchored on + `ss_mpi_awb` hid every `ss_mpi_isp_*` symbol in it. + +- Docs: the backend support matrix said `/api/v1/awb` was **501** on CV610. + It has not been since `cv610_awb_query()` landed, and it is the instrument + this change was verified with, so the row is corrected here. + +## [0.77.1] - 2026-08-30 + +Closes the audio gap 0.77.0 shipped with. `contract_version` stays **0.26.0** — +no field, endpoint or payload changes, only where the audio side channel points +after a live retarget. + +- **A live `outgoing.server` change moved video and left audio behind.** The + Opus destination is derived from the video URI — the peer host for `udp://`, + loopback for the local transports — and that derivation ran once, at + `cv610_audio_start()`. So a retarget sent video to the new receiver while + audio kept going to the old one, silently, because nothing in the audio path + knows the video URI changed. `cv610_apply_server()` now calls + `cv610_audio_apply_server()`, which re-derives and repoints. + +- **The derivation is now written once.** `cv610_audio_derive_output()` is + shared by the start path and the retarget, so the mapping cannot drift + between them — which is the actual failure mode for a rule that has to be + applied in two places. + +- **Same seqlock as the video path.** The audio transport fields are read by + the capture thread in `cv610_audio_write()` and would be rewritten by the + httpd thread, so they are seqlock-protected and the capture thread snapshots + them once per encoded frame. Every packet of one Opus access unit therefore + reaches the same destination. + +- Not fatal on failure: the video socket has already moved by that point, and + returning an error would send `venc_api` into a rollback that re-enters the + function. A craft with video retargeted and a logged audio failure is better + than one where the rollback leaves both half-applied. + +**Star6E and Maruko do NOT have this gap** — corrected 2026-08-30 after +checking, having first claimed they did. Their audio output holds a *pointer* +to the live video output rather than a copy, and resolves the destination at +send time through a cache keyed on the video output's `transport_gen` +(`star6e_output.c` `resolve_cached_audio_target()`, `maruko_audio.c:61-85`). A +retarget bumps that generation, which invalidates the cache, so audio +re-resolves to the new destination on its own. Device-confirmed on a Star6E +craft running the *released* 0.76.0 binary with no fix applied: a live +`udp://:5700` -> `udp://:5800` retarget moved video (PT=97, ~1750/s) and audio +(PT=98, ~50/s) together in the same second, PID unchanged. + +CV610 differed because `cv610_audio.c` COPIED the resolved destination into its +own state at start. That is the whole bug, and it is CV610-only. + +## [0.77.0] - 2026-08-30 + +Live output retarget reaches CV610. `contract_version` 0.25.0 -> **0.26.0** +(additive; two per-backend mutability flags move restart_required -> live). + +- **`outgoing.server` and `outgoing.enabled` were restart-only on CV610** — + honestly advertised, because the URI was parsed once in `cv610_prepare()` and + `cv610_output_start()` ran once from `cv610_init()`. Retargeting a craft meant + a respawn. They are now backed by `cv610_apply_server()` and + `cv610_apply_output_enabled()`. + + **The callbacks landed before the mutability widened**, which is an ordering + requirement rather than a preference: `live_group_supported_for_cfg()` gates + `LIVE_GROUP_OUTGOING` on those callbacks existing, so removing the entries + from `cv610_field_is_restart_only()` first would have advertised `live` in + `/api/v1/capabilities` while every write was refused. + +- **The real work was thread safety, not the two callbacks.** `cv610_output_write()` + read `socket_handle` / `destination` / `destination_len` / `connected_udp` + straight off the context on the producer thread, while a live apply rewrites + them from the httpd thread — a torn sockaddr, or a send on a closed fd. Both + SigmaStar backends already guard this with an even/odd `transport_gen` + seqlock; CV610 now does the same, snapshotting once per frame so every + datagram of one access unit goes to the same destination. Splitting an access + unit across two receivers leaves neither able to decode it. + + Worth knowing for anyone reasoning about the window: `output_socket_configure()` + **reuses the existing socket** when the transport type is unchanged, so a + `udp://a` -> `udp://b` retarget never churns the fd at all — it rewrites the + destination. Only a `udp` <-> `unix` switch closes and reopens. + +- **Socket transports switch live; ring transports are RESTART-CLASS, not + refused.** The ring is created once at start, so `shm://` / `frame-shm://` + genuinely cannot be switched in place. Both SigmaStar backends refuse such a + write outright — CV610 deliberately does not, because refusing would have + REGRESSED this backend: `outgoing.server` was restart-required here until + now, so writing `frame-shm://...` persisted and took effect on the next boot. + A hard refusal would have made the fleet's normal production transport + unreachable through the API and left hand-editing `/etc/waybeam.json` as the + only way to provision a craft. Instead the value is committed, + `venc_api_request_reinit()` is called, and the response carries + `reinit_pending` so the caller knows this one is not live. + +- **A live apply that asks for a respawn now says so.** `/api/v1/set` on a + live-class field answered a flat `ok` even when the backend's apply had + requested a reinit. It now reports `reinit_pending`, scoped to a false->true + transition across that single apply — `g_reinit` is a latch the runtime + consumes on its own schedule, so reading it absolutely made an unrelated live + set claim a respawn that belonged to an earlier request. + +- **Review fixes folded in before merge**, each a real defect this change + introduced: the applied-destination no-op guard now runs *before* the ring + branch (an identical re-POST of the running `frame-shm://` URI was latching a + reinit and respawning the craft, so every idempotent re-apply from the ground + cost a video outage); a live apply that requests a respawn now forces the + config to disk, because `/api/v1/live/set` passes `persist=0` and the respawn + reloads from `/etc/waybeam.json`, silently discarding the write; the RTP + session is seeded *before* the `outgoing.enabled` bail, or a craft booted + disabled and enabled over HTTP sent every packet with `ssrc 0` and a timestamp + frozen at 0 (`frame_ticks` was 0 too); the batch response reports + `reinit_pending` like the single one; a failed `output_socket_configure()` + clears `applied_server`, because it closes the socket even on the fd-reuse + path and the stale record made the rollback a silent no-op that left the craft + mute until restart; and the GDR counter plus the ring low-water gauge keep + advancing while output is disabled, since both describe the encoder and the + ring rather than the transmission. + +- **Known gap, not fixed here:** the Opus side-channel destination is derived + from the video URI once at start (`cv610_audio.c`), so a live retarget moves + video and leaves audio pointed at the old host. Fixed in 0.77.1. + (This bullet originally added "Star6E has the same gap" — **that was wrong**, + see the 0.77.1 entry. Both SigmaStar backends resolve the audio destination + at send time against the live video output, so they already follow.) + +- **One deliberate divergence from Star6E.** Star6E also drops the encoder to + 5 fps while the output is disabled, so it is not burning bitrate on frames + nobody receives. CV610 cannot: `video0.fps` is restart-only there (it + reprograms the MIPI raw_bit and the RTP clock), so there is no live rate to + idle to. A disable gates the send on both transports and the encoder keeps + running at its configured rate. + +## [0.76.0] - 2026-08-30 + +Centre-priority ROI reaches CV610, and stops being skipped at boot on Maruko. +`contract_version` 0.24.0 -> **0.25.0** (additive; four per-backend `supported` +flags change). + +- **`fpv.roi*` had no CV610 implementation at all.** No `apply_roi_qp` in the + backend callback table and no cold-boot apply, so every CV610 craft carried an + `fpv` block in `/etc/waybeam.json` that nothing on the board read. The write + path was honest about it (`/api/v1/capabilities` reported `supported:false` + and `/api/v1/set` answered `501`), but `/api/v1/get` returned the stored value + and the config file kept round-tripping it, so a craft could sit for months + with `roiQp:-15` configured and no region ever programmed. + + `cv610_apply_roi_qp()` now programs the bands through + `ss_mpi_venc_set_roi_attr()`. `ot_venc_roi_attr` is field-for-field + `MI_VENC_RoiCfg_t`, and the part accepts a wider delta than the shared + +/-30 clamp, so no per-backend range was needed. Geometry is read from the + channel attr rather than a cached width: it is what the encoder is actually + running, and the get doubles as the "channel exists" guard. + +- **Maruko never applied ROI on a cold boot.** `fpv.roi*` are `MUT_LIVE`, and + only the live path ever called `maruko_apply_roi_qp()`. Star6E has always + applied it in `star6e_runtime_apply_startup_controls()`; Maruko applied + `qp_delta` and `qp_bounds` there and not ROI. Witnessed on the bench: a craft + booting with `roiEnabled:true, roiQp:-8` in its file logged the qpDelta apply + and **no ROI line at all**, then logged the band immediately on one live set. + Every craft that configured ROI in its file was flying without it. + +- **The band geometry is now computed once.** `compute_horizontal_roi()` was + byte-identical in `star6e_controls.c` and `maruko_controls.c` down to the + 32-px alignment; CV610 would have made a third copy. The rectangle and the + QP taper move to `pipeline_common_roi_band()`, and each backend copies the + result into its own SDK struct. + +- **ROI is measured, not assumed.** Issue #259 is a QP control on these same + SigmaStar parts that returns success, logs as applied, reads back clean and + never moves the bitstream, so an SDK return code is not evidence. Maruko, + 1280x720@30 CBR 5754 kbps, `roiSteps:1 roiCenter:0.3` (a 384-px band at + x=448), decoded and profiled as median Laplacian variance per 64-px column: + + | column | `roiQp:-30` | `roiQp:+30` | + |---|---|---| + | 384-448 (outside) | 54.5 | 640.1 | + | 448-512 (inside) | 755.7 | 46.9 | + | 768-832 (inside) | 854.0 | 6.3 | + | 832-896 (outside) | 34.7 | 792.7 | + + The step lands exactly on the programmed rect edges: 13.9x across x=448 and + 24.6x across x=832 in the `-30` arm, reversing in the `+30` arm (13.6x down at + the left edge, 126x up at the right). The repeatability figure is a different + aggregation and is named here so it can be checked: median Laplacian variance + over the **whole band** (x=448..832), which came out 1739 then 1854 across two + runs of the `-30` arm -- 6.6% apart -- against 94.8 in the `+30` arm, an 18x + swing. CV610 was measured the same way on its own silicon (the SDK call + differs, so Maruko's result does not carry): whole-band 67.0 / 9.1 / 61.6 for + `-30` / `+30` / repeat, a 7.4x swing against an 8.8% control. Whatever #259 + is, it does not generalise to ROI on either part. + +- **The shipped ROI defaults now agree with themselves.** They were + `roiEnabled:true, roiQp:0` — which reads as "ROI is on" while `apply_roi_qp()` + clears every region, because a zero delta is not a region worth programming. + Nothing was ignored, but the flag and the log disagreed, and that is the first + thing an operator sees. They ship **`roiEnabled:false, roiQp:-25`**: off, but + carrying a delta that bites the moment it is switched on. Existing crafts are + unaffected — their own `/etc/waybeam.json` values win; this changes the + compiled defaults, `config/waybeam.default*.json` and `/api/v1/defaults`. + +- **The disabled log line names its cause.** `> ROI disabled (all regions + cleared)` covered three different states. It now reads + `> ROI disabled (roiEnabled=false), all regions cleared` or + `> ROI disabled (roiQp=0, no delta to apply), all regions cleared`, on all + three backends. + +## [0.75.0] - 2026-08-30 + +Sensor orientation reaches CV610. `contract_version` 0.23.0 -> **0.24.0** +(additive; two per-backend `supported` flags change). + +- **`image.mirror` / `image.flip` were hardcoded `TD_FALSE`** on the CV610 VI + channel attribute (`src/cv610_pipeline.c`), and absent from the backend's + advertised field list. An inverted lens mount had no software fix on that + board: a config file could carry the values and the picture never moved, + while `/api/v1/set` answered `501 not_implemented`. + + They are now applied at the **sensor**, through the plugin vtable's + `pfn_mirror_flip`, which is where both SigmaStar backends already apply + orientation (`MI_SNR_SetOrien`). Same place, same meaning, so a shared craft + config reads the same on all three boards and the encoder is never asked to + do geometry. The VI channel attribute stays `TD_FALSE` and now says why. + +- **The Bayer start phase does NOT move on IMX662, and that is measured.** The + sensor driver carries a "flipping changes the Bayer start phase — VERIFY on + hardware" note, and the textbook answer is one XOR per axis into + `ot_isp_bayer_format`. On this sensor it is wrong: the reverse shifts the + readout window with the direction, so the phase the ISP sees is unchanged. + Bench A/B with `mirror` on, same scene, same binary but for that one line — + with the XOR, mean RGB went 106/98/141 -> **163/33/195**, green collapsing + because the ISP was demosaicing green sites as red and blue; without it, + 105/96/145, which is the unmirrored frame's colour. Geometry was right in + both arms, so the failure presents as a white-balance fault rather than an + orientation one. All three reachable states were then checked for colour on + the shipped path — mirror 106/97/144, flip 106/97/145, rotate-180 + 106/97/144, against a 106/98/141 baseline — so the result is not generalised + from the mirror arm alone. The driver's VERIFY note can now be closed. + +- Orientation is programmed immediately after `isp_setup()`, and the gate is + narrower than "once streaming": the plugin's i2c file descriptor is opened by + `imx662_init()` as `pfn_cmos_sns_init` from inside `ss_mpi_isp_init()`, + synchronously on the calling thread. Before that the driver's writes return + `TD_SUCCESS` against a closed fd and do nothing. Deliberately **before** the + ISP thread starts: applied after, the first frames and the first AE/AWB + statistics are gathered in the old orientation and the readout then flips + under a converging 3A loop. + +- It is written **unconditionally, including the disable**, matching + `MI_SNR_SetOrien` on both SigmaStar backends and the rule `vpss_setup()` + already states about the crop — an external sensor chip holds whatever it was + last given, more stubbornly than any MPP group. The SoC's MIPI reset happens + to clear `0x3020`/`0x3021` on this board, but that is board wiring, not a + property of the sensor. + +- The log says **"requested"**, not "ok". `pfn_mirror_flip` returns `td_void`, + the driver casts both register writes to `(td_void)`, and + `imx662_write_register()` returns `TD_SUCCESS` even against a closed i2c fd — + there is no success to report at any of the three layers. Claiming one would + reproduce the exact failure this change exists to abolish: an orientation that + silently did nothing, with a log line asserting otherwise. + +- **`image.rotate` stays unsupported on CV610**, and the first draft of this + change had it the other way round. The decomposition it relies on — + `venc_config`'s `load_image()` turning `rotate: 180` into `mirror + flip` — + runs on a **file parse and nowhere else**, so a value arriving through + `/api/v1/set` is never decomposed and never read. Advertising it was measured + on `.181` to turn a clean `501` into: accept `90`, persist `90` to the config + file, raise `reinit_pending`, restart the encoder, then read back `0` once + `load_image()` coerces it — leaving the file and the running config + permanently disagreeing. A config file carrying `rotate: 180` still works; + the field reports unsupported because nothing reads *rotate*. + +## [0.74.0] - 2026-08-30 + +The RTP sidecar reaches CV610. `contract_version` 0.22.0 -> **0.23.0** +(additive; one per-backend `supported` flag changes). + +- **`src/rtp_sidecar.c` was never compiled into the CV610 binary.** It sits in + `HELPER_SRC` and in the host test suite, but not in `CV610_SRC`, so a CV610 + craft emitted no per-frame metadata at all while `outgoing.sidecarPort` was + parsed, range-validated and persisted like any other field. Nothing errored; + the port simply accepted a value and did nothing. + + The cost was downstream and silent: the ground station's attitude consumer + takes the sidecar ATTITUDE trailer as its only input and, on a board with no + flight controller, has no MSP fallback either — so it was compiled out of the + CV610 build entirely, as was the link-log probe that binds through + `MSG_SUBSCRIBE`. The ground pipeline-stats consumer had no clock-sync or + end-to-end latency source for such a craft, and `tools/rtp_timing_probe` had + nothing to read, which is why CV610's VPSS latency has stayed unquantified — + the instrument was missing, not the bench time. + + CV610 now emits the same FRAME the SigmaStar backends do, so every existing + consumer and probe works against it unchanged. No wire change. + +- **What the CV610 trailers carry.** ENC_INFO reports `frame_size_bytes`, + `frame_type`, `qp` and `frames_since_idr`. (`idr_inserted` was also set here + originally; 0.81.0 leaves it 0, because the field means "the controller + requested an IDR" and this backend has no such controller — setting it on + every IDR duplicated `frame_type` and misled a consumer that sums it.) `qp` is the + encoder's own `h265_info.start_qp`, exactly what the contract asks for + ("start QP / closest available per-frame QP") and already in hand — the + SVC-T enhance check reads `ref_type` from the same struct. `complexity` and + `scene_change` stay 0 because both come from the shared scene detector, which + this backend does not compile in; `gop_state` stays 0 because it is the + shared GOP controller's enum and CV610 does not run that controller. A zero + meaning "not produced" beats a fabricated value a consumer would trend. + TRANSPORT_INFO carries ring or socket fill, pressure state, drops and + delivery count. **ATTITUDE and DETECT are never appended** — this board has + no IMU and no detector — so a consumer whose only input is the ATTITUDE + trailer still has no source on CV610. + + Device-verified on `.181`: `qp` 31–38 (mean 32.6) across 783 frames, and + `frames_since_idr` climbing under `resilience=racing` (no periodic IDR) then + resetting **4922 → 0** exactly on a `/request/idr`, with that frame typed IDR + at 22321 B against ~2000 B for its neighbours. + +- **`capture_us` is converted from the MPP timebase, not published raw.** The + sidecar contract says `capture_us` is CLOCK_MONOTONIC µs; the encoder's PTS + is on MPP's own clock, measured on `.181` running **~4.63 s ahead** of it. + Publishing the raw PTS put `capture_us` *after* `frame_ready_us` on every + frame, so the probe's encode-duration derivation went negative and printed + `-` — a field that looked populated and could not be trended. + `cv610_capture_us_from_pts()` samples `ss_mpi_sys_get_cur_pts()` against + `wb_monotonic_us()` once, lazily, on the first frame that needs it (MI_SYS + need not be up when the output starts) and applies the offset. While the + epoch is unknown it returns 0 — the contract's "not available" — rather than + a number on the wrong base. Device-verified on `.181`: ordering correct on + 604/604 sampled frames, and capture-to-encode-complete resolves to a stable + **~24.3 ms at 720p100**. + +- **RTP identifiers under `frame-shm://` now match the SigmaStar backends.** + The first cut seeded the RTP session only on the socket path, on the belief + that Star6E skips it for non-RTP transports. That was wrong: + `star6e_output_is_rtp()` tests the *stream mode* (`rtp` vs `compact`, and the + shipped default is `rtp`), not the transport, so a Star6E craft on + `frame-shm://` does seed and does put a non-zero `ssrc`, `rtp_timestamp` and + `seq_first` on the sidecar wire. CV610 was the only backend sending a zero + `ssrc` there, which a consumer keying on "ssrc != 0 means session present" + would read as a different craft state. `cv610_output_start()` now seeds for + every transport; nothing but the sidecar reads `ctx->rtp` off the socket + path. `seq_count` remains 0 on the ring transports on all three backends — + the packetizer never runs, so no sequence numbers are consumed. + +- **`in_pressure` and `pressure_drops` now mean on CV610 what they mean + everywhere else.** `in_pressure` is defined in `include/rtp_sidecar.h` as the + 75/50 **hysteresis** flag, and `pressure_drops` — despite the name, kept for + ABI stability across the v0.9.2 frame-skip rollback — is "frames observed in + pressure", not a drop count on any backend. The first cut published a bare + `fill >= 75` threshold and a hardcoded 0. Both now come from the shared + `venc_observe_pressure()` helper, maintained on the producer thread every + frame so the hysteresis sees every sample, and `/api/v1/transport/status` + reports the same latched values it puts on the wire. + Device-verified on `.181` against a deliberately unconsumed ring: flag + latched, counter advancing 824 over 825 frames, HTTP and wire agreeing. + +- **The sidecar socket is serviced on the idle path, not only alongside a + frame.** The poll sat inside the "a frame was produced" branch, so every + `continue` in the drain loop skipped it. A probe attaching while the encoder + is stalled would have seen a silent port — indistinguishable from a build + with no sidecar compiled in, which is the exact condition this release exists + to remove. It now runs right after `select()`, ahead of every `continue`, + with `errno` saved across it so the `EINTR` test still sees `select`'s value. + +- **The transport observation now has one collector.** + `cv610_collect_transport()` backs both `/api/v1/transport/status` and the + per-frame trailer, so the number an operator reads over HTTP and the number a + probe reads on the wire cannot drift. The drain loop takes the ring reading + once and hands it to both the low-water window and the trailer. **Corrected in + 0.81.0:** this entry originally also claimed the whole thing ran "only once a + probe is actually subscribed", so an unsubscribed craft paid no clock read, + ring load or `SIOCOUTQ` ioctl. The sidecar review work later in this same + release moved the observation out of the subscription gate — it now runs + every frame, which is what the neighbouring bullet in this section describes. + The two statements contradicted each other; this is the one that was stale. + +- **`rtp_sidecar_sender_init()` runs before the `outgoing.enabled` bail**, on + every path, because it is what writes -1 into `fd`. The context arrives memset + to zero and fd 0 is a valid descriptor, so an init placed after an early + return would have left the per-frame gate polling stdin. + ## [0.73.3] - 2026-08-29 Recorder status is now a coherent snapshot instead of an unsynchronised read. diff --git a/Makefile b/Makefile index c344d3ed..50c3f2a9 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,13 @@ CV610_SDK_INC ?= ../openhisilicon CV610_SDK_LIB ?= ../firmware/output/target/usr/lib CV610_CC_SUBMAKE := $(if $(findstring /,$(CV610_CC)),$(abspath $(CV610_CC)),$(CV610_CC)) +# Vendor PQ library, needed for isp.sensorBin and /api/v1/iq/export_bin on +# CV610. It is NOT in this repo: it is a third-party blob whose licensing is +# the vendor's, so `make stage` copies it when the path resolves and says so +# when it does not. A craft without it boots normally; the import warns and +# no-ops. Override with CV610_PQ_LIB=/path/to/libbin.so. +CV610_PQ_LIB ?= ../hisilicon/vendor/pq/libbin.so + OUT_DIR := out/$(SOC_BUILD) OBJ_DIR := $(OUT_DIR)/obj TARGET := $(OUT_DIR)/waybeam @@ -67,6 +74,7 @@ CV610_SRC := src/main.c src/backend_cv610.c src/cv610_runtime.c \ src/cv610_encoder_config.c \ src/cv610_iq.c \ src/cv610_modes.c \ + src/cv610_pq_bin.c \ src/cv610_jpeg.c \ src/cv610_pipeline.c src/cv610_validation.c src/backend.c \ src/venc_config.c src/venc_httpd.c src/venc_api.c src/venc_webui.c \ @@ -76,7 +84,7 @@ CV610_SRC := src/main.c src/backend_cv610.c src/cv610_runtime.c \ src/framing_kalman.c src/attitude_est.c src/debug_osd.c \ src/debug_osd_draw.c lib/cJSON.c \ src/h26x_util.c src/h26x_param_sets.c src/rtp_packetizer.c \ - src/hevc_rtp.c src/rtp_session.c src/output_socket.c \ + src/hevc_rtp.c src/rtp_session.c src/rtp_sidecar.c src/output_socket.c \ src/venc_frame_ring.c src/mdns_wire.c src/mdns_beacon.c \ src/device_id.c src/venc_respawn.c # Image-stabilization framing module (Star6E). STAB=1 (default) compiles it @@ -378,6 +386,17 @@ stage: build qr-decode chmod +x $(OUT_DIR)/load-cv610-online; \ cp -f config/waybeam-cv610-platform.conf \ $(OUT_DIR)/waybeam-cv610.conf; \ + if ls iq-profiles/cv610-bin/*.bin >/dev/null 2>&1; then \ + mkdir -p $(OUT_DIR)/isp-bins; cp -f iq-profiles/cv610-bin/*.bin $(OUT_DIR)/isp-bins/; \ + fi; \ + if [ -f "$(CV610_PQ_LIB)" ]; then \ + mkdir -p $(OUT_DIR)/lib; cp -f "$(CV610_PQ_LIB)" $(OUT_DIR)/lib/libbin.so; \ + echo " stage: libbin.so from $(CV610_PQ_LIB)"; \ + else \ + echo " stage: NOTE no libbin.so at $(CV610_PQ_LIB) -- isp.sensorBin"; \ + echo " and /api/v1/iq/export_bin will no-op on the craft."; \ + echo " Set CV610_PQ_LIB to stage it."; \ + fi; \ fi print-config: @@ -435,7 +454,7 @@ TEST_LIB_SRCS := src/qr_scan.c tools/qr/waybeam_qr_format.c \ tools/qr/quirc/identify.c tools/qr/quirc/version_db.c \ src/backend.c src/venc_config.c src/venc_api.c src/venc_httpd.c src/venc_webui.c src/venc_recordings.c src/sensor_select.c src/venc_ring.c src/venc_frame_ring.c src/file_util.c src/h26x_util.c src/h26x_param_sets.c src/intra_refresh.c src/isp_runtime.c src/maruko_config.c src/maruko_video.c src/maruko_output.c src/codec_config.c src/pipeline_common.c src/rtp_session.c src/sdk_quiet.c src/rtp_packetizer.c src/hevc_rtp.c src/star6e_hevc_rtp.c src/star6e_output.c src/star6e_audio.c src/audio_codec.c src/star6e_video.c src/star6e_recorder.c src/star6e_ts_recorder.c src/ts_mux.c src/venc_rec_writer.c src/rtp_sidecar.c src/stream_metrics.c src/output_socket.c src/timing.c src/idr_rate_limit.c src/debug_osd_draw.c src/venc_jpeg.c src/mdns_wire.c src/mdns_beacon.c src/device_id.c src/framing_kalman.c src/attitude_est.c src/detect_dequant.c src/detect_wire.c src/star6e_vpe_ports.c src/maruko_scl_ports.c lib/cJSON.c -$(TEST_RUNNER): $(TEST_SRCS) $(TEST_LIB_SRCS) tests/test_helpers.h include/backend.h include/h26x_param_sets.h include/hevc_rtp.h include/isp_runtime.h include/maruko_config.h include/pipeline_common.h include/rtp_packetizer.h include/rtp_session.h include/rtp_sidecar.h include/star6e_audio.h include/star6e_hevc_rtp.h include/star6e_output.h include/star6e_recorder.h include/star6e_ts_recorder.h include/ts_mux.h include/audio_ring.h include/star6e_video.h include/stream_metrics.h include/venc_frame_ring.h +$(TEST_RUNNER): $(TEST_SRCS) $(TEST_LIB_SRCS) tests/test_helpers.h include/backend.h include/venc_api.h include/h26x_param_sets.h include/hevc_rtp.h include/isp_runtime.h include/maruko_config.h include/pipeline_common.h include/rtp_packetizer.h include/rtp_session.h include/rtp_sidecar.h include/star6e_audio.h include/star6e_hevc_rtp.h include/star6e_output.h include/star6e_recorder.h include/star6e_ts_recorder.h include/ts_mux.h include/audio_ring.h include/star6e_video.h include/stream_metrics.h include/venc_frame_ring.h $(HOST_CC) $(HOST_CFLAGS) $(TEST_SRCS) $(TEST_LIB_SRCS) -lpthread -ldl -lm -o $@ $(CV610_VALIDATION_TEST): tests/test_cv610_validation.c src/cv610_validation.c \ diff --git a/README.md b/README.md index 50055bb6..a9d31622 100644 --- a/README.md +++ b/README.md @@ -274,7 +274,7 @@ omitted fields keep their compiled-in defaults. "audioPort": 5601, "sidecarPort": 5602 }, "fpv": { - "roiEnabled": true, "roiQp": 0, "roiSteps": 2, + "roiEnabled": false, "roiQp": -20, "roiSteps": 2, "roiCenter": 0.4, "noiseLevel": 0 }, "audio": { @@ -309,7 +309,10 @@ omitted fields keep their compiled-in defaults. userspace cus3a; on Maruko `custom` additionally installs the no-op adaptor + supervisory thread for the CPU win), AE rate, gain ceiling, AWB mode, aspect-preserving crop. -- **`image`** — mirror / flip / rotate. +- **`image`** — mirror / flip / rotate. mirror and flip are applied at the + sensor on all three backends. `rotate` is file-level sugar: `load_image()` + turns `180` into mirror + flip and anything else into 0, on a config parse + only — it is not reachable through `/api/v1/set`. - **`video0`** — rate control, fps, resolution, bitrate, GOP, per-section QP delta. Video codec is hardcoded H.265 (HEVC). Scene-change-triggered IDR (`sceneThreshold`, @@ -388,7 +391,7 @@ curl http://:/api/v1/version ``` ```json -{"ok":true,"data":{"app_version":"0.73.3","backend":"star6e","contract_version":"0.22.0","config_schema_version":"1.0.0"}} +{"ok":true,"data":{"app_version":"0.81.0","backend":"star6e","contract_version":"0.29.0","config_schema_version":"1.0.0"}} ``` #### GET /api/v1/config @@ -621,7 +624,7 @@ load cleanly; the keys are silently ignored. | Field | Type | Mutability | Description | |-------|------|------------|-------------| -| `isp.sensor_bin` | string | live | ISP tuning binary path (empty = auto-detect /etc/sensors/<sensor>.bin) | +| `isp.sensor_bin` | string | live | ISP tuning binary path. On Star6E/Maruko empty auto-detects `/etc/sensors/<sensor>.bin`; on CV610 empty is a no-op (no fallback) and the file is a HiSilicon PQTools `.bin`, not a SigmaStar one. | | `isp.ae_engine` | string | restart | `"sdk"` (default) lets the SDK firmware run AE on Star6E and Maruko. `"custom"` runs userspace cus3a — on Star6E it spins the supervisory AE thread; on Maruko it installs the no-op adaptor + 15 Hz `SetAeParam` thread (~24% sys CPU saving at 120 fps). Alias: `isp.aeEngine`. | | `isp.ae_fps` | uint | restart | Custom 3A processing rate in Hz (default 15) | | `isp.gain_max` | uint | live | AE max ISP gain ceiling (0 = use ISP bin default) | @@ -633,9 +636,9 @@ load cleanly; the keys are silently ignored. | Field | Type | Mutability | Description | |-------|------|------------|-------------| -| `image.mirror` | bool | restart | Horizontal mirror. Applied at the sensor (`MI_SNR_SetOrien`) once at bring-up. Star6E + Maruko. | -| `image.flip` | bool | restart | Vertical flip. Applied at the sensor (`MI_SNR_SetOrien`) once at bring-up. Star6E + Maruko. | -| `image.rotate` | int | restart | Rotation (0, 90, 180, 270) | +| `image.mirror` | bool | restart | Horizontal mirror. Applied at the sensor once at bring-up — `MI_SNR_SetOrien` on Star6E/Maruko, the sensor plugin's `pfn_mirror_flip` on CV610. All three backends **from 0.75.0**. | +| `image.flip` | bool | restart | Vertical flip. Applied at the sensor once at bring-up — `MI_SNR_SetOrien` on Star6E/Maruko, the sensor plugin's `pfn_mirror_flip` on CV610. All three backends **from 0.75.0**. | +| `image.rotate` | int | restart | `180` or `0`. File-level sugar only: `load_image()` turns `180` into `mirror`+`flip` and **anything else into `0`**, on a config parse. Not reachable through `/api/v1/set` — `supported:false` on CV610 for that reason. Star6E + Maruko report it supported because they have no per-backend allowlist. | #### Video @@ -749,7 +752,8 @@ overshoot. | `video0.qp_delta` | yes | yes | **not offered** | | `video0.min_qp` / `max_qp` | yes | yes | yes | | `video0.intra_refresh_qp` | **inert, not offered** | **inert, not offered** | yes | -| `outgoing.sidecar_port` | yes | yes | not implemented | +| `fpv.roi_*` | yes | yes | yes **from 0.76.0** | +| `outgoing.sidecar_port` | yes | yes | yes **from 0.74.0** | `video0.intra_refresh_qp` is advertised on CV610 only. It reaches `MI_VENC_SetIntraRefresh` on Star6E and Maruko as well, and both log it as @@ -1269,7 +1273,7 @@ Notes: | Field | Type | Mutability | Description | |-------|------|------------|-------------| | `outgoing.enabled` | bool | live | Enable/disable streaming output | -| `outgoing.server` | string | live | Destination URI (`udp://ip:port`, `unix://name`, `shm://name`, or `frame-shm://name`) | +| `outgoing.server` | string | live | Destination URI (`udp://ip:port`, `unix://name`, `shm://name`, or `frame-shm://name`). Live on all three backends — **CV610 from 0.77.0**. A `udp://` ↔ `unix://` change takes effect in place. The ring transports are created once at start and cannot move in place: Star6E and Maruko **refuse** such a write, while CV610 **commits it and respawns**, answering `200` with `reinit_pending` (it was restart-required there until 0.77.0, and refusing would have made `frame-shm://` unreachable through the API) | | `outgoing.stream_mode` | string | restart | `"rtp"` or `"compact"` | | `outgoing.max_payload_size` | uint16 | restart | Max UDP payload bytes | | `outgoing.connected_udp` | bool | restart | Connect UDP socket (applies only to `udp://`) | @@ -1334,8 +1338,8 @@ audio track). Settable via the config file or the runtime API | Field | Type | Mutability | Description | |-------|------|------------|-------------| -| `fpv.roi_enabled` | bool | live | Enable horizontal ROI bands | -| `fpv.roi_qp` | int | live | Signed ROI delta QP (-30..30, negative = sharper center) | +| `fpv.roi_enabled` | bool | live | Enable horizontal ROI bands. Ships **off**, paired with a non-zero `roi_qp`, so switching it on has an effect | +| `fpv.roi_qp` | int | live | Signed ROI delta QP (-20..20, negative = sharper center). **`0` clears every region regardless of `roi_enabled`** — a zero delta is not a region worth programming. Ships at `-20`. **The safe magnitude depends on `video0.maxQp`**: the delta is subtracted from the frame QP, so the controller raises the base QP ~1:1 to compensate and pins at the ceiling once `base + |roiQp|` passes it — at `maxQp 40`, even `-20` delivered 5.8x its target. `±20` is calibrated for the *default* ceiling. Range narrowed from `-30..30` **in 0.79.0**: past `±20` the delta exceeds the encoder's QP range, and a large negative value saturates rate control and overruns the bitrate target. All three backends **from 0.76.0** (CV610 had no implementation before it) | | `fpv.roi_steps` | uint16 | live | Number of horizontal bands (1-4) | | `fpv.roi_center` | double | live | Center band width ratio (0.1-0.9) | | `fpv.noise_level` | int | restart | 3DNR noise reduction level | diff --git a/VERSION b/VERSION index 35668c21..9a55e280 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.73.3 +0.81.0 diff --git a/config/waybeam.default.json b/config/waybeam.default.json index 0b7305a6..35fa0635 100644 --- a/config/waybeam.default.json +++ b/config/waybeam.default.json @@ -66,8 +66,8 @@ "bareAlias": true }, "fpv": { - "roiEnabled": true, - "roiQp": 0, + "roiEnabled": false, + "roiQp": -20, "roiSteps": 2, "roiCenter": 0.4, "noiseLevel": 0 diff --git a/config/waybeam.default.maruko.json b/config/waybeam.default.maruko.json index 60fb1c6a..a1fdc305 100644 --- a/config/waybeam.default.maruko.json +++ b/config/waybeam.default.maruko.json @@ -56,8 +56,8 @@ "bareAlias": true }, "fpv": { - "roiEnabled": true, - "roiQp": 0, + "roiEnabled": false, + "roiQp": -20, "roiSteps": 2, "roiCenter": 0.4, "noiseLevel": 0 diff --git a/docs/CV610_BACKEND.md b/docs/CV610_BACKEND.md index aa415546..a2285933 100644 --- a/docs/CV610_BACKEND.md +++ b/docs/CV610_BACKEND.md @@ -72,8 +72,10 @@ verifies the requested mode by reading it back before creating the VI pipe. CV610 has a substantially broader vendor encoder surface than the current backend exposes: nine declared RC families, multiple P/CRR GOP structures, intra refresh, reference prediction, SVC, hierarchical QP, native frame-loss -and super-frame policies, ROI/QP maps, VUI/user data, and slice/low-delay -controls. SSC338Q currently has the broader device-proven Waybeam integration. +and super-frame policies, QP maps, VUI/user data, and slice/low-delay +controls. (Plain delta-QP **ROI is no longer in that list** -- it landed in +0.76.0 as `fpv.roi*`; the QP-map and per-frame-ROI halves of the vendor surface +are still unexposed.) SSC338Q currently has the broader device-proven Waybeam integration. The evidence levels, live-device readback, exact comparison and deliberately deferred controls are documented in diff --git a/documentation/HTTP_API_CONTRACT.md b/documentation/HTTP_API_CONTRACT.md index 4b6fc07a..0d5a06bf 100644 --- a/documentation/HTTP_API_CONTRACT.md +++ b/documentation/HTTP_API_CONTRACT.md @@ -18,7 +18,7 @@ - `read_only` — cannot be changed via API. ## Contract Version -- `contract_version`: `0.22.0` +- `contract_version`: `0.29.0` - `status`: `active` ## Per-Backend Field Support @@ -32,6 +32,16 @@ | `video0.qpDelta` | true | true | **false** | | `video0.minQp` / `maxQp` | true | true | true | | `video0.intraRefreshQp` | **false** | **false** | true | +| `outgoing.sidecarPort` | true | true | true (**from 0.74.0**) | +| `image.mirror` / `image.flip` | true | true | true (**from 0.75.0**) | +| `image.rotate` | true | true | **false** | +| `fpv.roiEnabled` / `roiQp` / `roiSteps` / `roiCenter` | true | true | true (**from 0.25.0**) | +| `isp.gainMax` / `isp.shutterMaxUs` | true | true | true (**from 0.78.0**) | +| `isp.sensorBin` | true | true | true (**from 0.81.0**, PQTools `.bin` via libbin.so) | +| `fpv.roiQp` accepted range | ±20 | ±20 | ±20 (**±30 before 0.79.0**) | +| `video0.maxQp` interacts with `fpv.roiQp` | yes | yes | yes (**measured**) | +| `isp.gainMin` / `isp.shutterMinUs` / `isp.awbMode` / `isp.awbCt` | true | true | **false** | +| `outgoing.server` / `outgoing.enabled` mutability | live | live | **live from 0.26.0** (restart_required before) | `video0.qpDelta` is `false` on CV610 and `video0.intraRefreshQp` is `false` on the SigmaStar backends because in each case the encoder accepts the value and @@ -96,8 +106,8 @@ Response `200`: { "ok": true, "data": { - "app_version": "0.73.3", - "contract_version": "0.22.0", + "app_version": "0.81.0", + "contract_version": "0.29.0", "config_schema_version": "1.0.0", "backend": "star6e" } @@ -124,7 +134,7 @@ Response `200`: "image": { "mirror": false, "flip": false, "rotate": 0 }, "video0": { "rcMode": "cbr", "fps": 90, "size": "auto", "bitrate": 8192, "gopSize": 1.0, "qpDelta": 0, "sceneThreshold": 0, "sceneHoldoff": 2, "sliceCount": 1, "resilience": "off", "intraRefreshQp": 0, "zoomX": 0.5, "zoomY": 0.5, "framing": "off" }, "outgoing": { "enabled": true, "server": "udp://192.168.2.20:5600", "streamMode": "rtp", "maxPayloadSize": 1400, "connectedUdp": false, "allowUnixEncoderStall": false }, - "fpv": { "roiEnabled": true, "roiQp": 0, "roiSteps": 2, "roiCenter": 0.25, "noiseLevel": 0 }, + "fpv": { "roiEnabled": false, "roiQp": -20, "roiSteps": 2, "roiCenter": 0.4, "noiseLevel": 0 }, "record": { "enabled": false, "mode": "off", "dir": "/tmp/sdcard", "format": "ts", "maxSeconds": 300, "maxMB": 500 }, "debug": { "showOsd": false } }, @@ -231,6 +241,7 @@ endpoint just to discover whether it exists: |---|---| | `iq` | `/api/v1/iq` and `/api/v1/iq/set` are serviced (the backend registers **both** `query_iq_info` and `apply_iq_param`). | | `iq_import` | `/api/v1/iq/import` is compiled in (Star6E/Maruko only). | +| `iq_export_bin` | `/api/v1/iq/export_bin` is serviced (the backend registers `export_isp_bin`; CV610 only). | Absent `routes` means an older build: treat every route as possibly present and fall back to calling it. @@ -880,6 +891,46 @@ Response `200`: {"ok":true,"data":{"param":"colortrans.matrix","value":[23,45,9,1005,987,56,56,977,1015]}} ``` +### `GET /api/v1/iq/export_bin` + +**CV610 only** (`501 not_implemented` elsewhere — the SigmaStar backends +round-trip IQ as JSON through `/api/v1/iq` and `/api/v1/iq/import`). + +Serializes the **live** ISP state into a PQTools `.bin` through the vendor +`libbin.so`, at the fixed path `/tmp/isp_export.bin`. The destination is fixed +deliberately: the endpoint is unauthenticated, and a caller-supplied path would +make it a write-anywhere primitive. Copy the file off with `scp` afterwards. + +The written file has the same shape PQTools produces — an ISP parameter image +of exactly `OT_PQ_GetISPDataTotalLen()` bytes followed by an `OTPQNRX` 3DNR +section — so it can be fed back through `isp.sensorBin`. + +The payload is integrity-checked by the vendor library: a `.bin` cannot be +edited or spliced in place (one flipped byte returns `0xcb000005`). Produce +files with PQTools or with this endpoint, and treat them as opaque. + +```bash +curl http:///api/v1/iq/export_bin +scp root@:/tmp/isp_export.bin . +``` + +Response `200`: +```json +{"ok":true,"data":{"path":"/tmp/isp_export.bin","bytes":144774}} +``` + +`bytes` is the length actually written, so a caller can confirm the write +without a second round trip; `path` is a constant and on its own is no evidence +the export happened. The value is `OT_PQ_GetISPDataTotalLen()` plus the 3DNR +section, which is 144774 on the shipping SDK but is queried, not fixed. If the +vendor library cannot supply 3DNR parameters the ISP half is exported alone and +`bytes` is correspondingly smaller. + +The file is created with `O_NOFOLLOW` and rejected unless it is a plain, +single-linked regular file: the path is predictable, `/tmp` is world-writable +and the endpoint is unauthenticated, so a planted symlink must not be able to +redirect the daemon's write. + ### `POST /api/v1/iq/import` Import IQ parameters from a JSON body (output of `GET /api/v1/iq`). @@ -1858,7 +1909,7 @@ Behavior: Endpoints that behave the same on all three backends are omitted. The table compares the two SigmaStar implementations; CV610 differences are called out -in Notes. As of `contract_version: 0.22.0`: +in Notes. As of `contract_version: 0.29.0`: | Feature / Endpoint | Star6E | Maruko | Notes | |---|---|---|---| @@ -1870,8 +1921,11 @@ in Notes. As of `contract_version: 0.22.0`: | `/api/v1/dual/status`, `/dual/idr` | yes | yes | `/dual/status` always 200 (`active:false` when off, `active:true,channel,bitrate,fps,gop` when on). `/dual/idr` returns 200 when active, 404 when not. Maruko HTTP registration landed in 0.10.4 — earlier Maruko builds returned 404 from these even when `record.mode=dual` was running. | | `/api/v1/dual/set` | yes | **501** | Star6E-only: the underlying `MI_VENC_*ChnAttr` write path binds to `i6_venc_chn`, but Maruko's venc library expects `i6c_venc_chn` (different layout). Maruko returns 501 until the call path is ported. | | `/api/v1/iq` and `/api/v1/iq/set` | full (≈45 params) | full (parity in `maruko_iq.c`) | Star6E/Maruko share one IQ table schema. **CV610 also serves these from 0.18.4, in a DIFFERENT shape** — see "CV610 IQ response shape" below. `/api/v1/iq/import` stays Star6E/Maruko-only and 501s on CV610 (advertised as `routes.iq_import:false`). | -| `/api/v1/awb` | live | live | Both backends register `query_awb_info`. CV610: **501**. | +| `/api/v1/iq/export_bin` | **501** | **501** | **CV610-only from 0.81.0** (advertised as `routes.iq_export_bin`). Serializes the live ISP to a PQTools `.bin` through the vendor `libbin.so`, at the fixed path `/tmp/isp_export.bin`. The SigmaStar backends round-trip IQ as JSON instead, so they register no `export_isp_bin` callback. | +| `isp.sensorBin` (`.bin` import) | live, `MI_ISP_*CmdLoadBinFile` | live, same | **CV610 from 0.81.0**, but a DIFFERENT format and library: HiSilicon PQ images via `OT_PQ_BIN_ImportBinData`. The two families are not interchangeable despite the shared field and extension. On CV610 an empty value is a no-op — there is no `/etc/sensors/.bin` fallback. | +| `/api/v1/awb` | live | live | All three backends register `query_awb_info`. CV610 serves `ot_isp_wb_info` plus `ot_isp_exp_info` (the AE's own applied `exp_time`, `a_gain`, `isp_d_gain`, `ave_lum`) — a different payload from the SigmaStar one, and the instrument the `isp.gainMax`/`isp.shutterMaxUs` mapping was verified against. | | `/api/v1/ae` | live + `runtime.active_precrop` | live + `runtime.active_precrop` | Both backends now include `runtime.active_precrop` in the AE response (Maruko parity landed in `0.8.4`). | +| RTP sidecar (`outgoing.sidecarPort`, UDP :5602) | yes | yes | **CV610 from 0.74.0**; before that `src/rtp_sidecar.c` was not compiled into the CV610 binary at all, so the field was accepted, persisted and silently did nothing. CV610 emits the base FRAME plus TRANSPORT_INFO. It has no IMU and no detector, so ATTITUDE and DETECT trailers are never appended; ENC_INFO carries `frame_size_bytes`, `frame_type`, `qp` (the encoder's `h265_info.start_qp`) and `frames_since_idr`; `complexity`, `scene_change` **and `idr_inserted`** stay 0 because the shared scene detector is not compiled in on this backend. **`idr_inserted` is deliberately not produced here** (corrected in 0.81.0, which briefly set it): the field means "the controller *requested* an IDR after this frame", and on the SigmaStar backends the only writer is the scene detector, so there it is disjoint from `frame_type == IDR`. CV610 has no such controller, so setting it on every IDR would duplicate `frame_type` and `FLAG_KEYFRAME` — a ground consumer summing it as "IDR insertions" would read a once-per-GOP static scene as one insertion per second while an identically configured SigmaStar craft reported zero; `gop_state` is 0 on all three backends, as nothing in the tree writes it. **`qp` is CV610-only**: the SigmaStar encoder populates only `refType` in its H.265 stream-info struct — `size`, all eight CU counts, `updAttrCnt` and `startQual` read 0 on the device (dumped on i6 at 0.79.0; the struct offset is correct, since `refType` lands exactly where the header says). Reading `startQual` into the trailer was tried and shipped zeros, so Star6E and Maruko leave `qp` at 0 rather than advertise a value that is always 0. Recovering a per-frame QP there means parsing `slice_qp_delta` out of the slice header. Under `frame-shm://` only `seq_count` is 0 on every backend (the packetizer never runs, so no sequence numbers are consumed); `ssrc`, `rtp_timestamp` and `seq_first` are seeded and non-zero, because the RTP session is gated on the *stream mode* rather than the transport. The trailer carries the ring state. | | `/api/v1/transport/status` | yes | yes | Three distinct field sets by transport: `frame-shm://` (ring fields plus `ringLowWaterSlots`/`otherDrops`), `shm://` (packet-ring fields), and UDP/Unix (socket subset). `badAuDrops` appears on every transport. **CV610** serves the same endpoint but emits no `badAuDrops` (no packet-table validation in its stream path); its `frame-shm` branch does carry `ringLowWaterSlots` and `otherDrops`. | | `/api/v1/idr/stats` | yes | yes | Identical schema; values reflect each backend's IDR rate-limit. | | `video0.codec=h264` | 404 unknown_field | 404 unknown_field | Field retired in 0.10.12; codec is hardcoded H.265 on both backends. | @@ -1880,9 +1934,162 @@ in Notes. As of `contract_version: 0.22.0`: | `detect.model_path` / `model_id` / `conf_thresh` / `nms_iou` | **live** | **live** | Both backends hot-swap the NPU detector on the pipeline thread without respawning video. Star6E uses VPE port 1; Maruko uses SCL port 3 and its drain-while-disable teardown. A model whose reported input geometry disagrees with the configured tap is refused and leaves detection off. | | `detect.net_width` / `net_height` | restart | restart | Tap geometry is fixed when the VPE/SCL detector port is created. | | `video0.min_qp` / `max_qp` | live | live | RC QP bounds, live and from config at startup on all three. **Maruko gained them in 0.73.0**; before that it reported unsupported. **CV610 from 0.18.4** — it sets the P bounds and the I-frame ceiling, but the I-frame floor is not steerable there (`video0.qp_delta` is not offered on CV610; see Per-Backend Field Support). | -| `isp.aeEngine` ("sdk" only) | applied | applied | Unified AE selector landed in 0.10.13. `custom` (userspace AE governor) is RETIRED — Maruko in 0.22.0, Star6E in 0.47.0 — and the value was **removed** in 0.47.0. `sdk` is the only accepted value; any other (e.g. a stale `custom`) warns and falls back to `sdk`. Both backends run the SDK firmware/bin AE for convergence plus a supervisory thread that enforces the `isp.gain*`/`isp.shutter*` limits. | +| `fpv.roi_enabled` / `roi_qp` / `roi_steps` / `roi_center` | live | live | Centre-priority horizontal delta-QP bands. **CV610 from 0.76.0** (`ss_mpi_venc_set_roi_attr`); before that the fields were accepted by a config parse, reported `supported:false` and never reached the encoder. All three backends share one band geometry (`pipeline_common_roi_band`). `roi_qp == 0` clears every region regardless of `roi_enabled` — a zero delta is not a region worth programming — and the disabled log line names which of the two caused it. **`roi_qp` and `video0.max_qp` interact**: the delta is subtracted from the frame QP, so CBR raises the base QP roughly 1:1 to pay for it and pins at the RC ceiling once `base_qp + |roi_qp|` passes it — at which point the target is missed by multiples. The `±20` bound is calibrated for the *default* ceiling; measured on CV610 at a fixed `roiQp -20`, `max_qp` 45/40/35 delivered 1.4x / **5.8x** / **12.0x** of target with the frame QP pinned at the configured ceiling. Star6E's default ceiling is **48**, not 51 (`/proc/mi_modules/mi_venc/mi_venc0`: `MaxQp 48 MinQp 12`), so it has three fewer QP of margin than CV610. Since 0.80.0 a sustained overrun is reported in the log rather than left silent. The shipped pair is `roiEnabled:false, roiQp:-20` (**-25 in 0.76.0-0.78.0**), so the flag reads true only when ROI is really running; it previously shipped `true`/`0`, which read as on while every region was cleared. **Maruko applied it only on a live write until 0.76.0** — a value already in the config file was never programmed at boot. | +| `isp.aeEngine` ("sdk" only) | applied | applied | Unified AE selector landed in 0.10.13. `custom` (userspace AE governor) is RETIRED — Maruko in 0.22.0, Star6E in 0.47.0 — and the value was **removed** in 0.47.0. `sdk` is the only accepted value; any other (e.g. a stale `custom`) warns and falls back to `sdk`. Both backends run the SDK firmware/bin AE for convergence plus a supervisory thread that enforces the `isp.gain*`/`isp.shutter*` limits. CV610 has no such thread and reports `isp.aeEngine` unsupported: its ISP owns AE outright, and the two ceilings it does honour are written straight into `ot_isp_exposure_attr.auto_attr` instead. | ## Change Log (Contract) +- `0.29.0` (additive — CV610 gains PQTools `.bin` import and export): + Adds `GET /api/v1/iq/export_bin`, which writes the live ISP state to a + PQTools `.bin` at the fixed path `/tmp/isp_export.bin` and answers + `{"path":...,"bytes":N}`. CV610-only; the SigmaStar backends register no + `export_isp_bin` callback and return **501**, advertised as the new + `routes.iq_export_bin` capability flag. The destination is fixed rather + than caller-supplied because the endpoint is unauthenticated. + Also flips `isp.sensorBin` from unsupported to **live** on CV610 — the + field, its mutability and its payload are unchanged, only the set of + backends that honour it, so `capabilities.fields[].supported` moves from + `false` to `true` there. Device-verified on a Hi3516CV610 + IMX662 bench: + a tune built for a different sensor imports cleanly (the format is locked + to the chip register map and SDK ISP version, not to the sensor), and an + exported file re-imported restores an identical `/api/v1/iq` read-back. + A `.bin` is integrity-checked by the vendor library and cannot be edited + or spliced in place. +- `0.28.0` (**narrowing** — `fpv.roi_qp` accepted range `[-30, 30]` -> `[-20, 20]`): + a client that sends `±21..±30` now gets **400** where it previously got 200. + `roi_qp` is a *relative* delta and H.265 caps QP at 51, so past ±20 it stops + being honoured at both ends — and the negative end is expensive rather than + merely truncated: CBR pays for the ROI discount by raising the frame's base + QP roughly 1:1 with `|roiQp|`, so once `base + |roiQp|` passes 51 the rate + controller saturates and loses authority. Measured on a CV610 bench at + 720p60: `roiQp -30` pinned every frame at `qp 51/51/51` and delivered + 16976 kbps against a 2829 kbps target (**6.0x**), while `-20` sat at qp 45 + and held 2802. Reproduced at three targets — the cliff is exactly + `base_qp + |roiQp| > 51`. The band width does not move it, only its + severity (at `-30`, `roiCenter` 0.6/0.4/0.2 all pinned at 51 and delivered + 17661/12520/6977 kbps), so there is nothing to bound on that axis instead. + Positive `roiQp` is the benign end but truncates just as quietly: at `+30` + the base sat at 21.5, so the region wanted 51.5 and got 51. + - **A config file is clamped, not rejected.** `load_fpv()` clamps to the new + bound at parse time, so a craft already carrying `-30` still boots and + lands on `-20`. Only the API path returns 400, so an operator typing `-30` + is told rather than reading back a value they did not write. + - Shipped default `fpv.roiQp` `-25` -> **`-20`**, so the default is inside + the range it documents. + - NOT reproduced on Star6E: 1080p60 at both a 19092 and a forced 1500 kbps + target held rate at `roiQp` 0/-15/-25/-30. Its sidecar reports `qp=0`, so + its rate controller could not be watched directly — treat SigmaStar as + unreproduced rather than immune. The bound is applied on all three + backends regardless, because the QP ceiling it derives from is an H.265 + limit, not a vendor one. +- `0.27.0` (additive — the portable AE ceilings reach CV610): `isp.gain_max` + and `isp.shutter_max_us` change from `supported:false` to `supported:true` + on CV610 only; both were already `MUT_LIVE` in the shared table, so no + mutability changes. They map onto the exposure group `/api/v1/iq` already + exposes, with **no unit conversion** — `exp_time_range` is documented + "unit: us" and `a_gain_range` "Format:22.10 ... unit: times, 10bit + precision", i.e. 1024 == 1x, the same scale the SigmaStar supervisory AE + uses. `isp.gain_max` maps to `auto.a_gain_max` (the *analog* ceiling, which + is what the name means on the other backends) rather than + `auto.sys_gain_max` (the product of analog, sensor-digital and ISP-digital + gain). + - `0` still means "use the sensor plugin's default" and now restores it: the + default is snapshotted before the first write, so clearing a ceiling is not + a one-way door. + - Both also apply at cold boot, not only on a live write — the ISP is seeded + by the sensor plugin, which never sees the config file. + - `isp.gain_min`, `isp.shutter_min_us`, `isp.awb_mode` and `isp.awb_ct` stay + `supported:false` on CV610 and still return **501**. The floors were simply + not measured in this slice. For the AWB pair that is a two-call flow rather + than a missing capability: where SigmaStar has one call + (`MI_ISP_AWB_SetCTMwbAttr(ct)`), this SDK has + `ss_mpi_isp_cal_gain_by_temp()`, which converts Kelvin to r/gr/gb/b gains + against the current `ot_isp_wb_attr`; those gains then go back through + `set_wb_attr` with `op_type` manual. Calibration-dependent, so it needs the + same device measurement every other CV610 field had to clear. Manual white + balance on CV610 is reachable today, under its own name, through + `/api/v1/iq`'s `wb` group. +- `0.26.0` (additive — live output retarget reaches CV610): `outgoing.server` + and `outgoing.enabled` change from `restart_required` to `live` on CV610 + only. Both SigmaStar backends already reported `live`; CV610 read the URI + once in `cv610_prepare()` and ran `cv610_output_start()` once, so the + fields were honestly advertised restart-class. They are now backed by + `cv610_apply_server()` / `cv610_apply_output_enabled()`. The callbacks + landed BEFORE the mutability widened, not after: the live-apply gate keys + on the callback being present, so the reverse order would have advertised + `live` while every write was refused. + + **Socket transports switch live; ring transports stay restart-class.** A + `udp://` <-> `unix://` change takes effect in place. A write naming + `shm://` or `frame-shm://` (or made while a ring is running) is COMMITTED + and answered `200` with `"reinit_pending": true`, and the craft respawns + onto it — the ring is created once at start and cannot move in place. + CV610 deliberately differs from Star6E and Maruko here, which refuse such + a write: on this backend `outgoing.server` was restart-required until + 0.26.0, so refusing would have made the fleet's normal production + transport unreachable through the API. + + Clients should therefore treat a `200` with `reinit_pending` on + `outgoing.server` as "accepted, applying after respawn", exactly as they + already do for restart-class fields. + + **One deliberate divergence:** Star6E drops the encoder to 5 fps while + output is disabled. CV610 cannot — `video0.fps` is restart-only there — so + a disable gates the send and the encoder keeps running at its configured + rate. +- `0.25.0` (additive — centre-priority ROI reaches CV610): `fpv.roi_enabled`, + `fpv.roi_qp`, `fpv.roi_steps` and `fpv.roi_center` flip from + `supported:false` to `true` on CV610, which had no `apply_roi_qp` at all — + every craft carried an `fpv` block nothing on the board read. Programmed + through `ss_mpi_venc_set_roi_attr()`; `ot_venc_roi_attr` is field-for-field + `MI_VENC_RoiCfg_t`, so the three backends now share one band geometry. + Verified in the bitstream **on CV610 itself**, not by return code and not + by inference from a sibling SoC — the SDK call differs per part, and issue + #259 is the counter-example where a QP control returned success, logged as + applied and read back clean while the picture never moved. CV610 720p100 + CBR: in-band detail drops 7.4x between `roiQp` -30 and +30, the columns + just outside the band move the opposite way, and a repeat of the -30 arm + lands within 8.8%. Measured separately on Maruko for the shared band + geometry. No wire or field-name change; a client that already renders the + CV610 capability map sees four controls ungrey. + + Shipped **defaults** also change, which `/api/v1/defaults` actuates and a + freshly provisioned craft reads back: `fpv.roiEnabled` `true` -> **false** + and `fpv.roiQp` `0` -> **-25**. The old pair read as "ROI on" while the + apply cleared every region (a zero delta is not a region worth + programming). Existing crafts are unaffected — their own config values + win. +- `0.24.0` (additive — sensor orientation reaches CV610): `image.mirror` and + `image.flip` flip from `supported:false` to `true` on CV610. Both were + hardcoded `TD_FALSE` on the VI channel attribute, so an inverted lens mount + had no software fix on that board. They are now applied at the **sensor**, + through the plugin's `pfn_mirror_flip`, which is where both SigmaStar + backends already apply orientation (`MI_SNR_SetOrien`) — so `image.*` means + one thing across the fleet and the encoder is never asked to do geometry. + Mutability is unchanged (`restart_required` on all three; the sensor is + programmed once at bring-up). `image.rotate` does **not** flip and stays + `supported:false` on CV610: the decomposition it relies on — + `venc_config`'s `load_image()` turning `rotate: 180` into `mirror + flip` — + runs on a **file parse and nowhere else**, so a value arriving through + `/api/v1/set` is never decomposed and never read by any backend. + Advertising it was measured to turn a clean `501` into: accept `90`, + persist `90`, raise `reinit_pending`, restart the encoder, then read back + `0`. A config file carrying `rotate: 180` still works on all three + backends. The SigmaStar backends report it `true` only because they have no + per-backend allowlist. +- `0.23.0` (additive — the RTP sidecar reaches CV610): `outgoing.sidecarPort` + flips from `supported:false` to `true` on CV610. `src/rtp_sidecar.c` was + never compiled into that binary, so the field was accepted, validated and + persisted while no datagram was ever sent — the ground station's attitude + and link-log consumers had no source on a CV610 craft, and the per-frame + timing probe had nothing to read. No wire change: CV610 emits the same + FRAME the SigmaStar backends do. ENC_INFO carries `frame_size_bytes`, + `frame_type`, `qp` and `frames_since_idr` (`idr_inserted` is not produced + on this backend — see the Backend Support Matrix); `complexity` and + `scene_change` stay 0 because the shared scene detector is not compiled in + here; `gop_state` is 0 on all three backends, as nothing writes it. ATTITUDE and DETECT are never appended (no IMU, no detector), so a + consumer whose only input is the ATTITUDE trailer has no source here. Under `frame-shm://` `seq_count` is 0 on every + backend and the other RTP identifiers are seeded non-zero; the session is + gated on stream mode, not transport. - `0.21.0` (**breaking**, `video0.maxIBytes`/`video0.maxPBytes` removed): the per-frame size caps are gone from the config, the capabilities payload and both SigmaStar backends. They never imposed the ceiling they named. diff --git a/documentation/ROI_INVESTIGATION.md b/documentation/ROI_INVESTIGATION.md index 047c4627..f43a2ed8 100644 --- a/documentation/ROI_INVESTIGATION.md +++ b/documentation/ROI_INVESTIGATION.md @@ -35,10 +35,15 @@ All rect coordinates are aligned to 32 pixels for H.265 CTU compatibility. "roiSteps": 2, "roiCenter": 0.25 } +// An EXAMPLE of ROI switched on, not the shipped defaults. +// Those are roiEnabled:false, roiQp:-20, roiSteps:2, roiCenter:0.4. ``` -- `roiEnabled`: bool, MUT_LIVE — enable/disable ROI bands -- `roiQp`: int, MUT_LIVE, range `-30..30` +- `roiEnabled`: bool, MUT_LIVE — enable/disable ROI bands. Ships **`false`** + since 0.76.0, paired with a non-zero `roiQp` so switching it on does + something. It previously shipped `true` alongside `roiQp: 0`, i.e. on with + nothing to apply. +- `roiQp`: int, MUT_LIVE, range `-20..20` (was `-30..30` before 0.79.0) - `roiSteps`: uint16, MUT_LIVE, range `1..4` - `roiCenter`: double, MUT_LIVE, range `0.1..0.9` diff --git a/documentation/SSC338Q_CV610_ENCODER_CAPABILITIES.md b/documentation/SSC338Q_CV610_ENCODER_CAPABILITIES.md index 1ac18639..d135cb11 100644 --- a/documentation/SSC338Q_CV610_ENCODER_CAPABILITIES.md +++ b/documentation/SSC338Q_CV610_ENCODER_CAPABILITIES.md @@ -88,7 +88,7 @@ The channel capability record returned: | Slices | Whole-AU slicing and delivered CTU geometry integrated | Whole-AU 32-pixel-row splitting integrated; requests through 17 confirmed; early-slice output also represented | Keep early output off | | Loss handling | Output-ring chain breaks trigger paced recovery IDRs | Also exposes native P-skip and super-frame discard/re-encode | Preserve parity policy; experiment with native loss controls later | | QP tools | I/P delta, bounds and frame-size caps integrated | Adds hierarchical QP, QP maps, foreground protection, skip bias and quality balance APIs | Do not bundle unverified tools | -| ROI | Eight horizontal delta-QP bands integrated | Eight ROI regions, extended per-frame ROI, background-rate and QP-map APIs | A future CV610 parity opportunity | +| ROI | Up to four horizontal delta-QP bands integrated (`PIPELINE_ROI_MAX_STEPS`; `fpv.roiSteps` validates to [1,4], though the SDK exposes eight regions) | Eight ROI regions, extended per-frame ROI, background-rate and QP-map APIs | **Delivered in 0.76.0** — the same four bands, same shared geometry, via `ss_mpi_venc_set_roi_attr`. Per-frame ROI, background rate and QP maps remain unexplored | | VUI/user data | No MI VUI/user-data wrapper loaded | H.265 VUI already programmed; user-data insertion exported | CV610 is already richer here | | H.265 tools | Encoder defaults plus resilience/slices | Deblock, SAO, transform, entropy, CU prediction, search window, deblur and motion-stat controls exported | Documented future tuning surface | | Low delay | SigmaStar stream modes were rejected in prior device tests; production is frame-based | Slice-output plus VI/VPSS low-delay APIs exist | Best candidate for a later sub-frame experiment, requiring transport redesign | diff --git a/include/cv610_audio.h b/include/cv610_audio.h index eaf563db..d791cc2f 100644 --- a/include/cv610_audio.h +++ b/include/cv610_audio.h @@ -28,4 +28,15 @@ void cv610_audio_set_record_ring(Cv610AudioState *state, AudioRing *ring); /** Non-zero while the capture thread is alive; clears when it exits. */ int cv610_audio_is_running(Cv610AudioState *state); +/** Re-derive the audio destination from `video_output` and repoint the socket, + * for a live `outgoing.server` change. Safe to call from the httpd thread + * while the capture thread runs: the transport fields are seqlock-protected + * and the capture thread snapshots them once per frame. + * + * Returns 0 when there was nothing to do (no state, audio disabled, or + * `audio_port < 0`) as well as on success; -1 only when a destination was + * wanted and could not be programmed. */ +int cv610_audio_apply_server(Cv610AudioState *state, const VencConfig *config, + const VencOutputUri *video_output); + #endif /* CV610_AUDIO_H */ diff --git a/include/cv610_iq.h b/include/cv610_iq.h index b78342c3..d0a27dd7 100644 --- a/include/cv610_iq.h +++ b/include/cv610_iq.h @@ -12,6 +12,18 @@ * directly, so the attribute structs are the SDK's own types and the field * table is built from offsetof() rather than hand-computed offsets. */ +#include + +/** The ISP's AE ceilings as the sensor plugin seeded them, latched on the + * first apply so that clearing a ceiling back to 0 is not a one-way door. + * Owned by the caller -- the CV610 runner keeps one in its context -- so + * this module adds no global mutable state. */ +typedef struct { + uint32_t gain_max; + uint32_t exp_time_max; + int valid; +} Cv610IqAeDefaults; + #ifdef __cplusplus extern "C" { #endif @@ -30,6 +42,23 @@ char *cv610_iq_query(void); * Returns 0 on success, -1 on unknown name, bad value, or an MPI error. */ int cv610_iq_set(const char *param, const char *value); +/** Apply the portable AE ceilings, in the fleet-wide units. + * `gain` is analog sensor gain in 22.10 fixed point (1024 == 1x) and maps to + * exposure.auto.a_gain_max; `us` is microseconds and maps to + * exposure.auto.exp_time_max. Neither needs a unit conversion -- that is + * why they are wired rather than approximated. + * 0 restores the value the sensor plugin seeded, captured on the first call + * so that clearing a ceiling is not a one-way door. + * Returns 0 on success, -1 when the ISP is not running or the MPI rejects + * the write. */ +/** Drop the cached cold-boot AE ceilings. + * Call after anything that rewrites the ISP's exposure attributes behind + * this module's back -- a PQTools .bin import does exactly that. */ +void cv610_iq_forget_ae_defaults(Cv610IqAeDefaults *d); + +int cv610_iq_set_gain_max(Cv610IqAeDefaults *d, uint32_t gain); +int cv610_iq_set_shutter_max_us(Cv610IqAeDefaults *d, uint32_t us); + /** Query the AWB loop's applied result plus the exposure that selected it. * Returns malloc'd JSON, caller frees. NULL when the ISP is not running. * This is ot_isp_wb_info, not the ot_isp_wb_attr that cv610_iq_query()'s diff --git a/include/cv610_pipeline.h b/include/cv610_pipeline.h index 67b20805..fd094b09 100644 --- a/include/cv610_pipeline.h +++ b/include/cv610_pipeline.h @@ -20,6 +20,17 @@ typedef struct { int data_rate_x2; int bayer; int raw_bit; + /* image.mirror / image.flip. Applied at the SENSOR (the plugin's + * pfn_mirror_flip), matching what both SigmaStar backends do, so + * `image.*` means the same thing on every board and the encoder is not + * asked to do geometry. + * + * The Bayer start phase does NOT move with the readout on IMX662 — + * measured, see isp_setup(). The textbook answer is one XOR per axis + * into pub.bayer_format and it is the WRONG one here; do not add it + * back without re-running that A/B. */ + int mirror; + int flip; /* MCLK this mode's sensor line timing assumes. Zero leaves whatever * the loader set, which suits exactly one mode. */ uint32_t sensor_clock_hz; diff --git a/include/cv610_pq_bin.h b/include/cv610_pq_bin.h new file mode 100644 index 00000000..42ca0915 --- /dev/null +++ b/include/cv610_pq_bin.h @@ -0,0 +1,43 @@ +#ifndef CV610_PQ_BIN_H +#define CV610_PQ_BIN_H + +/* PQTools `.bin` import/export for the Hi3516CV610 ISP. + * + * cv610_iq.c exposes the ISP as individual live knobs. This module moves the + * whole parameter image at once, through the vendor `libbin.so` blob, which is + * how PQTools tunes: a `.bin` is the serialized ISP + 3DNR state. + * + * The blob is dlopen'd rather than linked because it is not ours to ship in + * the SDK library set, and because a craft without it must still boot -- every + * failure here is a warning, never fatal, matching star6e's isp_runtime.c. + * + * The `.bin` is locked to the chip and the SDK ISP version, NOT to the sensor: + * import validates a register address/size walk against what this chip's ISP + * reports live, and carries no sensor identity. A tune built for a different + * sensor on the same SoC and SDK loads; it simply carries that sensor's + * black level, CCM, AWB and noise calibration with it -- device-measured on + * .181, where an os02h10 tune imported cleanly onto an IMX662 and turned the + * picture red. + * + * The payload IS integrity-checked, so a `.bin` cannot be edited or spliced in + * place: flipping one byte at ISP offset 20000 of an otherwise valid file made + * OT_PQ_BIN_ImportBinData return 0xcb000005. Produce files with PQTools, or + * with cv610_pq_bin_export(), and treat them as opaque. */ + +/** Whether the vendor library is present and loadable on this craft. + * Probed once and cached. Both entry points below degrade to a warning + * without it, so this exists to keep /api/v1/capabilities honest rather than + * to gate the calls. */ +int cv610_pq_bin_available(void); + +/** Import a PQTools `.bin` into the running ISP. + * An empty or NULL path is a no-op and succeeds, so an unset config field + * costs nothing. Returns 0 on success, -1 on any failure. */ +int cv610_pq_bin_import(const char *path); + +/** Export the live ISP state to a `.bin` at `path`, overwriting it. + * The buffer size is queried from the library, never assumed. + * Returns the number of bytes written on success, -1 on any failure. */ +int cv610_pq_bin_export(const char *path); + +#endif /* CV610_PQ_BIN_H */ diff --git a/include/maruko_pipeline.h b/include/maruko_pipeline.h index c9b53cfd..970798c3 100644 --- a/include/maruko_pipeline.h +++ b/include/maruko_pipeline.h @@ -6,6 +6,7 @@ #include "maruko_bindings.h" #include "maruko_config.h" #include "maruko_output.h" +#include "pipeline_common.h" #include "scene_detector.h" #include "sensor_select.h" #include "star6e_recorder.h" @@ -53,6 +54,7 @@ typedef struct { SensorSelectResult sensor; MarukoBackendConfig cfg; SceneDetector scene; + PipelineRateWatch rate_watch; struct DebugOsdState *debug_osd; /* NULL if debug OSD disabled */ ImuState *imu; /* NULL if IMU disabled or init failed */ /* Dual VENC (gemini-style) — heap-allocated, NULL when inactive. */ diff --git a/include/pipeline_common.h b/include/pipeline_common.h index b36c25e7..f8d410a0 100644 --- a/include/pipeline_common.h +++ b/include/pipeline_common.h @@ -5,6 +5,8 @@ #include "sensor_select.h" #endif +#include "venc_config.h" + #include #include #include @@ -77,9 +79,84 @@ static inline int pipeline_common_scale_roi_qp(int qp, int level, int steps) return qp < 0 ? -mag : mag; } +/** Rolling delivered-vs-target bitrate check. + * + * The encoder can lose rate control entirely and there is no in-band signal + * for it on two of the three backends: the frame QP that shows the failure is + * CV610-only (see rtp_sidecar.h -- SigmaStar fills only refType). What every + * backend does have is the frame size, and the failure is far easier to see in + * the consequence than in the cause. + * + * The mechanism worth catching: fpv.roiQp is a RELATIVE delta, so CBR pays for + * the ROI discount by raising the frame's base QP roughly 1:1. Once + * base_qp + |roiQp| passes the controller's QP ceiling the base pins there and + * the target is missed by multiples -- measured on a CV610 bench at 5.8x with + * video0.max_qp 40 and 12.0x at 35, both at a roiQp of only -20. + * + * Thresholds are compiled in, not configurable, because the measurement leaves + * no room to tune: normal operation ran 0.96-1.06x of target across every arm, + * the worst benign scene transient hit 1.43x for a single window, and a real + * collapse ran 1.9x-39x and did not decay. Zero bitrate disables the check. + * + * Scope: the main video0 channel on each backend. Maruko's second "dual" + * VENC channel runs its own thread and never passes through the drain loop + * this is called from, so that stream is not watched -- video0 is the one + * with a configured target to compare against. */ +typedef struct { + uint64_t window_start_us; + uint64_t window_bytes; + uint8_t over_windows; + uint8_t reported; /* latched, so one episode logs once */ + uint16_t reports; /* episodes actually reported; the latch is not + * observable from `reported` alone, since that + * stays 1 either way */ +} PipelineRateWatch; + +/** Call once per encoded frame, with the configured (not measured) target. */ +void pipeline_common_rate_watch(PipelineRateWatch *rw, const VencConfig *cfg, + uint32_t frame_bytes, uint64_t now_us); + /** Maximum number of ROI band regions. */ #define PIPELINE_ROI_MAX_STEPS 4 +/** One horizontal ROI band, in encoder pixel coordinates. + * + * Horizontal bands, delta QP tapering from the innermost band (full qp) + * outward. Higher index = narrower = stronger, so on a backend where a + * higher-index region overrides a lower one in the overlap the centre lands the + * full delta and the edges the weakest step. + * + * "Full-height, centred" is the intent, not the arithmetic: every edge is + * rounded DOWN to a 32-px multiple for H.265 CTU compatibility, so a 1080-row + * frame yields height 1056 and leaves the bottom 24 rows outside every band, + * and an origin that rounds down can sit up to 31 px left of true centre + * (1920 wide, centre 0.35, index 3 -> x=608, w=672, band centre 944 vs 960). + * + * Shared because all three backends draw the identical rectangle; only the SDK + * struct it is copied into differs (MI_VENC_RoiCfg_t on the two SigmaStar + * parts, ot_venc_roi_attr on CV610). */ +typedef struct { + uint32_t x, y, width, height; + int qp; +} PipelineRoiBand; + +/** Compute band `index` of `steps`. Returns 0 and fills *out when the band is + * usable, -1 when the caller should skip it: a NULL out, an index outside + * [0, steps), or a rectangle that degenerates to zero width or height once + * aligned (a frame under 32 px, or a centre fraction that rounds away). + * + * center_frac is CLAMPED to [0.1, 0.9] here, not merely assumed. All three + * backends clamp before calling and config load validates the field, so an + * out-of-range value is unreachable today -- but this is now a cross-TU + * primitive with three callers, and the failure mode without the clamp is not a + * bad number: frac > 1 underflows the unsigned (width - rw)/2 to ~2^31, and a + * negative frac makes (uint32_t)(frac * width) an out-of-range float-to-unsigned + * conversion, i.e. undefined behaviour. Both returned SUCCESS with a garbage + * rect. A shared primitive should be total over its declared domain. */ +int pipeline_common_roi_band(uint32_t width, uint32_t height, + float center_frac, int qp, int steps, int index, + PipelineRoiBand *out); + /** Upper bound the live-apply path accepts for video0.fps. * * A live `fps` request above the current sensor mode's max is intentionally diff --git a/include/rtp_sidecar.h b/include/rtp_sidecar.h index 337cc54e..cb257fe8 100644 --- a/include/rtp_sidecar.h +++ b/include/rtp_sidecar.h @@ -134,7 +134,16 @@ typedef struct { typedef struct { uint32_t frame_size_bytes; /* encoded frame bytes */ uint8_t frame_type; /* RTP_SIDECAR_FRAME_* */ - uint8_t qp; /* start QP / closest available per-frame QP */ + uint8_t qp; /* start QP / closest available per-frame QP. + * CV610 only. SigmaStar leaves this 0 and + * cannot do better: its encoder fills just + * refType in the H.265 stream-info struct -- + * size, every CU count, updAttrCnt and + * startQual all read 0 (device-dumped on + * i6, 0.79.0). The struct offset is right; + * the driver simply does not populate them. + * A per-frame QP there means parsing + * slice_qp_delta out of the slice header. */ uint8_t complexity; /* 0-255 scene complexity estimate */ uint8_t scene_change; /* 1 = scene spike detected */ uint8_t gop_state; /* GopState enum value */ diff --git a/include/venc_api.h b/include/venc_api.h index d79c959f..286d5824 100644 --- a/include/venc_api.h +++ b/include/venc_api.h @@ -7,7 +7,7 @@ * and fails if they drift. 0.73.0 shipped with the document on 0.22.0 and the * code still answering 0.21.0, so every craft advertised a contract it was not * serving. */ -#define VENC_CONTRACT_VERSION "0.22.0" +#define VENC_CONTRACT_VERSION "0.29.0" #include "venc_config.h" #ifdef __cplusplus @@ -85,11 +85,19 @@ typedef struct { * backend has no zoom path. */ int (*apply_zoom)(double pct, double x, double y); /* Reload the ISP tuning bin (isp.sensor_bin) on the running pipeline. - * Empty path falls back to /etc/sensors/.bin. Returns 0 on + * Empty path falls back to /etc/sensors/.bin on the SigmaStar + * backends; CV610 has no such convention and treats empty as a no-op, + * and its file is a HiSilicon PQTools .bin, not a SigmaStar one. + * Returns 0 on * success (or no-op when the resolved path already matches the * last-loaded one), -1 on resolve/load error. NULL when the backend * cannot reload bins without a full restart. */ int (*apply_isp_bin)(const char *path); + /* Serialize the live ISP state into a PQTools `.bin` at `path`, + * overwriting it. Returns the byte count written, -1 on failure. NULL when + * the backend has no such on-disk format -- the SigmaStar backends + * round-trip IQ as JSON instead (see /api/v1/iq/import). */ + int (*export_isp_bin)(const char *path); /* Live-update the MJPEG snapshot channel q-factor (1..99). Hits * MI_VENC_SetChnAttr on the running snapshot channel — no pipeline * reinit, no buffer reallocation. Returns 0 on success, -1 on @@ -155,6 +163,10 @@ const char *venc_api_validate_loaded_config(const VencConfig *cfg); * /api/v1/restart, /api/v1/defaults, and MUT_RESTART /api/v1/set * all enqueue the same request. */ void venc_api_request_reinit(void); +/** Monotonic count of reinit requests. Sample it around an apply to learn + * whether THAT apply asked for a respawn; the boolean latch cannot say, since + * it shows no transition when one is already pending. */ +unsigned venc_api_reinit_seq(void); bool venc_api_get_reinit(void); void venc_api_clear_reinit(void); diff --git a/include/venc_config.h b/include/venc_config.h index 0de9ac92..e4833df2 100644 --- a/include/venc_config.h +++ b/include/venc_config.h @@ -262,7 +262,7 @@ typedef struct { typedef struct { bool roi_enabled; - int roi_qp; /* signed ROI delta QP, -30..30 */ + int roi_qp; /* signed ROI delta QP, -20..20 */ uint16_t roi_steps; /* 1..4 horizontal band regions */ double roi_center; /* center region fraction 0.1..0.9 */ int noise_level; /* 0..7 */ diff --git a/iq-profiles/cv610-bin/.gitkeep b/iq-profiles/cv610-bin/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/iq-profiles/cv610-bin/MD5SUMS b/iq-profiles/cv610-bin/MD5SUMS new file mode 100644 index 00000000..7112e3df --- /dev/null +++ b/iq-profiles/cv610-bin/MD5SUMS @@ -0,0 +1 @@ +be8313cc1ac84dbde0a2c7aadc7029f8 iq-profiles/cv610-bin/imx662.bin diff --git a/iq-profiles/cv610-bin/README.md b/iq-profiles/cv610-bin/README.md new file mode 100644 index 00000000..2b51ded4 --- /dev/null +++ b/iq-profiles/cv610-bin/README.md @@ -0,0 +1,115 @@ +# CV610 (Hi3516CV610) ISP tuning blobs + +PQTools `.bin` files for the HiSilicon CV610 ISP. Applied by +`src/cv610_pq_bin.c` through the vendor `libbin.so`, live via the +`isp.sensorBin` config field and once at cold boot. + +Not the same format as `../maruko-bin/*.bin`, despite the shared extension +and the shared config field. Those are SigmaStar blobs loaded with +`MI_ISP_*_CmdLoadBinFile`; these are HiSilicon PQ images imported with +`OT_PQ_BIN_ImportBinData`. The two are not interchangeable. + +## What's here + +| File | Sensor | Size | Source | +|---|---|---|---| +| `imx662.bin` | IMX662 2 MP | 144774 B | exported from our own `.181` bench, 2026-09-05 | + +MD5s are in `MD5SUMS`. + +## Provenance — read this before treating it as a vendor tune + +`imx662.bin` is **our own state, not a vendor tune.** It is what +`GET /api/v1/iq/export_bin` serialized out of the running ISP on +`192.168.2.181` (venc 0.80.0, backend cv610) at a cold-boot state: the IMX662 +sensor plugin's compiled-in `cmos_get_isp_default()` seeds from PR #229, plus +everything venc applies on top at startup. + +It is therefore a **snapshot for posterity and a restore point**, not a +measured tune. Nobody has run PQTools against this sensor. Re-exporting after +real tuning work is the whole point of keeping the exporter. + +One consequence worth knowing: an export is taken from a *live* ISP, so it +captures wherever the 3A loops had converged at that moment. Two exports of +the same craft are not byte-identical, and neither is an export taken right +after importing a file identical to that file (measured: 3.69% of the ISP +image differs). What round-trips exactly is the ISP's own read-back through +`/api/v1/iq`, which is the thing that matters. + +## Install + +The fleet convention is `/etc/sensors/`, same as the SigmaStar backends: + +```sh +ssh root@ mkdir -p /etc/sensors +scp iq-profiles/cv610-bin/imx662.bin root@:/etc/sensors/ +``` + +`/etc/sensors` does not exist on a stock CV610 rootfs — create it. Then point +the config at it and save, so the cold-boot apply picks it up: + +```sh +curl "http:///api/v1/set?isp.sensorBin=/etc/sensors/imx662.bin" +curl "http:///api/v1/save" +``` + +**Do not leave a `.bin` in `/tmp`.** `/tmp` is tmpfs on this board, so a path +under it survives exactly until the next reboot, after which every boot logs +`PQ bin is not a regular file` and the craft comes up on the plugin defaults. +The overlay had ~2 MB free on the reference bench; a 145 KB bin fits. + +`libbin.so` must also be present (`/usr/lib/libbin.so`) or the import warns and +no-ops. It is a third-party blob whose licensing is the vendor's, so it is not +committed to this repo. `make stage SOC_BUILD=cv610` copies it into +`out/cv610/lib/` when `CV610_PQ_LIB` resolves, and prints a NOTE naming the +path when it does not: + +```sh +make stage SOC_BUILD=cv610 CV610_PQ_LIB=/path/to/libbin.so +scp out/cv610/lib/libbin.so root@:/usr/lib/ +``` + +The firmware build installs it the same way, from the staged output. + +## Exporting a new one + +The exporter writes a fixed path, because the endpoint is unauthenticated and a +caller-supplied path would be a write-anywhere primitive: + +```sh +curl http:///api/v1/iq/export_bin +# -> {"ok":true,"data":{"path":"/tmp/isp_export.bin"}} + +scp root@:/tmp/isp_export.bin iq-profiles/cv610-bin/.bin +( cd iq-profiles/cv610-bin && md5sum *.bin > MD5SUMS ) +``` + +Verify before committing: import it back on the bench and confirm +`/api/v1/iq` reads back what it did before the import. + +```sh +scp iq-profiles/cv610-bin/.bin root@:/tmp/rt.bin +curl -s http:///api/v1/iq > before.json +curl "http:///api/v1/set?isp.sensorBin=/tmp/rt.bin" +curl -s http:///api/v1/iq > after.json && diff before.json after.json +``` + +## The files are opaque + +A `.bin` is integrity-checked by the vendor library. Editing one byte of an +otherwise valid file makes the import fail `0xcb000005`, so these cannot be +hand-edited, spliced, or merged — produce them with PQTools or with the +exporter above. + +The lock is the **chip register map and the SDK ISP version, not the sensor**: +import validates an address/size walk against what the running chip's ISP +reports, and the format carries no sensor identity. A tune built for a +different sensor on the same SoC and SDK imports cleanly — it simply brings +that sensor's CCM, AWB, black level and noise calibration with it, which on a +mismatched sensor looks like a strong colour cast. + +Layout, for anyone diffing them: `[ISP image of exactly +OT_PQ_GetISPDataTotalLen() bytes][OTPQNRX 3DNR section]`, which on this SDK is +143424 + 1350 = 144774. The ISP half is three TLV records (131072 + 8192 + +4096, each behind a 20-byte header) and its own header carries width, height +and an fps float — a quick way to tell what a donor file was made for. diff --git a/iq-profiles/cv610-bin/imx662.bin b/iq-profiles/cv610-bin/imx662.bin new file mode 100644 index 00000000..e00cd830 Binary files /dev/null and b/iq-profiles/cv610-bin/imx662.bin differ diff --git a/scripts/api_test_suite.sh b/scripts/api_test_suite.sh index c02bc5bb..eacc284b 100755 --- a/scripts/api_test_suite.sh +++ b/scripts/api_test_suite.sh @@ -647,11 +647,23 @@ section "10. ROI QP — Enable, sweep, disable" assert_set "fpv.roi_enabled" "true" settle 0.5 -for qp in -30 -18 -9 0 9 18 30; do +for qp in -20 -18 -9 0 9 18 20; do assert_set "fpv.roi_qp" "${qp}" "SET roi_qp=${qp}" settle 0.3 done +# Past +-20 the delta stops reaching the encoder, and on the negative side it +# saturates rate control and overruns the bitrate target (contract 0.28.0). +# The boundary is asserted on BOTH sides of the edge: +-20 accepted above, +# +-21 and the old +-30 refused here. Without the +-21 pair a validator that +# had drifted to, say, +-25 would still pass this block. +for qp in -30 -21 21 30; do + assert_set_fail "fpv.roi_qp" "${qp}" "REJECT roi_qp=${qp} (out of +-20)" + settle 0.3 +done +assert_set "fpv.roi_qp" "-15" "SET roi_qp=-15 (restore in-range)" +settle 0.3 + for steps in 1 2 3 4; do assert_set "fpv.roi_steps" "${steps}" "SET roi_steps=${steps}" settle 0.3 diff --git a/src/cv610_audio.c b/src/cv610_audio.c index 50a60dc7..78d63379 100644 --- a/src/cv610_audio.c +++ b/src/cv610_audio.c @@ -13,6 +13,8 @@ #include "audio_ring.h" #include "rtp_packetizer.h" +#include + #include #include #include @@ -54,6 +56,17 @@ struct Cv610AudioState { socklen_t destination_len; VencOutputUriType transport; int connected_udp; + /* Live retarget, seqlock-protected -- the same shape the video path uses + * in cv610_runtime.c. These four are rewritten by + * cv610_audio_apply_server() on the httpd thread and read by the capture + * thread in cv610_audio_write(); odd generation = a write in progress. */ + unsigned transport_gen; + struct { + int socket_handle; + struct sockaddr_storage destination; + socklen_t destination_len; + int connected_udp; + } tx; RtpPacketizerState rtp; uint32_t ticks_per_frame; pthread_t thread; @@ -224,14 +237,17 @@ static int cv610_aenc_start(Cv610AudioState *state) return 0; } -static int cv610_audio_output_start(Cv610AudioState *state, - const VencConfig *config, const VencOutputUri *video_output) +/* Derive the audio destination from the video transport. Shared by the + * start path and the live retarget so the two cannot drift -- the mapping + * below (UDP follows the peer, local transports go to loopback) is the whole + * contract, and having it in one place is what makes a retarget correct by + * construction rather than by remembering to update a second copy. */ +static int cv610_audio_derive_output(const VencConfig *config, + const VencOutputUri *video_output, VencOutputUri *out, uint16_t *out_port) { VencOutputUri audio_output; uint16_t port; - if (config->outgoing.audio_port < 0) - return 0; if (!video_output) { fprintf(stderr, "ERROR: CV610 audio has no video transport context\n"); return -1; @@ -261,6 +277,22 @@ static int cv610_audio_output_start(Cv610AudioState *state, return -1; } audio_output.port = port; + *out = audio_output; + *out_port = port; + return 0; +} + +static int cv610_audio_output_start(Cv610AudioState *state, + const VencConfig *config, const VencOutputUri *video_output) +{ + VencOutputUri audio_output; + uint16_t port; + + if (config->outgoing.audio_port < 0) + return 0; + if (cv610_audio_derive_output(config, video_output, &audio_output, + &port) != 0) + return -1; if (output_socket_configure(&state->socket_handle, &state->destination, &state->destination_len, &state->transport, &audio_output, config->outgoing.connected_udp, 0, &state->connected_udp) != 0) @@ -270,14 +302,70 @@ static int cv610_audio_output_start(Cv610AudioState *state, return 0; } +int cv610_audio_apply_server(Cv610AudioState *state, const VencConfig *config, + const VencOutputUri *video_output) +{ + VencOutputUri audio_output; + uint16_t port; + + /* A craft with audio off, or audio_port < 0, has nothing to retarget -- + * not an error, just no work. */ + if (!state || !config || config->outgoing.audio_port < 0) + return 0; + if (state->socket_handle < 0) + return 0; + if (cv610_audio_derive_output(config, video_output, &audio_output, + &port) != 0) + return -1; + + __atomic_fetch_add(&state->transport_gen, 1, __ATOMIC_RELEASE); + if (output_socket_configure(&state->socket_handle, &state->destination, + &state->destination_len, &state->transport, &audio_output, + config->outgoing.connected_udp, 0, &state->connected_udp) != 0) { + __atomic_fetch_add(&state->transport_gen, 1, __ATOMIC_RELEASE); + return -1; + } + __atomic_fetch_add(&state->transport_gen, 1, __ATOMIC_RELEASE); + printf("> CV610 audio retargeted to udp://%s:%u\n", audio_output.host, + port); + return 0; +} + +/* Seqlock read, once per encoded audio frame. Mirrors + * cv610_transport_begin_frame() on the video side. */ +static void cv610_audio_begin_frame(Cv610AudioState *state) +{ + unsigned gen_before, gen_after; + + for (;;) { + gen_before = __atomic_load_n(&state->transport_gen, + __ATOMIC_ACQUIRE); + if (gen_before & 1u) { + sched_yield(); + continue; + } + state->tx.socket_handle = state->socket_handle; + state->tx.destination = state->destination; + state->tx.destination_len = state->destination_len; + state->tx.connected_udp = state->connected_udp; + gen_after = __atomic_load_n(&state->transport_gen, + __ATOMIC_ACQUIRE); + if (gen_before == gen_after) + break; + } +} + static int cv610_audio_write(const uint8_t *header, size_t header_len, const uint8_t *payload1, size_t payload1_len, const uint8_t *payload2, size_t payload2_len, void *opaque) { Cv610AudioState *state = opaque; - return output_socket_send_parts(state->socket_handle, - &state->destination, state->destination_len, state->connected_udp, + /* From the per-frame snapshot, never the live fields -- every packet of + * one Opus access unit must reach the same destination. */ + return output_socket_send_parts(state->tx.socket_handle, + &state->tx.destination, state->tx.destination_len, + state->tx.connected_udp, header, header_len, payload1, payload1_len, payload2, payload2_len); } @@ -349,7 +437,8 @@ static void *cv610_audio_thread(void *opaque) (uint64_t)now.tv_sec * 1000000ull + (uint64_t)now.tv_nsec / 1000ull); } - if (state->socket_handle < 0) { + cv610_audio_begin_frame(state); + if (state->tx.socket_handle < 0) { sent = 1; } else { int send_ret = rtp_packetizer_send_packet(&state->rtp, diff --git a/src/cv610_iq.c b/src/cv610_iq.c index 8447c6de..b24e9217 100644 --- a/src/cv610_iq.c +++ b/src/cv610_iq.c @@ -759,6 +759,127 @@ int cv610_iq_set(const char *param, const char *value) return rc; } +/* ========================================================================== + * Portable AE ceilings + * + * isp.gain_max and isp.shutter_max_us are the fleet-wide names for the two + * AE limits every backend has. They map onto this ISP's exposure group + * with NO unit conversion, which is the only reason they are wired at all: + * + * isp.shutter_max_us -> exposure.auto.exp_time_max + * ot_isp_ae_range exp_time_range, "sensor exposure time (unit: us)" + * isp.gain_max -> exposure.auto.a_gain_max + * ot_isp_ae_range a_gain_range, "Format:22.10 ... sensor analog gain + * (unit: times, 10bit precision)" -- 1024 == 1x, the same scale the + * SigmaStar supervisory AE uses (maruko_cus3a.c AE_GAIN_MIN). + * + * Analog gain, not sys_gain: the portable name means the SENSOR's gain + * ceiling on every other backend, and sys_gain_range caps the product of + * analog, sensor-digital and ISP-digital gain. Capping the product would + * make the same number mean something different here. + * + * Both live under auto_attr, so cv610_iq_set() selects AE auto mode for + * them -- which is the mode a ceiling is meant to apply in. + * + * 0 means "use the sensor plugin's default" on every backend, so the + * default has to survive a non-zero write. Without the snapshot below, + * setting a ceiling and then clearing it would leave the ISP on the last + * non-zero value forever while the config read 0: a one-way door, and + * exactly the shape of bug this milestone keeps finding. The snapshot is + * taken on the first apply, before any write of ours has landed. + * ========================================================================== */ + + +/* Caller must NOT hold g_iq_mutex: this takes it, and cv610_iq_set() takes + * it again on the way out. + * + * The readiness check is the same one cv610_iq_set() and both query paths + * make, and it is what lets the snapshot below trust the value it latches: + * the plugin seeds the exposure attr inside ss_mpi_isp_init(), which runs + * before cv610_pipeline_isp_ready() turns true, so there is no window where + * this reads an unseeded struct and caches it as "the default". */ +static int ae_defaults(Cv610IqAeDefaults *d, uint32_t *gain_max, + uint32_t *exp_time_max) +{ + int rc = -1; + + if (!cv610_pipeline_isp_ready()) { + fprintf(stderr, "[cv610-iq] AE defaults: ISP is not running\n"); + return -1; + } + + pthread_mutex_lock(&g_iq_mutex); + if (!d->valid) { + int ret; + + /* Reuses the shared scratch the mutex exists to guard, rather + * than putting an ot_isp_exposure_attr on the caller's stack. */ + memset(&g_attr, 0, sizeof(g_attr)); + ret = iq_get_exposure(&g_attr); + if (ret != 0) { + fprintf(stderr, "[cv610-iq] AE defaults: get failed: 0x%x\n", + (unsigned)ret); + goto out; + } + d->gain_max = + (uint32_t)g_attr.exposure.auto_attr.a_gain_range.max; + d->exp_time_max = + (uint32_t)g_attr.exposure.auto_attr.exp_time_range.max; + d->valid = 1; + printf("[cv610-iq] AE defaults from the sensor plugin: " + "a_gain_max=%u (%.2fx) exp_time_max=%u us\n", + d->gain_max, + (double)d->gain_max / 1024.0, + d->exp_time_max); + } + *gain_max = d->gain_max; + *exp_time_max = d->exp_time_max; + rc = 0; +out: + pthread_mutex_unlock(&g_iq_mutex); + return rc; +} + +/* A whole-image .bin import rewrites the AE ext-register record, so the + * ceilings latched at cold boot are no longer "the plugin's defaults". Left + * cached, a later isp.gainMax=0 ("keep the default") would write the + * PRE-import value back over the imported one. cv610_pq_bin_import() calls + * this on success; the next ae_defaults() re-latches from the live ISP. */ +void cv610_iq_forget_ae_defaults(Cv610IqAeDefaults *d) +{ + if (!d) + return; + pthread_mutex_lock(&g_iq_mutex); + d->valid = 0; + pthread_mutex_unlock(&g_iq_mutex); +} + +static int ae_set_limit(const char *param, uint32_t value, uint32_t dflt) +{ + char buf[16]; + + snprintf(buf, sizeof(buf), "%u", value ? value : dflt); + return cv610_iq_set(param, buf); +} + +int cv610_iq_set_gain_max(Cv610IqAeDefaults *d, uint32_t gain) +{ + uint32_t dflt_gain, dflt_exp; + + if (!d || ae_defaults(d, &dflt_gain, &dflt_exp) != 0) + return -1; + return ae_set_limit("exposure.auto.a_gain_max", gain, dflt_gain); +} + +int cv610_iq_set_shutter_max_us(Cv610IqAeDefaults *d, uint32_t us) +{ + uint32_t dflt_gain, dflt_exp; + + if (!d || ae_defaults(d, &dflt_gain, &dflt_exp) != 0) + return -1; + return ae_set_limit("exposure.auto.exp_time_max", us, dflt_exp); +} + /* ========================================================================== * Applied AWB result * diff --git a/src/cv610_pipeline.c b/src/cv610_pipeline.c index 669be227..73c06206 100644 --- a/src/cv610_pipeline.c +++ b/src/cv610_pipeline.c @@ -93,6 +93,8 @@ typedef struct { unsigned int out_height; int keep_aspect; /* isp.keepAspect: crop before scaling */ int vi_online; /* VI -> ISP online/realtime mode */ + int mirror; /* image.mirror: sensor H reverse */ + int flip; /* image.flip: sensor V reverse */ } Cv610PipelineRuntimeConfig; static volatile sig_atomic_t g_stop; @@ -427,6 +429,11 @@ static int vi_start_chn(const Cv610PipelineRuntimeConfig *c) chn_attr.dynamic_range = OT_DYNAMIC_RANGE_SDR8; chn_attr.video_format = OT_VIDEO_FORMAT_LINEAR; chn_attr.compress_mode = OT_COMPRESS_MODE_NONE; + /* Orientation is applied at the sensor, not here — same call the + * SigmaStar backends make, and for the same reason: the VI/VPE digital + * path costs bandwidth and behaves inconsistently across sensor combos, + * while the sensor's own H/V reverse is free. See + * apply_sensor_orientation(). */ chn_attr.mirror_en = TD_FALSE; chn_attr.flip_en = TD_FALSE; chn_attr.depth = 0; @@ -490,6 +497,21 @@ static int isp_setup(const Cv610PipelineRuntimeConfig *c) pub.sns_size.width = c->width; pub.sns_size.height = c->height; pub.frame_rate = c->fps; + /* Unchanged by mirror/flip, and that is a measured result rather than + * an assumption. The sensor driver carries a "flipping changes the + * Bayer start phase -- VERIFY on hardware" note, and the textbook + * answer is one XOR per axis into this enum (it is ordered + * (row_phase << 1 | col_phase): RGGB 0, GRBG 1, GBRG 2, BGGR 3). + * + * On IMX662 that is wrong: the reverse shifts the readout window with + * the direction, so the phase the ISP sees does not move. A/B on the + * bench with mirror on, same scene, same binary but for this line — + * with the XOR, mean RGB went 106/98/141 -> 163/33/195, green + * collapsing because the ISP was demosaicing green sites as red and + * blue; without it, 105/96/145, which is the unmirrored frame's colour. + * Geometry was correct in both, so the failure looks like a white + * balance fault rather than an orientation one -- exactly the trap the + * driver comment warns about. */ pub.bayer_format = (ot_isp_bayer_format)c->bayer; pub.wdr_mode = OT_WDR_MODE_NONE; pub.sns_mode = 0; @@ -508,6 +530,61 @@ static int isp_setup(const Cv610PipelineRuntimeConfig *c) return 0; } +/* Program the sensor's H/V reverse through the plugin vtable. + * + * Call site: immediately after isp_setup(). The gate is the plugin's i2c + * file descriptor, which imx662_init() opens as pfn_cmos_sns_init from + * inside ss_mpi_isp_init() — synchronously, on this thread. Before that + * point the driver's register writes return TD_SUCCESS against a closed fd + * and do nothing. It is deliberately BEFORE the ISP thread starts: applied + * after, the first frames and the first AE/AWB statistics are gathered in + * the old orientation and the readout then flips under a converging 3A loop. + * + * Written UNCONDITIONALLY, including the disable, for the reason vpss_setup() + * gives about the crop: an external sensor chip holds whatever it was last + * given, and more stubbornly than any MPP group. The SoC's MIPI reset + * happens to clear 0x3020/0x3021 on this board, but that is board wiring, + * not a property of the sensor — both SigmaStar backends call MI_SNR_SetOrien + * unconditionally and this now matches them. + * + * Non-fatal on a missing vtable entry, matching star6e_pipeline.c and + * maruko_pipeline.c: a craft that boots upside-down beats one that does not + * boot. + * + * The log says "requested", not "ok", and that wording is load-bearing. + * pfn_mirror_flip returns td_void, the driver casts both register writes to + * (td_void), and imx662_write_register() returns TD_SUCCESS even when the + * i2c fd is closed — so there is no success to report at any of the three + * layers. Claiming one would reproduce exactly the failure this function + * exists to abolish: an orientation that silently did nothing, with a log + * line asserting otherwise. */ +static void apply_sensor_orientation(const Cv610PipelineRuntimeConfig *c) +{ + ot_isp_sns_mirrorflip_type type; + + if (g_sns_obj == NULL || g_sns_obj->pfn_mirror_flip == NULL) { + if (c->mirror || c->flip) + fprintf(stderr, + "[pipeline] WARNING: image.mirror/flip requested " + "but the sensor plugin exposes no " + "pfn_mirror_flip — orientation NOT applied\n"); + return; + } + + if (c->mirror && c->flip) + type = ISP_SNS_MIRROR_FLIP; + else if (c->mirror) + type = ISP_SNS_MIRROR; + else if (c->flip) + type = ISP_SNS_FLIP; + else + type = ISP_SNS_NORMAL; + + g_sns_obj->pfn_mirror_flip(VI_PIPE, type); + printf(" ok sensor orientation requested: mirror=%d flip=%d\n", + c->mirror ? 1 : 0, c->flip ? 1 : 0); +} + static int configure_output_color(void) { ot_isp_csc_attr csc; @@ -733,6 +810,8 @@ int cv610_pipeline_start(const Cv610PipelineConfig *config) c.out_height = config->out_height; c.keep_aspect = config->keep_aspect; c.vi_online = config->vi_online; + c.mirror = config->mirror ? 1 : 0; + c.flip = config->flip ? 1 : 0; g_stop = 0; printf("== cv610 sys/vb ==\n"); @@ -752,6 +831,7 @@ int cv610_pipeline_start(const Cv610PipelineConfig *config) configure_output_color() != 0) { return -1; } + apply_sensor_orientation(&c); printf("== cv610 vpss ==\n"); if (vpss_setup(&c) != 0) { return -1; diff --git a/src/cv610_pq_bin.c b/src/cv610_pq_bin.c new file mode 100644 index 00000000..939d9c17 --- /dev/null +++ b/src/cv610_pq_bin.c @@ -0,0 +1,520 @@ +/* PQTools `.bin` import/export for the Hi3516CV610 ISP. + * + * The vendor `libbin.so` carries no public header in the package we have, so + * the call contract below was recovered from the stripped blob. Every offset + * and gate named in a comment here is a disassembly finding, not a guess from + * a related SoC's header -- the older `HI_PQ_BIN` API on Hi3516CV100 has a + * different shape and its error codes do not apply. */ + +#include "cv610_pq_bin.h" + +#include "cv610_pipeline.h" +#include "file_util.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ot_type.h" +#include "ss_mpi_sys.h" + +#define PQ_LOG "[pq] " +#define PQ_BIN_LIB "libbin.so" +#define PQ_AE_LIB "libss_mpi_ae.so" + +/* The pipe cv610_iq.c drives; libbin reaches the 3DNR parameters through it. */ +#define PQ_VI_PIPE 0 + +/* A whole ISP parameter image is ~140 KB. The cap only exists so a wrong + * path cannot turn into an unbounded allocation. */ +#define PQ_BIN_MAX_BYTES (8u * 1024u * 1024u) + +/* Smallest length we will believe from OT_PQ_GetISPDataTotalLen. It answers 4 + * on an empty module table; a real image on this SDK is 143424. */ +#define PQ_ISP_LEN_FLOOR 1024u + +/* Allocation slack for export; see the comment at the calloc. */ +#define PQ_EXPORT_SLACK 64u + +/* Mirrors the fields libbin.so actually reads: OT_PQ_BIN_ImportBinData (@0xd9c) + * reads the two enables at +0 and +4, and OT_PQ_BIN_ImportNRXData (@0x14e4) + * passes +8 to PQ_BIN_SetPipeNRXParam as the VI pipe. The vendor struct's tail + * is unidentified, so the pad keeps anything past +8 reading as zero instead of + * off the end of our allocation. */ +typedef struct { + int isp_enable; + int nr_enable; + int vi_pipe; + int reserved[13]; +} PqBinModule; + +typedef struct { + void *bin; + void *ae; + /* Storage that libbin's `g_aeHandle` is pointed AT -- it is a `void **` + * and the library loads through it, so the pointed-to object has to + * outlive pq_lib_open(). It does not have to outlive the caller: this + * struct is a local in import/export and lives across the whole transfer, + * which is the last moment libbin reads it. Keeping it here rather than + * at file scope is what avoids adding global mutable state. */ + void *ae_handle_slot; + void *import_bin; /* int (*)(PqBinModule *, unsigned char *, unsigned int) */ + void *export_bin; /* int (*)(PqBinModule *, unsigned char *, unsigned int) */ + void *isp_total_len; /* unsigned int (*)(void) */ + void *struct_param_len;/* unsigned int (*)(PqBinModule *) */ +} PqBinLib; + +typedef int (*pq_transfer_fn)(PqBinModule *, unsigned char *, unsigned int); +typedef unsigned int (*pq_isp_len_fn)(void); +typedef unsigned int (*pq_struct_len_fn)(PqBinModule *); + +static void pq_lib_close(PqBinLib *lib) +{ + if (lib->bin) { + /* Clear libbin's g_aeHandle before it can outlive the slot it points + * at. musl's dlclose is a no-op, so the library stays mapped with + * whatever we last wrote there; leaving it aimed at a returned + * stack frame would be a dangling pointer for the next caller to + * trip over. */ + void **ae_slot = (void **)dlsym(lib->bin, "g_aeHandle"); + + if (ae_slot) + *ae_slot = NULL; + dlclose(lib->bin); + } + if (lib->ae) + dlclose(lib->ae); + memset(lib, 0, sizeof(*lib)); +} + +/* libbin.so's DT_NEEDED lists only libc, but it carries undefined ss_mpi_* + * symbols that the host process must already provide. RTLD_NOW is deliberate: + * a process that cannot satisfy them should fail here, with dlerror() naming + * the symbol, rather than part-way through writing ISP registers. */ +static int pq_lib_open(PqBinLib *lib) +{ + void **ae_slot; + + memset(lib, 0, sizeof(*lib)); + + /* RTLD_LOCAL: every entry point is reached through dlsym() on this + * handle, so libbin never needs to export into the global scope -- and + * musl's dlclose is a no-op, so anything it did export would stay there + * for the life of the process, where it could satisfy a later plugin's + * lookup. The undefined ss_mpi_* symbols it carries resolve from the + * executable and its DT_NEEDED libraries either way; that is what makes + * RTLD_NOW here a real check rather than a formality. */ + lib->bin = dlopen(PQ_BIN_LIB, RTLD_NOW | RTLD_LOCAL); + if (!lib->bin) { + fprintf(stderr, "WARNING: %sunable to load %s (%s)\n", PQ_LOG, + PQ_BIN_LIB, dlerror()); + return -1; + } + + lib->import_bin = dlsym(lib->bin, "OT_PQ_BIN_ImportBinData"); + lib->export_bin = dlsym(lib->bin, "OT_PQ_BIN_ExportBinData"); + lib->isp_total_len = dlsym(lib->bin, "OT_PQ_GetISPDataTotalLen"); + lib->struct_param_len = dlsym(lib->bin, "OT_PQ_GetStructParamLen"); + if (!lib->import_bin || !lib->export_bin || !lib->isp_total_len || + !lib->struct_param_len) { + fprintf(stderr, "WARNING: %s%s is missing a PQ bin entry point\n", + PQ_LOG, PQ_BIN_LIB); + pq_lib_close(lib); + return -1; + } + + /* libbin resolves the AE MPI through this global rather than through a + * link-time dependency. Left unset, the AE ext-register record -- one of + * the three the file carries -- has nowhere to land. + * + * The indirection is the trap: g_aeHandle is a `void **`, and libbin + * dereferences it TWICE (BIN_OpenDllFunc loads the global, then loads + * through it before calling dlsym). Storing the dlopen handle directly + * makes it dlsym(*(void **)handle, ...) -- on musl that reads the first + * word of struct dso and resolves nothing, silently, while we print + * success. So point the global at a variable that HOLDS the handle, and + * give that variable static lifetime: libbin reads it after this + * function returns. */ + lib->ae = dlopen(PQ_AE_LIB, RTLD_NOW | RTLD_LOCAL); + ae_slot = (void **)dlsym(lib->bin, "g_aeHandle"); + if (!lib->ae || !ae_slot) { + /* Clear it: a previous open may have left a handle there, and a + * stale one is worse than none. */ + if (ae_slot) + *ae_slot = NULL; + fprintf(stderr, "WARNING: %sno %s handle; AE parameters will not " + "transfer\n", PQ_LOG, PQ_AE_LIB); + } else { + lib->ae_handle_slot = lib->ae; + *ae_slot = &lib->ae_handle_slot; + } + + return 0; +} + +/* Both transfers refuse to run unless the ISP reports a tuning connection -- + * the same channel PQTools uses live. We restore the previous value so a + * one-shot import does not leave the ISP in tuning mode for the rest of the + * session. */ +static int pq_tuning_begin(td_s32 *saved) +{ + td_s32 connected = 0; + + if (ss_mpi_sys_get_tuning_connect(&connected) != TD_SUCCESS) { + fprintf(stderr, "WARNING: %scannot read the tuning connect state\n", + PQ_LOG); + return -1; + } + *saved = connected; + if (connected) + return 0; + + if (ss_mpi_sys_set_tuning_connect(1) != TD_SUCCESS) { + fprintf(stderr, "WARNING: %scannot enable the tuning connection\n", + PQ_LOG); + return -1; + } + return 0; +} + +static void pq_tuning_end(td_s32 saved) +{ + if (!saved) + (void)ss_mpi_sys_set_tuning_connect(0); +} + +static unsigned char *pq_read_file(const char *path, size_t *out_len) +{ + unsigned char *buf; + long size; + FILE *f; + + f = fopen(path, "rb"); + if (!f) { + fprintf(stderr, "WARNING: %scannot open %s\n", PQ_LOG, path); + return NULL; + } + if (fseek(f, 0, SEEK_END) != 0 || (size = ftell(f)) < 0 || + fseek(f, 0, SEEK_SET) != 0) { + fprintf(stderr, "WARNING: %scannot size %s\n", PQ_LOG, path); + fclose(f); + return NULL; + } + if ((unsigned long)size > PQ_BIN_MAX_BYTES) { + fprintf(stderr, "WARNING: %s%s is %ld bytes, over the %u byte cap\n", + PQ_LOG, path, size, PQ_BIN_MAX_BYTES); + fclose(f); + return NULL; + } + + buf = malloc((size_t)size); + if (!buf) { + fprintf(stderr, "WARNING: %scannot allocate %ld bytes for %s\n", + PQ_LOG, size, path); + fclose(f); + return NULL; + } + if (fread(buf, 1, (size_t)size, f) != (size_t)size) { + fprintf(stderr, "WARNING: %sshort read on %s\n", PQ_LOG, path); + free(buf); + fclose(f); + return NULL; + } + fclose(f); + + *out_len = (size_t)size; + return buf; +} + +int cv610_pq_bin_available(void) +{ + /* Deliberately narrower than pq_lib_open(): this only answers "is the blob + * here and loadable", so it touches none of the library's own globals. + * The answer gates what /api/v1/capabilities advertises -- a craft flashed + * without libbin.so should not claim a control surface it cannot serve. + * + * Not memoized. cv610_init() is the single caller and calls it once, so a + * cache would buy nothing and would be exactly the file-scope mutable + * state the conventions rule out. */ + int ok; + void *h; + + h = dlopen(PQ_BIN_LIB, RTLD_NOW | RTLD_LOCAL); + if (!h) { + fprintf(stderr, "WARNING: %s%s not loadable (%s); isp.sensorBin and " + "the .bin export are unavailable on this craft\n", PQ_LOG, + PQ_BIN_LIB, dlerror()); + return 0; + } + /* All four, matching what pq_lib_open() insists on: a partial blob that + * resolves only the import symbol would answer "available" here and then + * fail every export. */ + ok = dlsym(h, "OT_PQ_BIN_ImportBinData") != NULL && + dlsym(h, "OT_PQ_BIN_ExportBinData") != NULL && + dlsym(h, "OT_PQ_GetISPDataTotalLen") != NULL && + dlsym(h, "OT_PQ_GetStructParamLen") != NULL; + if (!ok) + fprintf(stderr, "WARNING: %s%s is missing a PQ entry point\n", PQ_LOG, + PQ_BIN_LIB); + dlclose(h); + return ok; +} + +int cv610_pq_bin_import(const char *path) +{ + unsigned int isp_len, nrx_len, remainder; + PqBinModule mod; + PqBinLib lib; + unsigned char *buf; + td_s32 saved; + size_t len = 0; + int ret; + + if (!path || !*path) + return 0; + + /* The same readiness gate every cv610_iq entry point makes. Both call + * sites are after pipeline start today, so this cannot bite -- it is here + * because a module that writes ISP registers should not be the one that + * omits it. */ + if (!cv610_pipeline_isp_ready()) { + fprintf(stderr, "WARNING: %sISP not running; %s not applied\n", + PQ_LOG, path); + return -1; + } + + if (file_util_validate_regular_file(path, "PQ bin", PQ_LOG) != 0) + return -1; + + if (pq_lib_open(&lib) != 0) + return -1; + + buf = pq_read_file(path, &len); + if (!buf) { + pq_lib_close(&lib); + return -1; + } + + /* The file is [ISP image of exactly this length][optional NRX section]. + * The length is a property of the running SDK, so asking the library is + * also the version check: a tune built against a different ISP generation + * does not have an ISP image of this size. */ + isp_len = ((pq_isp_len_fn)lib.isp_total_len)(); + /* OT_PQ_GetISPDataTotalLen returns 4 -- the record-count word alone -- + * when its module table is empty, so "== 0" is not the degenerate case. + * Anything under a kilobyte is not an ISP image. */ + if (isp_len < PQ_ISP_LEN_FLOOR || len < isp_len) { + fprintf(stderr, "WARNING: %s%s holds %zu bytes; this SDK's ISP image " + "is %u -- wrong ISP version for this chip\n", PQ_LOG, path, len, + isp_len); + free(buf); + pq_lib_close(&lib); + return -1; + } + remainder = (unsigned int)(len - isp_len); + + memset(&mod, 0, sizeof(mod)); + mod.isp_enable = 1; + mod.vi_pipe = PQ_VI_PIPE; + + /* Gate the 3DNR half on the section length the library itself expects. + * A header-size check is not enough: ImportNRXData does not forward our + * length to PQ_BIN_SetNRDataV2, which memcpy's a fixed ~1298-byte payload + * out of the buffer and only compares the declared size AFTERWARDS. So a + * validly-headed but truncated file -- an interrupted scp, a full tmpfs -- + * would read past the end of this allocation and push uninitialised heap + * into the 3DNR registers. Asking the library for the size is the same + * authority we already trust for the ISP half. + * + * Skipping the section rather than letting the library refuse it is + * deliberate: its refusal is the return value of the WHOLE call and would + * mask an ISP half that landed. */ + nrx_len = ((pq_struct_len_fn)lib.struct_param_len)(&mod); + mod.nr_enable = (nrx_len && remainder >= nrx_len) ? 1 : 0; + if (remainder && !mod.nr_enable) + fprintf(stderr, "WARNING: %s%s carries %u trailing bytes; the 3DNR " + "section needs %u -- importing the ISP half only\n", PQ_LOG, path, + remainder, nrx_len); + + if (pq_tuning_begin(&saved) != 0) { + free(buf); + pq_lib_close(&lib); + return -1; + } + printf("> %sloading %s (%u B ISP + %u B 3DNR)\n", PQ_LOG, path, isp_len, + mod.nr_enable ? nrx_len : 0); + ret = ((pq_transfer_fn)lib.import_bin)(&mod, buf, (unsigned int)len); + pq_tuning_end(saved); + + free(buf); + pq_lib_close(&lib); + + if (ret != 0) { + fprintf(stderr, "ERROR: %sOT_PQ_BIN_ImportBinData failed 0x%x for %s\n", + PQ_LOG, (unsigned)ret, path); + return -1; + } + /* The image carried an AE ext-register record, so the ceilings latched + * from the pre-import ISP are stale. Invalidating them is the CALLER's + * job: it owns that cache, and this module has no business reaching into + * a sibling's state to do it. */ + printf("> %sISP tuning applied from %s\n", PQ_LOG, path); + return 0; +} + +int cv610_pq_bin_export(const char *path) +{ + unsigned int isp_len, nrx_len, need; + PqBinModule mod; + PqBinLib lib; + unsigned char *buf; + struct stat st; + td_s32 saved; + FILE *f; + int ret, fd; + + if (!path || !*path) { + fprintf(stderr, "WARNING: %sexport needs a destination path\n", PQ_LOG); + return -1; + } + + if (pq_lib_open(&lib) != 0) + return -1; + + memset(&mod, 0, sizeof(mod)); + mod.isp_enable = 1; + mod.vi_pipe = PQ_VI_PIPE; + + isp_len = ((pq_isp_len_fn)lib.isp_total_len)(); + nrx_len = ((pq_struct_len_fn)lib.struct_param_len)(&mod); + + /* nr_enable is decided by the ANSWER, not asserted before the question. + * OT_PQ_GetStructParamLen returns 0 when the 3DNR query or its internal + * malloc fails, and ExportBinData recomputes the same sum and requires + * EXACT equality with our length -- so a hardcoded nr_enable=1 with a + * zero-length section passes that check and then writes the 37-byte NRX + * header at buf + isp_len, one past the end. Asking for zero bytes of + * 3DNR is the one request the library will happily overrun. */ + mod.nr_enable = nrx_len ? 1 : 0; + need = isp_len + (mod.nr_enable ? nrx_len : 0); + if (isp_len < PQ_ISP_LEN_FLOOR || need < isp_len || + need > PQ_BIN_MAX_BYTES) { + fprintf(stderr, "WARNING: %simplausible export size %u + %u\n", PQ_LOG, + isp_len, nrx_len); + pq_lib_close(&lib); + return -1; + } + if (!mod.nr_enable) + fprintf(stderr, "WARNING: %s3DNR parameters unavailable; exporting the " + "ISP half only\n", PQ_LOG); + + /* Slack, but `need` is still what we pass as the length. The vendor's + * two size formulas disagree with each other -- the writer branches on a + * different field value than the sizer does, and on a path this chip does + * not take it would emit up to 1410 bytes into a 1350-byte region. The + * length argument must stay exact (the check is a != , not a <=), so the + * only place to absorb that is the allocation. */ + buf = calloc(1, (size_t)need + PQ_EXPORT_SLACK); + if (!buf) { + fprintf(stderr, "WARNING: %scannot allocate %u bytes for export\n", + PQ_LOG, need); + pq_lib_close(&lib); + return -1; + } + + if (pq_tuning_begin(&saved) != 0) { + free(buf); + pq_lib_close(&lib); + return -1; + } + ret = ((pq_transfer_fn)lib.export_bin)(&mod, buf, need); + pq_tuning_end(saved); + pq_lib_close(&lib); + + if (ret != 0) { + fprintf(stderr, "ERROR: %sOT_PQ_BIN_ExportBinData failed 0x%x\n", + PQ_LOG, (unsigned)ret); + free(buf); + return -1; + } + + /* O_NOFOLLOW, and then confirm what we actually opened. + * + * The HTTP handler always passes a predictable path in a world-writable + * /tmp, and the endpoint is unauthenticated, so a local user can plant a + * symlink there and redirect this write to anything the daemon may write. + * O_NOFOLLOW refuses a symlinked final component; the fstat then rejects + * anything that is not a plain, single-linked regular file, which is what + * catches a planted HARD link -- O_NOFOLLOW does not, since a hard link is + * the same inode rather than a link object. + * + * Truncation is deliberately NOT in the open flags. O_TRUNC executes + * inside open(), i.e. BEFORE the guard below can refuse, so a planted hard + * link to (say) the daemon's own log would be zeroed on the way to being + * rejected -- the refusal would destroy the file it declined to write. + * Truncate only once the fd is known to be a private regular file. + * + * O_NONBLOCK likewise matters: a planted FIFO would otherwise park open() + * forever, and this runs on the single HTTP dispatch thread under its + * mutex, so it would wedge the whole API and deadlock teardown's pause. + * Regular files ignore the flag, so nothing needs clearing afterwards. + * + * Deliberately NOT unlink-then-create: that reopens a window to re-plant + * between the two calls. */ + fd = open(path, O_WRONLY | O_CREAT | O_NOFOLLOW | O_NONBLOCK, 0644); + if (fd < 0) { + fprintf(stderr, "ERROR: %scannot write %s (%s)\n", PQ_LOG, path, + strerror(errno)); + free(buf); + return -1; + } + if (fstat(fd, &st) != 0) { + fprintf(stderr, "ERROR: %scannot stat %s (%s); refusing to write\n", + PQ_LOG, path, strerror(errno)); + close(fd); + free(buf); + return -1; + } + if (!S_ISREG(st.st_mode) || st.st_nlink != 1) { + fprintf(stderr, "ERROR: %s%s is not a private regular file " + "(mode 0%o, links %lu); refusing to write\n", PQ_LOG, path, + (unsigned)(st.st_mode & 07777), (unsigned long)st.st_nlink); + close(fd); + free(buf); + return -1; + } + if (ftruncate(fd, 0) != 0) { + fprintf(stderr, "ERROR: %scannot truncate %s (%s)\n", PQ_LOG, path, + strerror(errno)); + close(fd); + free(buf); + return -1; + } + f = fdopen(fd, "wb"); + if (!f) { + fprintf(stderr, "ERROR: %scannot write %s\n", PQ_LOG, path); + close(fd); + free(buf); + return -1; + } + if (fwrite(buf, 1, need, f) != need) { + fprintf(stderr, "ERROR: %sshort write on %s\n", PQ_LOG, path); + fclose(f); + free(buf); + return -1; + } + if (fclose(f) != 0) { + fprintf(stderr, "ERROR: %scannot flush %s\n", PQ_LOG, path); + free(buf); + return -1; + } + free(buf); + + printf("> %sISP state exported to %s (%u B)\n", PQ_LOG, path, need); + return (int)need; +} diff --git a/src/cv610_runtime.c b/src/cv610_runtime.c index 790b4d79..1ddc61d7 100644 --- a/src/cv610_runtime.c +++ b/src/cv610_runtime.c @@ -4,6 +4,7 @@ #include "cv610_encoder_config.h" #include "pipeline_common.h" #include "cv610_iq.h" +#include "cv610_pq_bin.h" #include "cv610_modes.h" #include "cv610_pipeline.h" #include "debug_osd.h" @@ -18,6 +19,7 @@ #include "venc_rec_writer.h" #include "output_socket.h" #include "rtp_session.h" +#include "rtp_sidecar.h" #include "timing.h" #include "venc_frame_ring.h" #include "venc_ring.h" @@ -27,6 +29,7 @@ #include #include +#include #include #include #include @@ -38,6 +41,7 @@ #include "ot_common.h" #include "ot_common_sys.h" #include "ot_common_venc.h" +#include "ss_mpi_sys.h" #include "ss_mpi_sys_bind.h" #include "ss_mpi_venc.h" @@ -56,6 +60,59 @@ typedef struct { socklen_t destination_len; VencOutputUriType transport; int connected_udp; + /* Live retarget, seqlock-protected. The four transport fields above are + * written by cv610_apply_server() on the httpd thread and read by the + * drain loop on the producer thread, so a naive read can tear a + * sockaddr mid-rewrite. Odd generation = a write is in progress. + * + * Two things this seqlock does NOT cover, both of which were claimed and + * neither of which is true: + * + * 1. Under connectedUdp -- the shipped default in every config -- the + * destination lives in the KERNEL socket, not in these fields, and + * output_socket_configure() retargets it with connect() on the live + * fd. The snapshot cannot reach that, so a udp://a -> udp://b + * retarget can still split one access unit across two receivers. The + * outcome is bounded: the bootstrap IDR that follows re-anchors the + * stream. + * 2. "Only a udp <-> unix switch closes and reopens" is wrong. + * output_socket_configure() also closes the fd when destination fill + * FAILS with the type unchanged -- reachable by setting a hostname + * URI, since nothing here resolves names -- and leaves socket_handle + * -1 across the error return. That window is wider than the type + * switch it was compared to. + * + * Both are inherited: this pattern is copied from star6e_output.c and + * maruko_output.c, which have the same gaps. Fixing it properly means + * validating the destination before the generation bump and routing a + * live transport-TYPE change to the restart class. */ + /* AE ceilings as the sensor plugin seeded them, latched on first apply so + * clearing one back to 0 is not a one-way door. Lives here, in the + * context that already exists, rather than at file scope in cv610_iq.c. */ + Cv610IqAeDefaults ae_defaults; + unsigned transport_gen; + /* Producer-thread snapshot, refreshed once per frame. Same shape as + * Maruko's output batch: take the seqlock once, then every datagram of + * that frame sends from a stable copy. */ + struct { + int socket_handle; + struct sockaddr_storage destination; + socklen_t destination_len; + int connected_udp; + int output_enabled; + } tx; + /* outgoing.enabled as ACTUALLY applied. Gates both transports: a + * disable has to stop the ring writes too, or the field would mean + * "stop sending" on a udp:// craft and nothing at all on a frame-shm:// + * one. */ + int output_enabled; + /* The destination this backend actually programmed. Compared against + * in cv610_apply_server() INSTEAD of the config: venc_api commits the + * new value into g_cfg before dispatching the apply, so a vcfg + * comparison reads equal even for a real change and would skip the + * repoint -- device-verified on Star6E, where the socket stayed on the + * startup destination while /api/v1/config advertised the new one. */ + char applied_server[256]; OutputSocketQueue send_queue; venc_frame_ring_t *frame_ring; /* frame-shm ring low-water measurement. Every frame-shm producer must @@ -67,6 +124,28 @@ typedef struct { * responsible for reacting. */ VencRingLowWater low_water; int low_water_ready; + /* Per-frame metadata channel (protocols/rtp-sidecar.md). Bound once at + * output start and closed unconditionally at output stop, like every + * other CV610 resource: pipeline state here survives a respawn, so a + * flag-guarded teardown leaves the port held by the dead process. */ + RtpSidecarSender sidecar; + /* MPP PTS epoch -> CLOCK_MONOTONIC, sampled once (see + * cv610_capture_us_from_pts). The sidecar contract says capture_us is + * CLOCK_MONOTONIC µs; the encoder's PTS is on the MPP timebase, which + * on this SoC sits seconds away from it. */ + int64_t pts_to_mono_us; + int pts_epoch_valid; + /* Sidecar ENC_INFO frames_since_idr; advanced every frame, not only + * while a probe is subscribed. */ + uint16_t frames_since_idr; + /* Latched egress-pressure state, maintained by venc_observe_pressure() + * on the producer thread exactly as the SigmaStar backends do. The + * wire field is defined as a 75/50 HYSTERESIS flag, not a bare + * threshold, and pressure_frames is "frames observed in pressure" -- + * the `pressure_drops` wire name is retained for ABI stability across + * the v0.9.2 frame-skip rollback and was never a drop count. */ + int pressure_state; + uint32_t pressure_frames; RtpPacketizerState rtp; H26xParamSets param_sets; DebugOsdState *debug_osd; @@ -132,6 +211,7 @@ typedef struct { * yet joined a writer whose sink outlived the stop deadline, so their * descriptors are still live and a new recording must not reuse them. */ int rec_reap_pending; + PipelineRateWatch rate_watch; } Cv610RunnerContext; /* Backend selection and the vendor MPP graph are process-singleton. The @@ -689,11 +769,135 @@ static void cv610_record_status_callback(VencRecordStatus *out) } } +/* Convert an encoder PTS to the CLOCK_MONOTONIC µs the sidecar contract + * requires for capture_us. MPP keeps its own timebase: measured on .181 it + * ran ~4.63 s ahead of CLOCK_MONOTONIC, so publishing the raw PTS put + * capture_us *after* frame_ready_us and made the encode-duration derivation + * come out negative — a field that looks populated and cannot be trended. + * + * The offset is sampled once, lazily, on the first frame that needs it: by + * then MI_SYS is up, which it need not be when the output is started. Both + * clocks are read microseconds apart, which is noise against a seconds-scale + * offset. Returns 0 — the contract's "not available" — while the epoch is + * unknown, rather than a number on the wrong base. */ +static uint64_t cv610_capture_us_from_pts(Cv610RunnerContext *ctx, uint64_t pts) +{ + int64_t mono_us; + + if (pts == 0) + return 0; + if (!ctx->pts_epoch_valid) { + td_u64 cur_pts = 0; + uint64_t now_us = wb_monotonic_us(); + + if (ss_mpi_sys_get_cur_pts(&cur_pts) != TD_SUCCESS || cur_pts == 0) + return 0; + ctx->pts_to_mono_us = (int64_t)now_us - (int64_t)cur_pts; + ctx->pts_epoch_valid = 1; + } + mono_us = (int64_t)pts + ctx->pts_to_mono_us; + return mono_us > 0 ? (uint64_t)mono_us : 0; +} + +/* One observation of whatever transport is carrying video, in the shape both + * consumers need: the /api/v1/transport/status route and the per-frame sidecar + * TRANSPORT_INFO trailer. They read the same collector so the number an + * operator sees over HTTP and the number a probe sees on the wire cannot + * disagree. */ +typedef struct { + int active; + int is_ring; + const char *name; /* "frame-shm" | "unix" | "udp" | "none" */ + uint8_t fill_pct; + int have_fill; /* 0 = fill_pct is not a measurement */ + int in_pressure; /* latched hysteresis flag, not fill>=HW */ + uint32_t pressure_frames; /* frames observed in pressure */ + uint64_t transport_drops; /* ring: full drops; socket: send failures */ + uint64_t packets_sent; /* ring: writes; socket: datagrams */ + /* Ring-only; zero on the socket transports. */ + uint64_t oversize_drops; + uint64_t other_drops; + uint32_t slot_count; + uint32_t used_slots; +} Cv610TransportSample; + +/* `fill` lets the drain loop hand over the ring reading it already took for + * the low-water window, so a subscribed sidecar costs one ring load per frame + * rather than two. Pass NULL to read it here (the HTTP route, on the httpd + * thread). Returns -1 only when the ring read fails. */ +static int cv610_collect_transport(Cv610RunnerContext *ctx, + const venc_frame_ring_fill_t *fill, Cv610TransportSample *out) +{ + venc_frame_ring_fill_t local; + + if (!ctx || !out) + return -1; + memset(out, 0, sizeof(*out)); + out->name = "none"; + + if (ctx->frame_ring) { + if (!fill) { + if (venc_frame_ring_get_fill(ctx->frame_ring, &local) != 0) + return -1; + fill = &local; + } + out->active = 1; + out->is_ring = 1; + out->name = "frame-shm"; + out->fill_pct = fill->fill_pct; + out->transport_drops = fill->full_drops; + out->packets_sent = fill->writes; + out->oversize_drops = fill->oversize_drops; + out->other_drops = fill->other_drops; + out->slot_count = fill->slot_count; + out->used_slots = fill->used_slots; + out->have_fill = 1; + } else if (ctx->socket_handle >= 0) { + uint8_t fill_pct = 0; + + /* A failed SIOCOUTQ is "unknown", never "empty". Publishing the + * substituted 0 as a measurement fed a real sample to the pressure + * observer and could report a full queue as fillPct 0 / inPressure + * false. star6e_output.c keys on have_fill for the same reason and + * declines to observe; this now matches it. */ + out->have_fill = output_socket_get_fill_pct(ctx->socket_handle, + &ctx->send_queue, &fill_pct) == 0; + out->active = 1; + out->name = ctx->transport == VENC_OUTPUT_URI_UNIX ? "unix" : "udp"; + out->fill_pct = out->have_fill ? fill_pct : 0; + out->transport_drops = __atomic_load_n(&ctx->output_drops, + __ATOMIC_RELAXED); + out->packets_sent = __atomic_load_n(&ctx->packets_sent, + __ATOMIC_RELAXED); + } + /* Sample-point divergence, deliberate and worth knowing: this backend + * reads the ring fill AFTER writing the current frame, while Star6E + * observes before its send. On an 8-slot ring that is a systematic one + * slot (12.5 percentage points) of extra occupancy in fill_pct. Moving + * it would also move the low-water window, which is pre-existing + * behaviour outside this change's scope; recorded here so a consumer + * comparing fill_pct across craft types is not surprised. + * + * Report the latched flag rather than recomputing fill >= high-water: + * the header defines this field as the hysteresis flag, and a bare + * threshold would make an operator's HTTP reading and a probe's wire + * reading disagree with the SigmaStar backends for identical ring + * behaviour. The producer thread does the observing. */ + out->in_pressure = out->active && + __atomic_load_n(&ctx->pressure_state, __ATOMIC_RELAXED); + out->pressure_frames = __atomic_load_n(&ctx->pressure_frames, + __ATOMIC_RELAXED); + return 0; +} + /* Star6E/Maruko parity — see star6e_service_ring_low_water(). venc measures - * egress pressure and publishes it; it never acts on it. */ -static void cv610_service_ring_low_water(Cv610RunnerContext *ctx) + * egress pressure and publishes it; it never acts on it. + * + * `fill` is the reading the caller already took for this frame; NULL means + * there is no ring, or the read failed. */ +static void cv610_service_ring_low_water(Cv610RunnerContext *ctx, + const venc_frame_ring_fill_t *fill) { - venc_frame_ring_fill_t fill; uint64_t now_us; if (!ctx) @@ -703,8 +907,7 @@ static void cv610_service_ring_low_water(Cv610RunnerContext *ctx) * ring's first sample and publish "perfectly drained" over a ring * that is full. Unreachable today (the context is created once per * process), kept symmetric so it stays that way. */ - if (!ctx->frame_ring || - venc_frame_ring_get_fill(ctx->frame_ring, &fill) != 0) { + if (!fill) { venc_ring_low_water_reset(&ctx->low_water, 0); ctx->low_water_ready = 0; return; @@ -716,8 +919,8 @@ static void cv610_service_ring_low_water(Cv610RunnerContext *ctx) ctx->low_water_ready = 1; } - venc_ring_low_water_observe(&ctx->low_water, fill.used_slots, - fill.slot_count); + venc_ring_low_water_observe(&ctx->low_water, fill->used_slots, + fill->slot_count); if (venc_ring_low_water_tick(&ctx->low_water, now_us)) venc_frame_ring_set_low_water(ctx->frame_ring, venc_ring_low_water_slots(&ctx->low_water)); @@ -733,51 +936,42 @@ static char *cv610_query_transport_status(void) Cv610RunnerContext *ctx = g_cv610_runner; char buf[640]; int pos; - uint64_t drops; + Cv610TransportSample ts; if (!ctx) return NULL; - drops = __atomic_load_n(&ctx->output_drops, __ATOMIC_RELAXED); - if (ctx->frame_ring) { - venc_frame_ring_fill_t fill; - - if (venc_frame_ring_get_fill(ctx->frame_ring, &fill) != 0) - return NULL; + if (cv610_collect_transport(ctx, NULL, &ts) != 0) + return NULL; + if (ts.is_ring) { pos = snprintf(buf, sizeof(buf), "{\"ok\":true,\"data\":{" "\"active\":true,\"transport\":\"frame-shm\"," "\"fillPct\":%u,\"inPressure\":%s," - "\"transportDrops\":%llu,\"pressureDrops\":0," + "\"transportDrops\":%llu,\"pressureDrops\":%u," "\"framesSent\":%llu,\"oversizeDrops\":%llu," "\"slotCount\":%u,\"usedSlots\":%u," "\"ringLowWaterSlots\":%u,\"otherDrops\":%llu}}", - (unsigned)fill.fill_pct, - fill.fill_pct >= VENC_PRESSURE_HIGH_WATER_PCT ? "true" : "false", - (unsigned long long)fill.full_drops, - (unsigned long long)fill.writes, - (unsigned long long)fill.oversize_drops, - (unsigned)fill.slot_count, (unsigned)fill.used_slots, + (unsigned)ts.fill_pct, + ts.in_pressure ? "true" : "false", + (unsigned long long)ts.transport_drops, + (unsigned)ts.pressure_frames, + (unsigned long long)ts.packets_sent, + (unsigned long long)ts.oversize_drops, + (unsigned)ts.slot_count, (unsigned)ts.used_slots, (unsigned)venc_ring_low_water_slots(&ctx->low_water), - (unsigned long long)fill.other_drops); - } else if (ctx->socket_handle >= 0) { - uint8_t fill_pct = 0; - const char *transport = ctx->transport == VENC_OUTPUT_URI_UNIX - ? "unix" : "udp"; - - if (output_socket_get_fill_pct(ctx->socket_handle, &ctx->send_queue, - &fill_pct) != 0) - fill_pct = 0; + (unsigned long long)ts.other_drops); + } else if (ts.active) { pos = snprintf(buf, sizeof(buf), "{\"ok\":true,\"data\":{" "\"active\":true,\"transport\":\"%s\"," "\"fillPct\":%u,\"inPressure\":%s," - "\"pressureDrops\":0,\"transportDrops\":%llu," + "\"pressureDrops\":%u,\"transportDrops\":%llu," "\"packetsSent\":%llu}}", - transport, (unsigned)fill_pct, - fill_pct >= VENC_PRESSURE_HIGH_WATER_PCT ? "true" : "false", - (unsigned long long)drops, - (unsigned long long)__atomic_load_n(&ctx->packets_sent, - __ATOMIC_RELAXED)); + ts.name, (unsigned)ts.fill_pct, + ts.in_pressure ? "true" : "false", + (unsigned)ts.pressure_frames, + (unsigned long long)ts.transport_drops, + (unsigned long long)ts.packets_sent); } else { pos = snprintf(buf, sizeof(buf), "{\"ok\":true,\"data\":{" @@ -826,6 +1020,416 @@ static char *cv610_query_audio_status(void) return strdup(buf); } +/* Horizontal centre-priority ROI bands -- the same geometry the two SigmaStar + * backends draw (pipeline_common_roi_band); only the SDK struct differs. + * ot_venc_roi_attr is field-for-field MI_VENC_RoiCfg_t, and this part accepts a + * wider delta ([-51, 51] for H.265) than the +/-30 the shared API clamps to, so + * nothing here needs a per-backend range. + * + * Geometry comes from the channel attr rather than a cached width: it is what + * the encoder is actually running, and the get doubles as the "channel exists" + * guard, so a live set arriving before cv610_venc_start() refuses instead of + * programming bands against a zero-size frame. + * + * The readback is a WRITE check, not an effect check. It catches an SDK that + * clamped or silently dropped a rectangle; it cannot tell whether the rate + * controller acts on the delta. That distinction is not theoretical here -- + * issue #259 is a QP control on the sibling parts that returns success, logs as + * applied, reads back clean, and never moves the bitstream, and this part's own + * CBR does the same with ip_qp_delta (see the create-time comment in + * cv610_venc_start). The effect is a decoded-bitstream measurement, not an API + * call: a horizontal detail profile has to step at the programmed rect edges. */ +static int cv610_apply_roi_qp(int qp) +{ + ot_venc_chn_attr attr; + ot_venc_roi_attr roi; + const VencConfig *cfg = g_cv610_runner ? &g_cv610_runner->config : NULL; + uint32_t width, height; + uint16_t steps; + float center_frac; + int i; + int ok = 1; + int programmed = 0; + + if (!cfg) + return -1; + + memset(&attr, 0, sizeof(attr)); + if (ss_mpi_venc_get_chn_attr(CV610_VENC_CHN, &attr) != TD_SUCCESS) + return -1; + width = attr.venc_attr.pic_width; + height = attr.venc_attr.pic_height; + if (width == 0 || height == 0) + return -1; + + /* Clear first, unconditionally, so a shrinking steps count cannot leave + * a stale outer band enabled -- the same order both SigmaStar backends + * use. Only the indices this backend ever writes are cleared; the part + * offers OT_VENC_MAX_ROI_NUM (8) and nothing here touches 4..7. */ + for (i = 0; i < PIPELINE_ROI_MAX_STEPS; i++) { + td_s32 cret; + + memset(&roi, 0, sizeof(roi)); + roi.idx = (td_u32)i; + roi.enable = TD_FALSE; + cret = ss_mpi_venc_set_roi_attr(CV610_VENC_CHN, &roi); + /* Checked, not discarded. The rect is all-zero here, and the + * SDK header documents no rule on whether a disable still + * range-checks it. If a clear is refused, the stale band stays + * enabled with its previous geometry -- so shrinking roiSteps + * from 4 to 2 would leave indices 2 and 3 holding the 4-step + * rects, overlapping the new pair with the wrong taper, while + * this function logged success. */ + if (cret != TD_SUCCESS) { + fprintf(stderr, "ERROR: ROI[%d] clear=0x%x (stale band " + "may still be enabled)\n", i, (unsigned)cret); + ok = 0; + } + } + + if (!cfg->fpv.roi_enabled || qp == 0) { + /* Name the cause -- see the matching comment in + * star6e_controls.c's apply_roi_qp(). A NULL cfg returned -1 + * above, so only two states reach here. */ + printf("> ROI disabled (%s), %s\n", + !cfg->fpv.roi_enabled ? "roiEnabled=false" : + "roiQp=0, no delta to apply", + ok ? "all regions cleared" : + "CLEAR FAILED, see above"); + return ok ? 0 : -1; + } + + if (qp < -20) qp = -20; + if (qp > 20) qp = 20; + + steps = cfg->fpv.roi_steps; + if (steps < 1) steps = 1; + if (steps > PIPELINE_ROI_MAX_STEPS) steps = PIPELINE_ROI_MAX_STEPS; + + center_frac = (float)cfg->fpv.roi_center; + if (center_frac < 0.1f) center_frac = 0.1f; + if (center_frac > 0.9f) center_frac = 0.9f; + + for (i = 0; i < steps; i++) { + PipelineRoiBand band; + ot_venc_roi_attr back; + td_s32 ret; + + if (pipeline_common_roi_band(width, height, center_frac, qp, + steps, i, &band) != 0) + continue; + + memset(&roi, 0, sizeof(roi)); + roi.idx = (td_u32)i; + roi.enable = TD_TRUE; + roi.is_abs_qp = TD_FALSE; + roi.qp = band.qp; + roi.rect.x = (td_s32)band.x; + roi.rect.y = (td_s32)band.y; + roi.rect.width = band.width; + roi.rect.height = band.height; + + ret = ss_mpi_venc_set_roi_attr(CV610_VENC_CHN, &roi); + if (ret != TD_SUCCESS) { + fprintf(stderr, "ERROR: ROI[%d] set=0x%x rect=(%u,%u %ux%u) " + "qp=%+d\n", i, (unsigned)ret, band.x, band.y, + band.width, band.height, band.qp); + ok = 0; + continue; + } + + memset(&back, 0, sizeof(back)); + if (ss_mpi_venc_get_roi_attr(CV610_VENC_CHN, (td_u32)i, + &back) != TD_SUCCESS) { + fprintf(stderr, "ERROR: ROI[%d] readback failed\n", i); + ok = 0; + } else if (!back.enable || back.qp != band.qp || + back.rect.x != (td_s32)band.x || + back.rect.y != (td_s32)band.y || + back.rect.width != band.width || + back.rect.height != band.height) { + /* The ORIGIN is compared too. A driver that re-aligns + * or clamps x displaces the band horizontally, which is + * the one failure this check exists to catch and the + * least visible in the picture. */ + fprintf(stderr, "ERROR: ROI[%d] readback disagrees: " + "enable=%d qp=%+d (%d,%d %ux%u), wrote " + "enable=1 qp=%+d (%u,%u %ux%u)\n", + i, (int)back.enable, (int)back.qp, + (int)back.rect.x, (int)back.rect.y, + (unsigned)back.rect.width, + (unsigned)back.rect.height, + band.qp, band.x, band.y, + band.width, band.height); + ok = 0; + } + programmed++; + } + + if (programmed == 0) { + /* Every band was skipped as degenerate. Saying "ROI horizontal" + * here would assert an ROI that does not exist -- the exact + * class of lie this whole change set is about. */ + fprintf(stderr, "ERROR: ROI programmed no bands at %ux%u " + "(steps=%u center=%.2f)\n", width, height, steps, + (double)center_frac); + return -1; + } + + if (ok) { + printf("> ROI horizontal: %ux%u, %u steps, center=%.0f%%, qp=%+d\n", + width, height, steps, center_frac * 100.0f, qp); + } + + return ok ? 0 : -1; +} + +/* Live destination change. Socket transports only, matching both SigmaStar + * backends: the ring transports are created once at start and a live switch + * across that boundary would have to destroy a ring while a consumer is + * attached, so it is refused in both directions rather than half-supported. + * + * NOTE the consequence, which is inherited from Star6E rather than invented + * here: outgoing.server advertises `live` on every backend, so on a craft + * configured with frame-shm:// the field is live in the capability map and the + * write fails with the message below. That is the existing fleet-wide + * behaviour; making CV610 differ would be the surprise. */ +static int cv610_apply_server(const char *uri) +{ + VencOutputUri parsed; + + if (!g_cv610_runner || !uri) + return -1; + if (venc_config_parse_output_uri(uri, &parsed) != 0) + return -1; + + /* Ring transports are RESTART-CLASS here, not refused. + * + * The ring is created once at start, so it genuinely cannot be switched + * in place -- but refusing outright (which is what both SigmaStar + * backends do) would REGRESS this backend. Before outgoing.server + * became live on CV610 it was restart-required, so writing + * frame-shm://... persisted and took effect on the next boot; a hard + * refusal would make the fleet's normal production transport + * unreachable through the API, leaving hand-editing /etc/waybeam.json + * as the only way to provision a craft. + * + * So: commit the value, ask for the respawn, and report it. Returning + * 0 is what keeps venc_api from rolling the config back; + * venc_api_request_reinit() is what makes the new URI actually take + * effect; and the live-set response carries reinit_pending so the + * caller is told this one is not live. */ + /* The no-op guard comes FIRST, ahead of the ring branch below. Compare + * the APPLIED destination, not the config -- see the applied_server + * comment on the context. An unchanged re-POST must cost nothing: it is + * not a bootstrap event, and firing the un-coalescible IDR on it would + * turn a no-op write into a keyframe at the caller's request rate. + * + * Ordering is load-bearing, not tidiness. With the ring branch first, a + * craft already running frame-shm://venc_frame answered an identical + * re-POST by latching a reinit and respawning -- so every idempotent + * config re-apply from the ground cost a full pipeline restart and a + * multi-second video outage. Star6E compares before it refuses for the + * same reason. */ + if (g_cv610_runner->applied_server[0] && + strcmp(g_cv610_runner->applied_server, uri) == 0) + return 0; + + /* Validate a socket destination BEFORE either branch acts, because both + * of them act destructively on a URI they never checked. + * + * Nothing here resolves names -- the fill is inet_pton only -- so + * `outgoing.server=udp://somehost:5600` used to reach: + * + * - the ring branch, on a craft already running frame-shm://, which + * COMMITS the value and respawns. The re-exec then reloads the bad + * URI, fails to bring the output up, and the daemon stays down -- + * measured on the bench: one HTTP set left the craft dead until the + * config was repaired over ssh. That is worse than the socket case + * below, because it survives the restart and takes video with it. + * - output_socket_configure(), which closes the fd when fill fails -- + * including on the fd-REUSE path where the type is unchanged and the + * socket was working -- leaving socket_handle -1 across the error + * return, the JSON build and the rollback re-entry. + * + * Filling a throwaway sockaddr with the same input the real call will use + * refuses both, with the live transport untouched, nothing committed and + * the generation counter never bumped. One inet_pton on a stack buffer, + * on an operator-rate path. + * + * Gated on the type: the ring URIs carry no sockaddr, and their own + * validity is checked where they are created. */ + if (parsed.type == VENC_OUTPUT_URI_UDP || + parsed.type == VENC_OUTPUT_URI_UNIX) { + struct sockaddr_storage probe_dst; + socklen_t probe_len = 0; + + if (output_socket_fill_destination(&parsed, &probe_dst, + &probe_len) != 0) { + fprintf(stderr, "ERROR: outgoing.server %s has no usable " + "destination; transport left unchanged\n", uri); + return -1; + } + } + + if (g_cv610_runner->frame_ring || + parsed.type == VENC_OUTPUT_URI_SHM || + parsed.type == VENC_OUTPUT_URI_FRAME_SHM) { + printf("> Destination %s requires a restart (ring transports are " + "created once); committed, respawning\n", uri); + /* Record it as applied so the respawn window is idempotent too: + * a second identical write before the drain loop acts must not + * latch a second reinit. */ + snprintf(g_cv610_runner->applied_server, + sizeof(g_cv610_runner->applied_server), "%s", uri); + venc_api_request_reinit(); + return 0; + } + + __atomic_fetch_add(&g_cv610_runner->transport_gen, 1, __ATOMIC_RELEASE); + if (output_socket_configure(&g_cv610_runner->socket_handle, + &g_cv610_runner->destination, &g_cv610_runner->destination_len, + &g_cv610_runner->transport, &parsed, + g_cv610_runner->config.outgoing.connected_udp, + g_cv610_runner->config.outgoing.allow_unix_encoder_stall, + &g_cv610_runner->connected_udp) != 0) { + /* Kept as a backstop, not as the primary defence: the + * destination is now validated above, so the bad-URI route into + * this branch is unreachable and what remains is a genuine + * socket() or bind() failure. output_socket_configure() still + * closes the socket when it fails partway, so the recovery below + * is still required. Clear the applied record so the rollback + * that venc_api runs next actually re-configures instead of + * hitting the no-op guard above and returning 0 -- which left + * the craft with a rolled-back config, an HTTP 500, and no + * video at all until the process restarted. */ + g_cv610_runner->applied_server[0] = '\0'; + __atomic_fetch_add(&g_cv610_runner->transport_gen, 1, + __ATOMIC_RELEASE); + return -1; + } + (void)output_socket_capture_capacity(g_cv610_runner->socket_handle, + &g_cv610_runner->send_queue); + g_cv610_runner->output_uri = parsed; + __atomic_fetch_add(&g_cv610_runner->transport_gen, 1, __ATOMIC_RELEASE); + + snprintf(g_cv610_runner->applied_server, + sizeof(g_cv610_runner->applied_server), "%s", uri); + + /* Move the audio side channel with the video. Its destination is derived + * from the video URI (peer host for udp://, loopback for the local + * transports), so leaving it behind pointed the Opus stream at the OLD + * receiver while video went to the new one -- silently, because nothing + * in the audio path knows the video URI changed. + * + * Not fatal: the video socket has already moved, and returning -1 here + * would send venc_api into a rollback that re-enters this function. A + * craft with video retargeted and audio stale is worse than one with + * video retargeted and a logged audio failure. */ + if (cv610_audio_apply_server(g_cv610_runner->audio, + &g_cv610_runner->config, &parsed) != 0) + fprintf(stderr, "WARN: video retargeted to %s but the audio side " + "channel could not follow; audio is still going to the " + "previous destination\n", uri); + + /* Deliberately NOT fatal past this point, and the reason matters: the + * socket has already moved. Returning -1 sends venc_api into + * rollback_live_groups(), which re-enters this same call -- and if that + * also fails it commits the NEW outgoing.server while the socket sits + * on the OLD one, leaving /api/v1/config advertising a destination venc + * is not sending to. Both SigmaStar backends made the same call. */ + if (cv610_request_idr() != 0) + fprintf(stderr, "WARN: destination changed but the bootstrap IDR " + "request failed; the new receiver has no start point " + "until the next one\n"); + printf("> Destination changed to %s\n", uri); + return 0; +} + +/* Live output enable/disable. + * + * DIVERGENCE FROM STAR6E, deliberate: Star6E also drops the encoder to 5 fps + * while the output is off, to stop burning bitrate on frames nobody receives. + * CV610 cannot -- video0.fps is restart-only on this backend (it reprograms the + * MIPI raw_bit and the RTP clock), so there is no live rate to idle to. This + * gates the send only; the encoder keeps running at its configured rate. + * + * Gates BOTH transports. A disable that stopped udp:// but left the frame-shm + * ring writing would make the field mean two different things depending on how + * the craft happens to be configured. */ +static int cv610_apply_output_enabled(bool on) +{ + if (!g_cv610_runner) + return -1; + + if (g_cv610_runner->output_enabled == (on ? 1 : 0)) + return 0; + + if (!on) { + __atomic_store_n(&g_cv610_runner->output_enabled, 0, + __ATOMIC_RELEASE); + printf("> Output disabled (encoder keeps running; video0.fps is " + "restart-only on this backend, so there is no idle rate " + "to drop to)\n"); + return 0; + } + + /* Enabling needs a transport. A craft that booted with + * outgoing.enabled=false never ran cv610_output_start()'s dispatch, so + * socket_handle is -1 and the RTP session was never seeded -- enabling + * without configuring would send from a closed fd with ssrc/seq 0. */ + if (g_cv610_runner->socket_handle < 0 && !g_cv610_runner->frame_ring) { + if (!g_cv610_runner->config.outgoing.server[0]) { + fprintf(stderr, "> Cannot enable output: no server " + "configured\n"); + return -1; + } + if (cv610_apply_server(g_cv610_runner->config.outgoing.server) != 0) + return -1; + } + + __atomic_store_n(&g_cv610_runner->output_enabled, 1, __ATOMIC_RELEASE); + if (cv610_request_idr() != 0) + fprintf(stderr, "WARN: output enabled but the bootstrap IDR " + "request failed; the receiver has no start point until " + "the next one\n"); + printf("> Output enabled\n"); + return 0; +} + +/* Thin adapters: the shared vtable takes bare values, and the AE-defaults + * cache these three need lives in the runner context rather than at file scope + * in cv610_iq.c. g_cv610_runner is assigned before venc_api_register(), so it + * is non-NULL for every call that can reach these. */ +static int cv610_apply_gain_max(uint32_t gain) +{ + if (!g_cv610_runner) + return -1; + return cv610_iq_set_gain_max(&g_cv610_runner->ae_defaults, gain); +} + +static int cv610_apply_shutter_max(uint32_t us) +{ + if (!g_cv610_runner) + return -1; + return cv610_iq_set_shutter_max_us(&g_cv610_runner->ae_defaults, us); +} + +static int cv610_apply_isp_bin(const char *path) +{ + int rc; + + if (!g_cv610_runner) + return -1; + rc = cv610_pq_bin_import(path); + /* A .bin carries an AE ext-register record, so a successful import makes + * the latched ceilings stale: without this, a later isp.gainMax=0 would + * write the PRE-import value back over the imported one. */ + if (rc == 0) + cv610_iq_forget_ae_defaults(&g_cv610_runner->ae_defaults); + return rc; +} + static const VencApplyCallbacks g_cv610_apply_callbacks = { .apply_bitrate = cv610_apply_bitrate, .apply_gop = cv610_apply_gop, @@ -839,6 +1443,15 @@ static const VencApplyCallbacks g_cv610_apply_callbacks = { .query_awb_info = cv610_awb_query, .apply_iq_param = cv610_iq_set, .apply_qp_bounds = cv610_apply_qp_bounds, + /* Unlike Star6E there is no /etc/sensors/.bin convention to fall + * back to, so an empty isp.sensorBin is a no-op rather than a resolve. */ + .apply_isp_bin = cv610_apply_isp_bin, + .export_isp_bin = cv610_pq_bin_export, + .apply_gain_max = cv610_apply_gain_max, + .apply_shutter_max = cv610_apply_shutter_max, + .apply_roi_qp = cv610_apply_roi_qp, + .apply_server = cv610_apply_server, + .apply_output_enabled = cv610_apply_output_enabled, /* Same shared implementation Star6E and Maruko register; it dispatches * to venc_jpeg_backend_set_quality() under the snapshot module lock, so * a live q change cannot interleave with a capture in progress. Without @@ -853,6 +1466,35 @@ static void cv610_signal_handler(int signo) cv610_pipeline_request_stop(); } +/* Seqlock read of the transport state, once per frame on the producer thread. + * Retries while cv610_apply_server() holds an odd generation. Mirrors the + * reader in maruko_output_begin_frame(); yields rather than spinning, because + * the writer is a short memcpy-class critical section on another thread and a + * spin here burns the frame budget on a single-core SoC. */ +static void cv610_transport_begin_frame(Cv610RunnerContext *ctx) +{ + unsigned gen_before, gen_after; + + for (;;) { + gen_before = __atomic_load_n(&ctx->transport_gen, + __ATOMIC_ACQUIRE); + if (gen_before & 1u) { + sched_yield(); + continue; + } + ctx->tx.socket_handle = ctx->socket_handle; + ctx->tx.destination = ctx->destination; + ctx->tx.destination_len = ctx->destination_len; + ctx->tx.connected_udp = ctx->connected_udp; + ctx->tx.output_enabled = + __atomic_load_n(&ctx->output_enabled, __ATOMIC_ACQUIRE); + gen_after = __atomic_load_n(&ctx->transport_gen, + __ATOMIC_ACQUIRE); + if (gen_before == gen_after) + break; + } +} + static int cv610_output_write(const uint8_t *header, size_t header_len, const uint8_t *payload1, size_t payload1_len, const uint8_t *payload2, size_t payload2_len, void *opaque) @@ -860,8 +1502,19 @@ static int cv610_output_write(const uint8_t *header, size_t header_len, Cv610RunnerContext *ctx = opaque; int ret; - ret = output_socket_send_parts(ctx->socket_handle, &ctx->destination, - ctx->destination_len, ctx->connected_udp, header, header_len, + /* From the per-frame snapshot, never the live fields: every datagram of + * one frame must go to the same destination, or a retarget landing + * mid-frame splits an access unit across two receivers and neither can + * decode it. + * + * That holds only for the UNCONNECTED path. With connectedUdp set -- + * the shipped default -- msg_name is NULL and the destination is kernel + * state on the fd, so a concurrent connect() retargets mid-frame and the + * snapshot provides none of the protection this comment used to claim. + * See the seqlock note on transport_gen. */ + ret = output_socket_send_parts(ctx->tx.socket_handle, + &ctx->tx.destination, + ctx->tx.destination_len, ctx->tx.connected_udp, header, header_len, payload1, payload1_len, payload2, payload2_len); if (ret != 0) { __atomic_add_fetch(&ctx->output_drops, 1, __ATOMIC_RELAXED); @@ -1375,8 +2028,67 @@ static int cv610_output_start(Cv610RunnerContext *ctx) { RtpSessionState session; - if (!ctx->config.outgoing.enabled) + /* Before the outgoing.enabled bail and before the transport dispatch, + * on every path. rtp_sidecar_sender_init() is what puts -1 in fd; the + * context arrives memset to zero, so an init that is skipped or that + * sits after an early return leaves fd == 0 — a perfectly valid + * descriptor — and the per-frame gate would poll() stdin. */ + if (rtp_sidecar_sender_init(&ctx->sidecar, + ctx->config.outgoing.sidecar_port) != 0) + fprintf(stderr, "WARNING: CV610 sidecar disabled (port %u)\n", + (unsigned)ctx->config.outgoing.sidecar_port); + + ctx->output_enabled = ctx->config.outgoing.enabled ? 1 : 0; + + /* Seed the RTP session BEFORE the outgoing.enabled bail, not after. + * outgoing.enabled is live from 0.77.0, so a craft can boot disabled and + * be enabled over HTTP -- and the context is calloc'd, so bailing first + * left ssrc/seq/timestamp AND frame_ticks at 0. Every packet then went + * out with ssrc 0 and a timestamp that never advanced (timestamp += + * frame_ticks, with frame_ticks 0), which a depacketizer keying AU + * boundaries on the timestamp cannot follow. Star6E seeds + * unconditionally at init and gates only the sends; this now matches. */ + if (!ctx->config.outgoing.enabled) { + RtpSessionState idle; + + rtp_session_init(&idle, rtp_session_payload_type(PT_H265), + ctx->pipeline.fps); + ctx->rtp.seq = idle.seq; + ctx->rtp.timestamp = idle.timestamp; + ctx->rtp.ssrc = idle.ssrc; + ctx->rtp.payload_type = idle.payload_type; + ctx->frame_ticks = idle.frame_ticks; return 0; + } + + /* Seed the RTP session for EVERY transport, not just the socket path. + * The SigmaStar backends gate this on the *stream mode* (rtp vs + * compact), not the transport — star6e_output_is_rtp() reads + * output->stream_mode, and the shipped default is "rtp" — so a Star6E + * craft on frame-shm:// still seeds ssrc/timestamp/seq and puts them on + * the sidecar wire. Seeding only on the socket path made CV610 the one + * backend sending a zero ssrc there, which a consumer keying on + * "ssrc != 0 means session present" would read as a different craft + * state. Nothing else consumes ctx->rtp or frame_ticks off the socket + * path, so this is inert for the ring transports beyond the sidecar. */ + rtp_session_init(&session, rtp_session_payload_type(PT_H265), + ctx->pipeline.fps); + ctx->rtp.seq = session.seq; + ctx->rtp.timestamp = session.timestamp; + ctx->rtp.ssrc = session.ssrc; + ctx->rtp.payload_type = session.payload_type; + ctx->frame_ticks = session.frame_ticks; + + /* Seed the applied-destination record for EVERY transport, before the + * dispatch below returns early on the ring paths. Seeding it only on + * the socket path left a frame-shm:// craft with an empty record, so the + * no-op guard in cv610_apply_server() never matched and an identical + * re-POST of the URI already running fell through to the restart branch + * and respawned the craft -- measured on the bench. No seqlock: the + * drain loop has not started yet. */ + snprintf(ctx->applied_server, sizeof(ctx->applied_server), "%s", + ctx->config.outgoing.server); + if (ctx->output_uri.type == VENC_OUTPUT_URI_FRAME_SHM) { ctx->frame_ring = venc_frame_ring_create(ctx->output_uri.endpoint, CV610_FRAME_RING_SLOTS, CV610_FRAME_RING_BYTES); @@ -1393,18 +2105,19 @@ static int cv610_output_start(Cv610RunnerContext *ctx) &ctx->connected_udp) != 0) return -1; (void)output_socket_capture_capacity(ctx->socket_handle, &ctx->send_queue); - rtp_session_init(&session, rtp_session_payload_type(PT_H265), - ctx->pipeline.fps); - ctx->rtp.seq = session.seq; - ctx->rtp.timestamp = session.timestamp; - ctx->rtp.ssrc = session.ssrc; - ctx->rtp.payload_type = session.payload_type; - ctx->frame_ticks = session.frame_ticks; + /* The RTP session was seeded above, for every transport; re-seeding here + * would re-randomise ssrc/seq/timestamp behind any reader added between + * the two points. */ return 0; } static void cv610_output_stop(Cv610RunnerContext *ctx) { + /* Unconditional, like every other CV610 teardown: a restart-class set + * re-execs without reloading modules, so a port this process still + * holds is a port the successor cannot bind. Safe when init never ran + * or was disabled — sender_close() tolerates fd == -1. */ + rtp_sidecar_sender_close(&ctx->sidecar); if (ctx->frame_ring) { venc_frame_ring_destroy(ctx->frame_ring); ctx->frame_ring = NULL; @@ -1458,6 +2171,8 @@ static int cv610_prepare(void *opaque) ctx->pipeline.lanes = 4; ctx->pipeline.data_rate_x2 = 0; ctx->pipeline.bayer = 0; + ctx->pipeline.mirror = cfg->image.mirror ? 1 : 0; + ctx->pipeline.flip = cfg->image.flip ? 1 : 0; ctx->pipeline.raw_bit = (int)mode->raw_bit; ctx->pipeline.sensor_clock_hz = mode->sensor_clock_hz; /* Match the standalone streamer's production graph. The CV610 module @@ -1543,12 +2258,74 @@ static int cv610_init(void *opaque) (uint64_t)ctx->config.record.max_mb * 1024 * 1024; g_cv610_runner = ctx; - if (venc_api_register(&ctx->config, "cv610", - &g_cv610_apply_callbacks, NULL) != 0) - return -1; + /* A craft flashed without libbin.so cannot import or export a .bin, and + * /api/v1/capabilities is what a dashboard trusts instead of probing. + * routes.iq_export_bin tracks the callback pointer, so dropping the two + * entries is what makes the advertisement match reality -- the alternative + * is advertising a control surface whose every use returns an error. + * Static: venc_api_register keeps the pointer. */ + { + static VencApplyCallbacks cv610_callbacks; + + cv610_callbacks = g_cv610_apply_callbacks; + if (!cv610_pq_bin_available()) { + cv610_callbacks.apply_isp_bin = NULL; + cv610_callbacks.export_isp_bin = NULL; + } + if (venc_api_register(&ctx->config, "cv610", + &cv610_callbacks, NULL) != 0) + return -1; + } venc_api_set_record_status_fn(cv610_record_status_callback); venc_api_set_record_http_control_supported(true); + /* isp.sensorBin lands FIRST, and the order is load-bearing. A .bin is a + * whole ISP image and carries an AE ext-register record of its own, so + * applying it after the two ceilings below would overwrite them on every + * boot while /api/v1/get kept reporting the config's values. Broad image + * first, narrower per-knob intent on top. + * + * It needs a cold-boot apply for the reason the ceilings do: the ISP is + * seeded by the sensor plugin's compiled-in defaults, so a bin already + * named in the config would otherwise only take effect once someone + * re-wrote the field over HTTP. Empty is the common case and costs + * nothing. Non-fatal: a craft that boots on the plugin's tuning beats + * one that does not boot. */ + if (cv610_apply_isp_bin(ctx->config.isp.sensor_bin) != 0) + fprintf(stderr, "WARN: isp.sensorBin from config not applied (%s)\n", + ctx->config.isp.sensor_bin); + + /* isp.gain_max / isp.shutter_max_us are MUT_LIVE for the same reason + * fpv.roi* is, and need the same cold-boot apply: the ISP is seeded by + * the sensor plugin, which has never seen the config file. A 0 here is + * "keep the plugin default", and cv610_iq_set_gain_max(0) captures that + * default and writes it back -- so this also fixes the snapshot before + * any live write can move the value it is supposed to restore. */ + if (cv610_apply_gain_max(ctx->config.isp.gain_max) != 0) + fprintf(stderr, "WARN: isp.gainMax from config not applied (%u)\n", + (unsigned)ctx->config.isp.gain_max); + if (cv610_apply_shutter_max(ctx->config.isp.shutter_max_us) != 0) + fprintf(stderr, "WARN: isp.shutterMaxUs from config not applied " + "(%u)\n", (unsigned)ctx->config.isp.shutter_max_us); + + /* fpv.roi* are MUT_LIVE and must also take effect on a cold boot: the + * config is read before the channel exists, so the live path never runs + * for a value already in the file. Placed here rather than beside the + * qpBounds cold-boot apply because cv610_apply_roi_qp() reads the config + * through g_cv610_runner, which is assigned just above -- calling it + * earlier would refuse with no channel and no config. */ + if (ctx->config.fpv.roi_enabled) { + /* Not (void): a rejected apply would otherwise leave the operator + * booting with an ROI the dashboard reports as configured and the + * encoder never received. */ + if (cv610_apply_roi_qp(ctx->config.fpv.roi_qp) != 0) + fprintf(stderr, "WARN: ROI from config not applied " + "(qp=%+d steps=%u center=%.2f)\n", + ctx->config.fpv.roi_qp, + (unsigned)ctx->config.fpv.roi_steps, + ctx->config.fpv.roi_center); + } + /* Auto-start. Only "mirror" is implemented here: dual and dual-stream * need a second VENC channel, deliberately deferred (docs/CV610_BACKEND.md). * An unimplemented mode is refused loudly rather than silently recording @@ -1624,6 +2401,7 @@ static int cv610_run(void *opaque) size_t frame_len = 0; td_s32 ret; int ready; + int select_errno; if (venc_api_get_reinit()) { venc_api_clear_reinit(); @@ -1660,7 +2438,19 @@ static int cv610_run(void *opaque) FD_ZERO(&readfds); FD_SET(venc_fd, &readfds); ready = select(venc_fd + 1, &readfds, NULL, NULL, &timeout); - if (ready < 0 && errno == EINTR) + select_errno = errno; + /* Service the sidecar here, ahead of every `continue` below: + * subscription and clock-sync traffic has to be answered while + * the encoder is producing nothing. Polling only alongside a + * frame leaves a probe that attaches during a stall staring at + * a silent port — indistinguishable from a build with no + * sidecar at all, which is exactly the state an operator is + * trying to instrument. Star6E has idle_wait() for this; this + * loop had no equivalent. Note the saved errno: poll() runs + * recvfrom and would otherwise clobber select's EINTR. */ + if (ctx->sidecar.fd > 0) + rtp_sidecar_poll(&ctx->sidecar); + if (ready < 0 && select_errno == EINTR) continue; if (ready < 0) return -1; @@ -1686,6 +2476,18 @@ static int cv610_run(void *opaque) OT_VENC_ENHANCE_P_SLICE_NOT_FOR_REF; int is_idr; size_t patched = 0; + /* Sidecar state for this frame; sc_fillp is the single + * ring reading shared by the low-water window and the + * TRANSPORT_INFO trailer. */ + venc_frame_ring_fill_t sc_fill; + const venc_frame_ring_fill_t *sc_fillp = NULL; + int sc_send; + Cv610TransportSample sc_ts; + int sc_have_ts = 0; + uint32_t sc_rtp_ts = 0; + uint16_t sc_seq_before = 0; + uint64_t sc_capture_us = 0; + uint64_t sc_ready_us = 0; if (is_enhance) patched = h26x_util_hevc_patch_trail_r_to_n(frame, frame_len); @@ -1708,7 +2510,16 @@ static int cv610_run(void *opaque) (unsigned)ctx->trail_n_patched); } } + VencFrameMeta frame_meta; + is_idr = cv610_frame_is_idr(frame, frame_len); + /* Outside the sidecar gate on purpose: a counter that only + * advances while a probe is subscribed would report the + * frames since the subscription, not since the IDR. */ + if (is_idr) + ctx->frames_since_idr = 0; + else if (ctx->frames_since_idr < UINT16_MAX) + ctx->frames_since_idr++; if (!ctx->slice_census_done && ctx->requested_slice_count > 1) { uint32_t vcl_nals = cv610_frame_vcl_nal_count(frame, @@ -1726,38 +2537,196 @@ static int cv610_run(void *opaque) } } - if (ctx->frame_ring) { - VencFrameMeta meta; - int write_ret; - - memset(&meta, 0, sizeof(meta)); - meta.pts = stream.pack_cnt ? (uint32_t)stream.pack[0].pts : 0; - meta.codec = VENC_FRAME_CODEC_H265; - meta.flags = is_idr ? VENC_FRAME_FLAG_IDR : 0; - if (is_enhance) - meta.flags |= VENC_FRAME_FLAG_ENHANCE; - if (is_idr) { + /* Sidecar (protocols/rtp-sidecar.md). The socket itself + * is polled at the top of the loop so it stays responsive + * while no frames are produced; here we only decide + * whether to build a datagram. fd > 0, not >= 0: the + * listener is always >= 3 and 0 means "never initialised", + * per rtp_sidecar_sender_close(). Gating on an actual + * subscriber spares an unsubscribed craft the clock read, + * the datagram assembly and up to four sendto calls; the + * ring fill is read every frame regardless, for the + * low-water window. */ + sc_send = 0; + if (ctx->sidecar.fd > 0) { + if (rtp_sidecar_is_subscribed(&ctx->sidecar)) { + sc_send = 1; + /* Snapshot before the write: the packetizer + * advances seq and timestamp as it sends. */ + sc_rtp_ts = ctx->rtp.timestamp; + sc_seq_before = ctx->rtp.seq; + sc_capture_us = stream.pack_cnt + ? cv610_capture_us_from_pts(ctx, + (uint64_t)stream.pack[0].pts) + : 0; + sc_ready_us = wb_monotonic_us(); + } + } + + /* One seqlock read per frame, before either transport is + * touched, so every datagram of this access unit uses + * the same destination and one enable state. */ + cv610_transport_begin_frame(ctx); + + /* GDR bookkeeping tracks the ENCODER's intra-refresh + * phase, so it advances every frame regardless of whether + * the frame is transmitted. Skipping it while + * outgoing.enabled=false desynced meta.gdr_pos from the + * real wavefront for every frame after a re-enable, until + * the next IDR happened to resync it -- and the link + * consumer assigns slice importance from that position. */ + memset(&frame_meta, 0, sizeof(frame_meta)); + frame_meta.pts = stream.pack_cnt ? + (uint32_t)stream.pack[0].pts : 0; + frame_meta.codec = VENC_FRAME_CODEC_H265; + frame_meta.flags = is_idr ? VENC_FRAME_FLAG_IDR : 0; + if (is_enhance) + frame_meta.flags |= VENC_FRAME_FLAG_ENHANCE; + if (is_idr) { + ctx->gdr_counter = 0; + } else if (ctx->gdr_active && ctx->gdr_cycle_len > 0) { + frame_meta.flags |= VENC_FRAME_FLAG_GDR; + frame_meta.gdr_pos = ctx->gdr_counter; + frame_meta.gdr_len = ctx->gdr_cycle_len; + ctx->gdr_counter++; + if (ctx->gdr_counter >= ctx->gdr_cycle_len) ctx->gdr_counter = 0; - } else if (ctx->gdr_active && ctx->gdr_cycle_len > 0) { - meta.flags |= VENC_FRAME_FLAG_GDR; - meta.gdr_pos = ctx->gdr_counter; - meta.gdr_len = ctx->gdr_cycle_len; - ctx->gdr_counter++; - if (ctx->gdr_counter >= ctx->gdr_cycle_len) - ctx->gdr_counter = 0; + } + + if (ctx->frame_ring) { + /* The ring's low-water gauge is published + * unconditionally, so it has to keep being + * measured even while nothing is written -- + * otherwise it freezes at its last value and a + * consumer cannot tell a stale reading from a + * live one. */ + if (ctx->tx.output_enabled) { + int write_ret = venc_frame_ring_write( + ctx->frame_ring, &frame_meta, + frame, (uint32_t)frame_len); + if (write_ret != 0) + __atomic_add_fetch(&ctx->output_drops, + 1, __ATOMIC_RELAXED); } - write_ret = venc_frame_ring_write(ctx->frame_ring, &meta, - frame, (uint32_t)frame_len); - if (write_ret != 0) - __atomic_add_fetch(&ctx->output_drops, 1, - __ATOMIC_RELAXED); - cv610_service_ring_low_water(ctx); - } else if (ctx->socket_handle >= 0) { + if (venc_frame_ring_get_fill(ctx->frame_ring, + &sc_fill) == 0) + sc_fillp = &sc_fill; + cv610_service_ring_low_water(ctx, sc_fillp); + } else if (ctx->tx.output_enabled && + ctx->tx.socket_handle >= 0) { /* cv610_output_write owns per-datagram drop accounting. */ (void)cv610_send_rtp_frame(ctx, frame, frame_len); } + + /* Maintain the latched pressure flag on the producer + * thread, every frame and whether or not anyone is + * subscribed — a counter that only advanced under a + * subscription would report frames since the subscription, + * and the flag's 75/50 hysteresis needs to see every + * sample to release correctly. Same shared helper the + * SigmaStar backends use, so the wire means one thing. */ + /* have_fill, not just active: an unmeasured queue must not be + * observed as an empty one. */ + if (cv610_collect_transport(ctx, sc_fillp, &sc_ts) == 0 && + sc_ts.active && sc_ts.have_fill) { + int p_state = __atomic_load_n(&ctx->pressure_state, + __ATOMIC_RELAXED); + uint32_t p_frames = __atomic_load_n( + &ctx->pressure_frames, __ATOMIC_RELAXED); + + venc_observe_pressure(sc_ts.fill_pct, &p_state, + &p_frames); + /* Single writer (this thread); relaxed is enough, and + * it is what Star6E publishes this state with. */ + __atomic_store_n(&ctx->pressure_state, p_state, + __ATOMIC_RELAXED); + __atomic_store_n(&ctx->pressure_frames, p_frames, + __ATOMIC_RELAXED); + /* Fold this frame's observation back into the sample + * the trailer will use, so fill_pct, in_pressure and + * the counter all describe ONE observation. Sampling + * twice let a trailer carry fill_pct=10 beside + * in_pressure=1 on the socket transports, where each + * call is its own SIOCOUTQ. */ + sc_ts.in_pressure = p_state; + sc_ts.pressure_frames = p_frames; + sc_have_ts = 1; + } + + if (sc_send) { + RtpSidecarEncInfo enc; + RtpSidecarTransportInfo tinfo; + const RtpSidecarTransportInfo *tinfo_ptr = NULL; + + /* Only what CV610 genuinely knows at this point. + * complexity and scene_change stay 0: both come from + * the shared scene detector, which this backend does + * not compile in. gop_state stays 0 because + * nothing in this tree ever writes it — no backend + * produces it, so this is not a CV610 gap. Note the + * spec reserves no "absent" sentinel for these, so a + * consumer cannot tell a real 0 from an unproduced + * one; see the follow-up on protocols/rtp-sidecar.md. */ + memset(&enc, 0, sizeof(enc)); + enc.frame_size_bytes = (uint32_t)frame_len; + enc.frame_type = is_idr ? RTP_SIDECAR_FRAME_IDR + : RTP_SIDECAR_FRAME_P; + /* Left 0 deliberately, like complexity/scene_change/ + * gop_state just below: the field means "the controller + * REQUESTED an IDR after this frame", and this backend has + * no such controller. Setting it on every IDR made it a + * duplicate of frame_type and FLAG_KEYFRAME, and a ground + * consumer that sums it as "IDR insertions" would read a + * once-per-GOP static scene as one insertion per second + * while an identically configured SigmaStar craft reports + * zero. */ + enc.idr_inserted = 0; + /* start_qp is the encoder's own per-frame value and is + * exactly what the contract asks for ("start QP / + * closest available per-frame QP"). The struct is + * already in hand -- the SVC-T check above reads + * h265_info.ref_type from it. */ + enc.qp = stream.h265_info.start_qp > 255u + ? 255u : (uint8_t)stream.h265_info.start_qp; + enc.frames_since_idr = ctx->frames_since_idr; + + if (sc_have_ts) { + const Cv610TransportSample *ts = &sc_ts; + + memset(&tinfo, 0, sizeof(tinfo)); + tinfo.fill_pct = ts->fill_pct; + tinfo.in_pressure = ts->in_pressure ? 1 : 0; + tinfo.transport_drops = (uint32_t)ts->transport_drops; + /* Despite the name this is "frames observed in + * pressure" on every backend — see venc_ring.h; + * the wire name is kept for ABI stability across + * the v0.9.2 frame-skip rollback and no backend + * has ever dropped for pressure. */ + tinfo.pressure_drops = ts->pressure_frames; + tinfo.packets_sent = (uint32_t)ts->packets_sent; + tinfo_ptr = &tinfo; + } + + /* Under frame-shm there is no RTP session, so ssrc, + * timestamp and both seq fields are 0 — the same + * thing Star6E puts on the wire for a non-RTP + * transport, where rtp_session_init() is skipped. + * The information lives in the trailer instead. */ + rtp_sidecar_send_frame_transport(&ctx->sidecar, + ctx->rtp.ssrc, sc_rtp_ts, sc_seq_before, + (uint16_t)(ctx->rtp.seq - sc_seq_before), + sc_capture_us, sc_ready_us, &enc, tinfo_ptr); + } __atomic_add_fetch(&ctx->frames, 1, __ATOMIC_RELAXED); __atomic_add_fetch(&ctx->bytes, frame_len, __ATOMIC_RELAXED); + /* Beside the frame/byte counters, NOT inside the sidecar + * block above: that one is gated on a live subscriber, so + * putting the watch there made it observe only while a probe + * happened to be attached -- measured on .181, an overrun + * that delivered 12x its target logged nothing with no probe + * running. */ + pipeline_common_rate_watch(&ctx->rate_watch, &ctx->config, + (uint32_t)frame_len, wb_monotonic_us()); if (ctx->debug_osd) debug_osd_sample_cpu(ctx->debug_osd); cv610_report_frame_status(ctx); diff --git a/src/maruko_controls.c b/src/maruko_controls.c index 99faebc9..e4fd9cd4 100644 --- a/src/maruko_controls.c +++ b/src/maruko_controls.c @@ -171,11 +171,6 @@ static MarukoControlContext g_ctx; /* ── Helpers ─────────────────────────────────────────────────────────── */ -static uint32_t align_down(uint32_t value, uint32_t align) -{ - return value / align * align; -} - static int maruko_apply_rc_qp_delta(const i6c_venc_chn *attr, MI_VENC_RcParam_t *param, int delta) { @@ -1140,30 +1135,20 @@ static int compute_horizontal_roi(uint32_t width, uint32_t height, float center_frac, int qp, int steps, int index, MI_VENC_RoiCfg_t *roi) { - float frac; - uint32_t rw, rh, rx; - int level; + PipelineRoiBand band; - if (!roi || index < 0 || index >= steps) - return -1; - - level = index + 1; - frac = center_frac + (1.0f - center_frac) * - (float)(steps - level) / (float)steps; - rw = align_down((uint32_t)(frac * width), 32); - rh = align_down(height, 32); - rx = align_down((width - rw) / 2, 32); - if (rw == 0 || rh == 0) + if (!roi || pipeline_common_roi_band(width, height, center_frac, qp, + steps, index, &band) != 0) return -1; roi->u32Index = (uint32_t)index; roi->bEnable = 1; roi->bAbsQp = 0; - roi->s32Qp = pipeline_common_scale_roi_qp(qp, level, steps); - roi->stRect.u32Left = rx; - roi->stRect.u32Top = 0; - roi->stRect.u32Width = rw; - roi->stRect.u32Height = rh; + roi->s32Qp = band.qp; + roi->stRect.u32Left = band.x; + roi->stRect.u32Top = band.y; + roi->stRect.u32Width = band.width; + roi->stRect.u32Height = band.height; return 0; } @@ -1173,6 +1158,7 @@ static int maruko_apply_roi_qp(int qp) uint32_t width = g_ctx.frame_width; uint32_t height = g_ctx.frame_height; int ok = 1; + int programmed = 0; uint16_t steps; float center_frac; @@ -1181,18 +1167,37 @@ static int maruko_apply_roi_qp(int qp) for (int i = 0; i < PIPELINE_ROI_MAX_STEPS; i++) { MI_VENC_RoiCfg_t roi = {0}; + MI_S32 cret; + roi.u32Index = i; roi.bEnable = 0; - MI_VENC_SetRoiCfg(g_ctx.venc_chn, &roi); + cret = MI_VENC_SetRoiCfg(g_ctx.venc_chn, &roi); + /* Checked, not discarded: a refused clear leaves the stale band + * enabled with its previous geometry, so shrinking roiSteps + * would overlap the new bands with the old ones while this + * function logged success. */ + if (cret != 0) { + printf("> ROI[%d] clear failed (ret=0x%08x), stale " + "band may still be enabled\n", i, + (unsigned)cret); + ok = 0; + } } if (!g_ctx.vcfg || !g_ctx.vcfg->fpv.roi_enabled || qp == 0) { - printf("> ROI disabled (all regions cleared)\n"); - return 0; + /* Name the cause -- see the matching comment in + * star6e_controls.c's apply_roi_qp(). */ + printf("> ROI disabled (%s), %s\n", + !g_ctx.vcfg ? "no config bound" : + !g_ctx.vcfg->fpv.roi_enabled ? "roiEnabled=false" : + "roiQp=0, no delta to apply", + ok ? "all regions cleared" : + "CLEAR FAILED, see above"); + return ok ? 0 : -1; } - if (qp < -30) qp = -30; - if (qp > 30) qp = 30; + if (qp < -20) qp = -20; + if (qp > 20) qp = 20; steps = g_ctx.vcfg->fpv.roi_steps; if (steps < 1) steps = 1; @@ -1219,6 +1224,16 @@ static int maruko_apply_roi_qp(int qp) roi.s32Qp); ok = 0; } + programmed++; + } + + if (programmed == 0) { + /* Every band was skipped as degenerate. Logging "ROI + * horizontal" here would assert an ROI that does not exist. */ + printf("> ROI programmed no bands at %ux%u (steps=%u " + "center=%.2f)\n", width, height, steps, + (double)center_frac); + return -1; } if (ok) { diff --git a/src/maruko_pipeline.c b/src/maruko_pipeline.c index 41075d5a..c62628cc 100644 --- a/src/maruko_pipeline.c +++ b/src/maruko_pipeline.c @@ -4699,6 +4699,8 @@ static int maruko_pipeline_process_stream(MarukoBackendContext *ctx, maruko_scene_request_idr, ctx); RtpSidecarEncInfo enc_info = {0}; scene_fill_sidecar(&ctx->scene, &enc_info); + pipeline_common_rate_watch(&ctx->rate_watch, maruko_controls_vcfg(), + frame_size, ready_us); size_t total_bytes = 0; HevcRtpStats frame_pktzr = {0}; diff --git a/src/maruko_runtime.c b/src/maruko_runtime.c index a8574877..18ed0c7e 100644 --- a/src/maruko_runtime.c +++ b/src/maruko_runtime.c @@ -181,6 +181,29 @@ static int maruko_runner_init(void *opaque) mk_mirror_record_locks_init_public(&ctx->backend); venc_api_set_record_status_fn(maruko_record_status_callback); venc_api_set_record_http_control_supported(true); + /* fpv.roi* are MUT_LIVE and were only ever applied by the live path, so + * a craft that carried roiQp in its config booted with every ROI region + * unprogrammed while /api/v1/capabilities advertised the field + * supported. Measured on the Maruko bench: boot logged the qpDelta + * apply below and no ROI line at all with roiEnabled:true, roiQp:-8 in + * the file; one live set then logged the band immediately. Star6E has + * always applied it here (star6e_runtime_apply_startup_controls) -- this + * is the missing half, not a new control. */ + if (ctx->vcfg.fpv.roi_enabled && + maruko_controls_callbacks()->apply_roi_qp) { + /* Not (void): maruko_apply_roi_qp() returns -1 with NO output at + * all when the frame geometry is still zero, which would + * reproduce the exact symptom this call site exists to fix -- a + * boot with roiQp configured and no ROI line in the log. Same + * reporting as the qpBounds apply below and the CV610 twin. */ + if (maruko_controls_callbacks()->apply_roi_qp( + ctx->vcfg.fpv.roi_qp) != 0) + fprintf(stderr, "WARN: ROI from config not applied " + "(qp=%+d steps=%u center=%.2f)\n", + ctx->vcfg.fpv.roi_qp, + (unsigned)ctx->vcfg.fpv.roi_steps, + ctx->vcfg.fpv.roi_center); + } if (ctx->vcfg.video0.qp_delta != 0 && maruko_controls_callbacks()->apply_qp_delta) { maruko_controls_callbacks()->apply_qp_delta( diff --git a/src/pipeline_common.c b/src/pipeline_common.c index c847e22e..396640ae 100644 --- a/src/pipeline_common.c +++ b/src/pipeline_common.c @@ -294,3 +294,147 @@ int pipeline_common_resolve_isp_bin(const char *configured_path, fallback, normalized); return 0; } + +static uint32_t roi_align_down(uint32_t value, uint32_t align) +{ + return value / align * align; +} + +/* Window long enough that one IDR cannot carry it, short enough that a real + * collapse is reported within a few seconds. Two consecutive windows are + * required, which is what separates a sustained loss of control from the + * 1.43x single-window transient a moving scene produced on the bench. */ +#define RATE_WATCH_WINDOW_US 2000000ULL +#define RATE_WATCH_TRIP_X100 150u +#define RATE_WATCH_CLEAR_X100 120u +#define RATE_WATCH_WINDOWS 2u + +void pipeline_common_rate_watch(PipelineRateWatch *rw, const VencConfig *cfg, + uint32_t frame_bytes, uint64_t now_us) +{ + uint64_t elapsed, delivered_kbps; + uint32_t ratio_x100; + + /* cfg->video0.bitrate is read on the encode thread while the httpd + * thread may be committing a new config under g_cfg_mutex. Deliberately + * unlocked, but NOT because the field is naturally aligned -- alignment + * is not a validity argument in C, and this reads bitrate more than once + * plus several ROI fields that can straddle one commit. + * + * The argument that actually carries the weight is that no concurrently + * committable value changes control flow here. bitrate == 0 is the only + * one that could (it guards below and divides further down), and + * validation rejects it, defaults set 8192, and /api/v1/defaults commits + * defaults -- so no HTTP path can make the field transition to 0. The + * residue is a diagnostic that may quote a target or an ROI hint from + * either side of a config change, and the two-window rule bounds even + * that: one window computed against a stale target cannot raise a report + * on its own. Taking the config mutex once per encoded frame to protect + * a diagnostic would be the worse trade. */ + if (!rw || !cfg || cfg->video0.bitrate == 0) + return; + + if (rw->window_start_us == 0) + rw->window_start_us = now_us; + rw->window_bytes += frame_bytes; + + /* Unsigned, so a clock that went backwards wraps huge rather than + * negative; treat any implausible span as a restart of the window. */ + elapsed = now_us - rw->window_start_us; + if (now_us < rw->window_start_us) { + rw->window_start_us = now_us; + rw->window_bytes = 0; + return; + } + if (elapsed < RATE_WATCH_WINDOW_US) + return; + + /* bytes * 8 bits / (elapsed us / 1e6) / 1000 == bytes * 8000 / elapsed. */ + delivered_kbps = (rw->window_bytes * 8000ULL) / elapsed; + ratio_x100 = (uint32_t)((delivered_kbps * 100ULL) / cfg->video0.bitrate); + rw->window_start_us = now_us; + rw->window_bytes = 0; + + if (ratio_x100 >= RATE_WATCH_TRIP_X100) { + if (rw->over_windows < 255u) + rw->over_windows++; + if (rw->over_windows >= RATE_WATCH_WINDOWS && !rw->reported) { + rw->reported = 1; + if (rw->reports < UINT16_MAX) + rw->reports++; + fprintf(stderr, + "WARNING: encoder delivered %u%% of the %u kbps target " + "for %llu s -- rate control has no headroom left\n", + ratio_x100, cfg->video0.bitrate, + (unsigned long long) + ((RATE_WATCH_WINDOW_US * RATE_WATCH_WINDOWS) + / 1000000ULL)); + if (cfg->fpv.roi_enabled && cfg->fpv.roi_qp != 0) + fprintf(stderr, + " fpv.roiQp is %+d against a QP ceiling of " + "%s: the ROI delta is subtracted from the frame QP, " + "so the controller raises the base QP to compensate " + "and cannot go past that ceiling. Reduce |roiQp| or " + "raise video0.maxQp.\n", + cfg->fpv.roi_qp, + cfg->video0.max_qp ? "video0.maxQp" : + "the encoder default"); + } + } else if (ratio_x100 <= RATE_WATCH_CLEAR_X100) { + if (rw->reported) + printf("> Bitrate overrun cleared (%u%% of target)\n", + ratio_x100); + rw->over_windows = 0; + rw->reported = 0; + } else if (!rw->reported) { + /* The dead band between clear and trip. Breaking the streak here is + * what makes "two CONSECUTIVE windows" true: without it a benign + * window preserved the count, so two overruns an unbounded time apart + * reported as one sustained episode -- and the worst measured benign + * transient, 1.43x, lands squarely in this band, so that was the + * common case rather than a corner. + * + * Only while !reported. Once the warning is out, the hysteresis + * between the two thresholds is the point: an episode oscillating in + * the dead band must stay latched until it genuinely clears, or the + * cleared/re-reported pair would flap. */ + rw->over_windows = 0; + } +} + +int pipeline_common_roi_band(uint32_t width, uint32_t height, + float center_frac, int qp, int steps, int index, + PipelineRoiBand *out) +{ + float frac; + uint32_t rw, rh, rx; + int level; + + if (!out || index < 0 || index >= steps) + return -1; + + /* Clamp rather than trust the caller -- see the header comment. Without + * it, frac outside [0,1] returns success with an underflowed origin or a + * multi-gigabyte width, and a negative frac is undefined behaviour at the + * float-to-unsigned conversion. */ + if (!(center_frac >= 0.1f)) /* also catches NaN */ + center_frac = 0.1f; + else if (center_frac > 0.9f) + center_frac = 0.9f; + + level = index + 1; + frac = center_frac + (1.0f - center_frac) * + (float)(steps - level) / (float)steps; + rw = roi_align_down((uint32_t)(frac * width), 32); + rh = roi_align_down(height, 32); + rx = roi_align_down((width - rw) / 2, 32); + if (rw == 0 || rh == 0) + return -1; + + out->x = rx; + out->y = 0; + out->width = rw; + out->height = rh; + out->qp = pipeline_common_scale_roi_qp(qp, level, steps); + return 0; +} diff --git a/src/rtp_sidecar.c b/src/rtp_sidecar.c index 296afd60..4b6de6ea 100644 --- a/src/rtp_sidecar.c +++ b/src/rtp_sidecar.c @@ -362,7 +362,16 @@ static int send_frame_impl(RtpSidecarSender *s, ssize_t sent = sendto(s->fd, buf, off, MSG_DONTWAIT, (struct sockaddr *)&s->subs[i].addr, sizeof(s->subs[i].addr)); - if (sent < 0 && errno != EAGAIN) { + /* Routine, not worth a line each: a full socket buffer, and the + * transient unreachables a vehicle sees every time its RF link + * drops. This runs between get_stream and release_stream on the + * encode drain loop, so an unthrottled fprintf here is frames of + * jitter plus a log flood for the whole 5 s subscriber TTL — + * cv610_output_write already treats the same errnos as routine + * on the video path. */ + if (sent < 0 && errno != EAGAIN && errno != EWOULDBLOCK && + errno != ENOBUFS && errno != ENETUNREACH && + errno != EHOSTUNREACH && errno != ENETDOWN) { fprintf(stderr, "[sidecar] sendto: %s\n", strerror(errno)); rc = -1; } diff --git a/src/star6e_controls.c b/src/star6e_controls.c index afe04422..f2b2a0d4 100644 --- a/src/star6e_controls.c +++ b/src/star6e_controls.c @@ -159,11 +159,6 @@ static int apply_encoder_gop(uint32_t gop_size); static int request_idr(void); static int request_idr_bootstrap(void); -static uint32_t align_down(uint32_t value, uint32_t align) -{ - return value / align * align; -} - static int apply_rc_qp_delta(const MI_VENC_ChnAttr_t *attr, MI_VENC_RcParam_t *param, int delta) { @@ -679,30 +674,20 @@ static int compute_horizontal_roi(uint32_t width, uint32_t height, float center_frac, int qp, int steps, int index, MI_VENC_RoiCfg_t *roi) { - float frac; - uint32_t rw, rh, rx; - int level; + PipelineRoiBand band; - if (!roi || index < 0 || index >= steps) - return -1; - - level = index + 1; - frac = center_frac + (1.0f - center_frac) * - (float)(steps - level) / (float)steps; - rw = align_down((uint32_t)(frac * width), 32); - rh = align_down(height, 32); - rx = align_down((width - rw) / 2, 32); - if (rw == 0 || rh == 0) + if (!roi || pipeline_common_roi_band(width, height, center_frac, qp, + steps, index, &band) != 0) return -1; roi->u32Index = (uint32_t)index; roi->bEnable = 1; roi->bAbsQp = 0; - roi->s32Qp = pipeline_common_scale_roi_qp(qp, level, steps); - roi->stRect.u32Left = rx; - roi->stRect.u32Top = 0; - roi->stRect.u32Width = rw; - roi->stRect.u32Height = rh; + roi->s32Qp = band.qp; + roi->stRect.u32Left = band.x; + roi->stRect.u32Top = band.y; + roi->stRect.u32Width = band.width; + roi->stRect.u32Height = band.height; return 0; } @@ -712,6 +697,7 @@ static int apply_roi_qp(int qp) uint32_t width = g_star6e_control_ctx.frame_width; uint32_t height = g_star6e_control_ctx.frame_height; int ok = 1; + int programmed = 0; uint16_t steps; float center_frac; @@ -720,19 +706,41 @@ static int apply_roi_qp(int qp) for (int i = 0; i < PIPELINE_ROI_MAX_STEPS; i++) { MI_VENC_RoiCfg_t roi = {0}; + MI_S32 cret; + roi.u32Index = i; roi.bEnable = 0; - MI_VENC_SetRoiCfg(g_star6e_control_ctx.venc_chn, &roi); + cret = MI_VENC_SetRoiCfg(g_star6e_control_ctx.venc_chn, &roi); + /* Checked, not discarded: a refused clear leaves the stale band + * enabled with its previous geometry, so shrinking roiSteps + * would overlap the new bands with the old ones while this + * function logged success. */ + if (cret != 0) { + printf("> ROI[%d] clear failed (ret=0x%08x), stale " + "band may still be enabled\n", i, + (unsigned)cret); + ok = 0; + } } if (!g_star6e_control_ctx.vcfg || !g_star6e_control_ctx.vcfg->fpv.roi_enabled || qp == 0) { - printf("> ROI disabled (all regions cleared)\n"); - return 0; + /* Name the cause. Three different states land here and the old + * single line could not tell them apart, so an operator who set + * roiEnabled:true and left roiQp at 0 read "disabled" as "my + * flag was ignored". */ + printf("> ROI disabled (%s), %s\n", + !g_star6e_control_ctx.vcfg ? "no config bound" : + !g_star6e_control_ctx.vcfg->fpv.roi_enabled ? + "roiEnabled=false" : + "roiQp=0, no delta to apply", + ok ? "all regions cleared" : + "CLEAR FAILED, see above"); + return ok ? 0 : -1; } - if (qp < -30) qp = -30; - if (qp > 30) qp = 30; + if (qp < -20) qp = -20; + if (qp > 20) qp = 20; steps = g_star6e_control_ctx.vcfg->fpv.roi_steps; if (steps < 1) steps = 1; @@ -759,6 +767,16 @@ static int apply_roi_qp(int qp) roi.s32Qp); ok = 0; } + programmed++; + } + + if (programmed == 0) { + /* Every band was skipped as degenerate. Logging "ROI + * horizontal" here would assert an ROI that does not exist. */ + printf("> ROI programmed no bands at %ux%u (steps=%u " + "center=%.2f)\n", width, height, steps, + (double)center_frac); + return -1; } if (ok) { diff --git a/src/star6e_runtime.c b/src/star6e_runtime.c index f84a9117..48b5b0db 100644 --- a/src/star6e_runtime.c +++ b/src/star6e_runtime.c @@ -415,6 +415,7 @@ typedef struct { int httpd_started; int pipeline_started; SceneDetector scene; + PipelineRateWatch rate_watch; /* Configured base size this pipeline started with — used at reinit to * detect a video0.size change (the only config field that crosses a * sensor-mode boundary), so the respawn can cold-init VIF/VPE. */ @@ -1581,6 +1582,8 @@ static int star6e_runtime_process_stream(Star6eRunnerContext *ctx, scene_update(&ctx->scene, frame_size, is_idr, star6e_scene_request_idr, &ps->venc_channel); scene_fill_sidecar(&ctx->scene, &enc_info); + pipeline_common_rate_watch(&ctx->rate_watch, vcfg, + frame_size, wb_monotonic_us()); /* Observe pressure only when a sidecar probe is subscribed * — it is the only consumer of in_pressure / fill_pct / the diff --git a/src/venc_api.c b/src/venc_api.c index 32003948..18b89c4d 100644 --- a/src/venc_api.c +++ b/src/venc_api.c @@ -235,6 +235,9 @@ void venc_api_set_sensor_info(int pad, int mode_index, int forced_pad) /* ── Reinit flag (shared with backend via accessors) ─────────────────── */ static volatile sig_atomic_t g_reinit = 0; +/* Monotonic count of reinit requests. Only the single httpd dispatch thread + * writes it, and only via venc_api_request_reinit(). */ +static volatile sig_atomic_t g_reinit_seq = 0; /* ── Record control flags ────────────────────────────────────────────── */ @@ -254,6 +257,16 @@ static bool g_record_http_control_supported; void venc_api_request_reinit(void) { g_reinit = 1; + /* Bumped alongside the latch because the latch alone cannot answer "did + * THIS apply ask for a respawn". A caller that samples the boolean sees + * no transition when a reinit is already pending from an earlier request, + * which is exactly the case the persistence guard below exists for. */ + g_reinit_seq++; +} + +unsigned venc_api_reinit_seq(void) +{ + return (unsigned)g_reinit_seq; } bool venc_api_get_reinit(void) @@ -806,8 +819,13 @@ static int cv610_field_is_restart_only(const char *canonical_key) { static const char *const restart_only[] = { "video0.fps", /* pipeline fps, MIPI raw_bit, RTP clock */ - "outgoing.enabled", /* output_start() runs once, in cv610_init */ - "outgoing.server", /* URI parsed in cv610_prepare */ + /* outgoing.enabled and outgoing.server LEFT this list in 0.77.0, + * once cv610_apply_output_enabled() and cv610_apply_server() + * existed to honour them. Order matters and is not cosmetic: + * live_group_supported_for_cfg() gates LIVE_GROUP_OUTGOING on + * those callbacks being present, so widening first would have + * advertised `live` in /api/v1/capabilities while every write + * was rejected -- the exact lie this list exists to prevent. */ "audio.mute", /* acodec gain set once, at audio start */ }; size_t i; @@ -858,6 +876,84 @@ int venc_api_field_supported_for_backend(const char *backend_name, "system.web_port", "system.verbose", "sensor.index", "sensor.mode", "isp.keep_aspect", + /* The two portable AE ceilings, mapped onto the exposure + * group cv610_iq.c already owns. Wired because the units + * match exactly and need no conversion: exp_time_range is + * documented "unit: us" and a_gain_range "Format:22.10 ... + * unit: times, 10bit precision", i.e. 1024 == 1x, which is + * the scale the SigmaStar supervisory AE uses. The live + * board confirms the format independently -- sys_gain_max + * 1630616 == a_gain_max 407654 x ispd_gain_max 4096 / 1024. + * Listed because the ceilings MOVE THE AE LOOP on this + * part, not merely because the write returns success. + * Measured on a CV610 bench, sc4336p, ave_lum 43: capping + * shutterMaxUs to 4000 pulled the applied exp_time from + * 16560 to exactly 4000 us and the AE raised a_gain 1497 + * -> 6611 to hold the same luma, and capping gainMax to + * 2048 clamped the applied a_gain to 2043 while the ISP + * took up the slack in DIGITAL gain (isp_d_gain 1024 -> + * 1948) -- which is also what shows the field is the + * ANALOG ceiling rather than the system one. Clearing + * each back to 0 restored 873800 / 407654 and the + * original applied values, and a restart with 6000/8192 + * in the file came up honouring both. All readings from + * /api/v1/awb, which reports the AE's own output. + * + * isp.gain_min / isp.shutter_min_us are deliberately ABSENT: + * the floors are a separate pair and this slice did not + * measure them. isp.awb_mode / isp.awb_ct are absent for a + * different reason. ct_manual means "pin white balance to a + * colour temperature", and unlike SigmaStar -- one call, + * MI_ISP_AWB_SetCTMwbAttr(ct) -- this SDK has no single CT + * setter. It has ss_mpi_isp_cal_gain_by_temp() (ss_mpi_awb.h, + * present in libss_mpi_awb.so), which converts Kelvin to + * r/gr/gb/b gains against the CURRENT ot_isp_wb_attr; those + * gains then go back through set_wb_attr with op_type manual. + * A two-call flow whose result depends on the sensor's AWB + * calibration, and this slice neither implemented nor measured + * it -- so the pair stays unsupported pending measurement, the + * same bar every other entry in this list had to clear. + * Manual white balance is reachable today, under its own name, + * through /api/v1/iq's "wb" group. */ + "isp.gain_max", "isp.shutter_max_us", + /* The PQTools `.bin` path, applied through libbin.so by + * src/cv610_pq_bin.c -- live via apply_isp_bin and once at + * cold boot in cv610_init(). Listed under the same bar as + * the AE ceilings above: it MOVES THE ISP on this part, not + * merely returns success. Measured on .181 (IMX662) with a + * vendor tune built for a DIFFERENT sensor: the import moved + * 39 of the 102 fields /api/v1/iq reads back, across ten + * groups, and the operator saw the picture go red -- which is + * the point, since a foreign tune brings its own CCM and AWB. + * Export round-trips: importing our own exported file + * restored a read-back identical to the pre-import one. + * + * Unlike the SigmaStar backends there is no + * /etc/sensors/.bin fallback, so an empty value is a + * no-op rather than a resolve -- which is also what makes the + * cold-boot apply free on a craft that names no bin. */ + "isp.sensor_bin", + /* Applied at the SENSOR by apply_sensor_orientation(), + * through the plugin's pfn_mirror_flip — the same place + * both SigmaStar backends apply orientation, so image.* + * means one thing across the fleet. Both are already + * MUT_RESTART in the shared table, so no + * cv610_field_is_restart_only() entry and no mutability + * widening. + * + * image.rotate is deliberately ABSENT, though the pair it + * decomposes into is here. The decomposition lives in + * venc_config's load_image(), which runs on a FILE parse + * and nowhere else, so it never sees a value that arrives + * through /api/v1/set. Listing it would turn today's + * clean 501 into: accept 90, persist 90, raise + * reinit_pending, restart the encoder, and read back 0 + * once load_image() coerces it — measured on .181. A + * config file carrying rotate:180 still works, because + * load_image() decomposes it before the backend reads + * mirror/flip; the field reads unsupported because no + * backend reads ROTATE, which is what this list means. */ + "image.mirror", "image.flip", "video0.fps", "video0.size", "video0.bitrate", "video0.gop_size", "video0.slice_count", "video0.resilience", @@ -873,10 +969,32 @@ int venc_api_field_supported_for_backend(const char *backend_name, * CBR cannot hold its target in a noise-dominated scene * without room to raise QP. */ "video0.min_qp", "video0.max_qp", + /* Read by cv610_apply_roi_qp(), live and at cold boot. + * Listed only because the delta reaches the encoder and + * moves the picture ON THIS PART -- a measurement on a + * sibling SoC would not qualify it, because the SDK call + * differs (ss_mpi_venc_set_roi_attr here, + * MI_VENC_SetRoiCfg there). Measured on a CV610 bench, + * 720p100 CBR: with a 384-px band at x=448, decoded + * detail inside the band drops 7.4x between roiQp -30 and + * +30 while the columns just outside it move the opposite + * way, and a repeat of the -30 arm lands within 8.8%. + * That measurement is the bar for this list -- issue #259 + * is the counter-example, where an SDK call returned + * success, logged as applied and read back clean while + * the bitstream never moved. */ + "fpv.roi_enabled", "fpv.roi_qp", + "fpv.roi_steps", "fpv.roi_center", "outgoing.enabled", "outgoing.server", "outgoing.max_payload_size", "outgoing.audio_port", "outgoing.connected_udp", "outgoing.allow_unix_encoder_stall", + /* Read once by cv610_output_start(), which binds the + * sidecar listener before the transport dispatch. The + * shared table already marks it MUT_RESTART, so there is + * no cv610_field_is_restart_only() entry to add and no + * mutability widening here. */ + "outgoing.sidecar_port", "audio.enabled", "audio.mute", /* Snapshot: the JPEG channel is a second bind target on * the main stream's VPSS output, so it inherits that @@ -900,9 +1018,22 @@ int venc_api_field_supported_for_backend(const char *backend_name, for (i = 0; i < sizeof(supported) / sizeof(supported[0]); ++i) { if (strcmp(canonical_key, supported[i]) == 0) - return 1; + break; } - return 0; + if (i == sizeof(supported) / sizeof(supported[0])) + return 0; + + /* One entry is conditional on more than the backend name. + * isp.sensor_bin needs the vendor PQ blob, which is not shipped in + * the source tree, so a craft flashed without it must not advertise + * the field as supported and then 501 every write. cv610_init drops + * apply_isp_bin when the probe fails, so the callback is the truth -- + * the same thing routes.iq_export_bin already tracks. Before + * registration g_cb is NULL; answer from the list then, since no + * request can be in flight yet. */ + if (g_cb && strcmp(canonical_key, "isp.sensor_bin") == 0) + return g_cb->apply_isp_bin != NULL; + return 1; } /* video0.intra_refresh_qp reaches MI_VENC_SetIntraRefresh on Star6E and @@ -1106,11 +1237,15 @@ static const char *validate_field_cfg(const VencConfig *cfg, const char *key) return "ae_engine must be 'sdk'"; } if (strcmp(key, "isp.sensor_bin") == 0) { - /* Empty string opts into the /etc/sensors/.bin fallback; + /* Empty string opts into the /etc/sensors/.bin fallback on + * the SigmaStar backends -- on CV610 it is a no-op, and there is no + * live way to un-apply an imported image short of importing another; * a non-empty path must point at a readable file or the live * apply callback would silently fall back to auto-detect (or to * the previously-loaded bin via dedup) while the persisted - * config still names a bogus path. */ + * config still names a bogus path. Note the check cannot help a + * path that was readable at set time and is gone by the next boot, + * which is what a bin left in tmpfs does. */ if (cfg->isp.sensor_bin[0] && access(cfg->isp.sensor_bin, R_OK) != 0) return "isp.sensor_bin path is not readable"; @@ -1221,8 +1356,25 @@ static const char *validate_field_cfg(const VencConfig *cfg, const char *key) "(0 = stop the userspace AWB loop)"; } if (strcmp(key, "fpv.roi_qp") == 0) { - if (cfg->fpv.roi_qp < -30 || cfg->fpv.roi_qp > 30) - return "roi_qp must be in range [-30, 30]"; + /* +-20, not +-30. Beyond 20 the delta stops being honoured at + * BOTH ends, because it is a RELATIVE delta and H.265 caps QP at + * 51. Negative is the expensive end: CBR pays for the ROI + * discount by raising the frame's base QP roughly 1:1 with + * |roiQp|, so once base + |roiQp| passes 51 the rate controller + * saturates -- measured on a CV610 bench at 720p60, roiQp -30 + * pinned every frame at qp 51/51/51 and delivered 16976 kbps + * against a 2829 kbps target, a 6x overrun, while -20 landed at + * qp 45 and held the target at 2802. Positive is the benign end + * but truncates just as quietly: at +30 the base sat at 21.5, so + * the region wanted 51.5 and got 51. The band width does NOT + * move the cliff, only its severity -- at -30, roiCenter 0.6 / + * 0.4 / 0.2 all pinned at 51 and delivered 17661 / 12520 / 6977 + * kbps -- so there is nothing to clamp on that axis instead. */ + if (cfg->fpv.roi_qp < -20 || cfg->fpv.roi_qp > 20) + return "roi_qp must be in range [-20, 20] (beyond that the " + "delta exceeds the encoder's QP range: a large " + "negative value saturates rate control and overruns " + "the bitrate target)"; } if (strcmp(key, "fpv.roi_steps") == 0) { if (cfg->fpv.roi_steps < 1 || @@ -1605,7 +1757,7 @@ static int make_single_set_success_json(const char *field_key, } static int make_multi_live_set_success_json(const SetQueryParam *params, - size_t count, char **out_json) + size_t count, int reinit_requested, char **out_json) { cJSON *root; cJSON *data; @@ -1622,6 +1774,12 @@ static int make_multi_live_set_success_json(const SetQueryParam *params, cJSON_AddBoolToObject(root, "ok", 1); data = cJSON_AddObjectToObject(root, "data"); + /* Same contract as the single-field response: a batch whose apply asked + * for a respawn has to say so, or a caller batching outgoing.server with + * anything else is told the whole set went live while the craft is about + * to restart under it. */ + if (reinit_requested) + cJSON_AddBoolToObject(data, "reinit_pending", 1); applied = cJSON_AddArrayToObject(data, "applied"); for (i = 0; i < count; i++) { @@ -2422,7 +2580,7 @@ static int apply_live_group_sequence_locked(const LiveApplyGroup *group_order, static int make_live_set_response_locked(const VencConfig *cfg, const SetQueryParam *params, size_t param_count, int single_response, - int *status_code, char **response_json) + int reinit_requested, int *status_code, char **response_json) { if (!cfg || !params || param_count == 0 || !status_code || !response_json) return -1; @@ -2438,14 +2596,21 @@ static int make_live_set_response_locked(const VencConfig *cfg, response_json); } - rc = make_single_set_success_json(params[0].key, jval, 0, - response_json); + /* Report a respawn the apply itself asked for. A backend can + * accept a live-class field and still need a restart to honour + * it -- CV610's apply_server() does exactly that for the ring + * transports, committing the value and calling + * venc_api_request_reinit() rather than refusing. Answering a + * flat "ok" there would tell the operator the change was live + * when the craft is about to respawn under them. */ + rc = make_single_set_success_json(params[0].key, jval, + reinit_requested, response_json); free(jval); if (rc != 0) return -1; } else { if (make_multi_live_set_success_json(params, param_count, - response_json) != 0) { + reinit_requested, response_json) != 0) { return -1; } } @@ -2465,6 +2630,12 @@ static int apply_live_set_query(SetQueryParam *params, size_t param_count, VencConfig new_cfg; VencConfig actual_cfg; int rc; + /* g_reinit is a LATCH the runtime consumes on its own schedule, so it + * can already be set from an earlier request when this one arrives. + * Only a false->true transition across THIS apply means this write is + * the one that needs a respawn -- reading the flag absolutely made an + * unrelated live set report reinit_pending. */ + unsigned reinit_seq_before = venc_api_reinit_seq(); rc = collect_live_groups(params, param_count, group_order, &group_count, &touched, status_code, response_json); @@ -2514,7 +2685,9 @@ static int apply_live_set_query(SetQueryParam *params, size_t param_count, } rc = make_live_set_response_locked(&actual_cfg, params, param_count, - single_response, status_code, response_json); + single_response, + (venc_api_reinit_seq() != reinit_seq_before) ? 1 : 0, + status_code, response_json); if (rc != 0) { pthread_mutex_unlock(&g_cfg_mutex); return rc; @@ -2533,7 +2706,26 @@ static int apply_live_set_query(SetQueryParam *params, size_t param_count, * automated writers (waybeam-link adaptive actuation); a later * persisting /set snapshots the whole running config, volatile * changes included (one config struct, by design). */ - if (persist) + /* `persist || reinit` is the condition, not `persist`. + * + * /api/v1/live/set passes persist=0 by design, and that is safe for a + * change that took effect in the running process. It is NOT safe once a + * backend's apply has asked for a respawn: the respawn re-execs and + * reloads /etc/waybeam.json, so an unpersisted value is silently + * discarded by a restart the caller did not ask for. The restart-class + * path already refuses this shape outright ("restart-class field + * requires persistence; use /api/v1/set"); a backend-level restart class + * reaches the same hazard through the live path, so the value is written + * out instead of lost. + * + * The test is a sequence number, not a false->true transition on the + * latch. The latch is consumed by the main loop, which can be a whole + * second away (its select() carries a 1 s timeout), so a second live/set + * of a restart-class field while the first respawn is still pending saw + * no transition, skipped this write, and was then discarded by the + * re-exec that reloaded the FIRST value -- silently, in exactly the + * situation this guard was written to cover. */ + if (persist || venc_api_reinit_seq() != reinit_seq_before) (void)venc_api_save_config_to_disk(&actual_cfg); return 0; } @@ -3013,6 +3205,10 @@ static int handle_capabilities(int fd, const HttpRequest *req, void *ctx) #else cJSON_AddBoolToObject(routes, "iq_import", 0); #endif + /* Tracks the callback rather than a compile-time backend test, which is + * what tests/test_venc_api.c asserts the value must do. */ + cJSON_AddBoolToObject(routes, "iq_export_bin", + (g_cb && g_cb->export_isp_bin) ? 1 : 0); cJSON *fields = cJSON_AddObjectToObject(data, "fields"); for (size_t i = 0; i < FIELD_COUNT; i++) { @@ -3264,6 +3460,38 @@ static int handle_iq_import(int fd, const HttpRequest *req, void *ctx) #endif } +/* Fixed export destination. /tmp is tmpfs on these boards, which is the + * right lifetime for a file the operator is about to copy off. */ +#define VENC_ISP_BIN_EXPORT_PATH "/tmp/isp_export.bin" + +static int handle_iq_export_bin(int fd, const HttpRequest *req, void *ctx) +{ + char body[128]; + int written; + + (void)req; (void)ctx; + if (!g_cb || !g_cb->export_isp_bin) { + return httpd_send_error(fd, 501, "not_implemented", + "ISP bin export not available on this backend"); + } + /* The destination is fixed rather than taken from the query string: this + * endpoint is unauthenticated, and a caller-supplied path would make it a + * write-anywhere primitive. Copy the file off afterwards. */ + written = g_cb->export_isp_bin(VENC_ISP_BIN_EXPORT_PATH); + if (written <= 0) { + /* Every distinct cause -- no libbin.so, a refused tuning connect, a + * short write on a full /tmp -- is named in the venc log; the HTTP + * layer has no channel for it. */ + return httpd_send_error(fd, 500, "internal_error", + "ISP bin export failed; see the venc log for the reason"); + } + /* Echo the byte count so a caller can confirm the write it is about to + * scp off, rather than trusting a constant path string. */ + snprintf(body, sizeof(body), + "{\"path\":\"%s\",\"bytes\":%d}", VENC_ISP_BIN_EXPORT_PATH, written); + return httpd_send_ok(fd, body); +} + static int handle_ae(int fd, const HttpRequest *req, void *ctx) { (void)req; (void)ctx; @@ -4204,8 +4432,13 @@ int venc_api_register(VencConfig *cfg, const char *backend_name, r |= venc_httpd_route("GET", "/api/v1/defaults", handle_defaults, NULL); r |= venc_httpd_route("GET", "/api/v1/ae", handle_ae, NULL); r |= venc_httpd_route("GET", "/api/v1/awb", handle_awb, NULL); + /* Longer prefix first — routing is first-match prefix and accepts '/' as + * a boundary, so "/api/v1/iq" would otherwise swallow any longer + * "/api/v1/iq/..." route registered after it and answer that request with + * the full ISP sweep instead of 404. */ r |= venc_httpd_route("GET", "/api/v1/iq/set", handle_iq_set, NULL); r |= venc_httpd_route("POST", "/api/v1/iq/import", handle_iq_import, NULL); + r |= venc_httpd_route("GET", "/api/v1/iq/export_bin", handle_iq_export_bin, NULL); r |= venc_httpd_route("GET", "/api/v1/iq", handle_iq, NULL); r |= venc_httpd_route("GET", "/api/v1/modes", handle_modes, NULL); r |= venc_httpd_route("GET", "/metrics/isp", handle_isp_metrics, NULL); diff --git a/src/venc_config.c b/src/venc_config.c index 8a0d7a85..a7c64156 100644 --- a/src/venc_config.c +++ b/src/venc_config.c @@ -128,9 +128,16 @@ void venc_config_defaults(VencConfig *cfg) cfg->outgoing.connected_udp = true; cfg->outgoing.allow_unix_encoder_stall = false; - /* fpv */ - cfg->fpv.roi_enabled = true; - cfg->fpv.roi_qp = 0; + /* fpv. + * + * The pair ships coherent: OFF, but carrying a delta that does something + * the moment it is switched on. The old default was the other way round + * -- roiEnabled:true with roiQp:0 -- which reads as "ROI is on" while + * apply_roi_qp() clears every region, because a zero delta is not a + * region worth programming. Nothing was ignored, but the flag and the + * log disagreed, and that is what an operator sees first. */ + cfg->fpv.roi_enabled = false; + cfg->fpv.roi_qp = -20; cfg->fpv.roi_steps = 2; cfg->fpv.roi_center = 0.4; cfg->fpv.noise_level = 0; @@ -368,12 +375,18 @@ static void load_image(const cJSON *root, VencConfigImage *s) s->mirror = json_get_bool(obj, "mirror", s->mirror); s->flip = json_get_bool(obj, "flip", s->flip); s->rotate = json_get_int(obj, "rotate", s->rotate); + /* rotate is a WRITE-ONLY convenience: it decomposes into mirror+flip and + * is then cleared, in both branches. Leaving 180 in the struct made the + * decomposition re-run on every parse and win permanently -- and since + * venc_config_save() writes the field back, a craft that once had + * rotate:180 could never set image.mirror=false again. The write was + * accepted, persisted, reported reinit_pending, read back false, and then + * silently reverted across the restart it had just asked for. */ if (s->rotate == 180) { s->mirror = true; s->flip = true; - } else { - s->rotate = 0; } + s->rotate = 0; } static int parse_resolution(const char *str, uint32_t *w, uint32_t *h) @@ -870,8 +883,14 @@ static void load_fpv(const cJSON *root, VencConfigFpv *s) if (!obj) return; s->roi_enabled = json_get_bool(obj, "roiEnabled", s->roi_enabled); s->roi_qp = json_get_int(obj, "roiQp", s->roi_qp); - if (s->roi_qp < -30) s->roi_qp = -30; - if (s->roi_qp > 30) s->roi_qp = 30; + /* Clamped here, not rejected: this runs on the FILE parse, and a craft + * already carrying the old -30 must still boot. It lands on the new + * bound instead, which is the fix applying itself. The API path + * rejects out-of-range instead (validate_field_cfg), so an operator + * typing -30 is told, rather than reading back a value they did not + * write. */ + if (s->roi_qp < -20) s->roi_qp = -20; + if (s->roi_qp > 20) s->roi_qp = 20; s->roi_steps = (uint16_t)json_get_int(obj, "roiSteps", (int)s->roi_steps); if (s->roi_steps < 1) s->roi_steps = 1; if (s->roi_steps > PIPELINE_ROI_MAX_STEPS) s->roi_steps = PIPELINE_ROI_MAX_STEPS; diff --git a/src/venc_webui.c b/src/venc_webui.c index 61696bd7..86573cb3 100644 --- a/src/venc_webui.c +++ b/src/venc_webui.c @@ -6,1517 +6,1521 @@ #include static const unsigned char dashboard_gz[] = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xbd, 0xdd, 0x76, 0xe3, 0x46, - 0x92, 0x2e, 0x7a, 0xaf, 0xa7, 0x48, 0xcb, 0xdd, 0x0d, 0xb2, 0x05, 0xfe, 0xe9, 0xcf, 0x55, 0x64, - 0x49, 0x35, 0xf5, 0x67, 0x5b, 0x33, 0xf5, 0x67, 0x49, 0x76, 0x4f, 0xaf, 0xea, 0x5a, 0x32, 0x48, - 0x82, 0x22, 0x2c, 0x12, 0xa0, 0x01, 0x50, 0x3f, 0x96, 0xb5, 0xd7, 0x5c, 0xed, 0x07, 0xd8, 0x67, - 0xaf, 0x73, 0xde, 0xe0, 0x5c, 0xef, 0x9b, 0x73, 0x77, 0xae, 0xe6, 0xbc, 0x49, 0x3f, 0xc9, 0x89, - 0x2f, 0x22, 0x13, 0x48, 0x80, 0x20, 0x29, 0x95, 0xcb, 0x33, 0xb3, 0x67, 0x8d, 0x67, 0xba, 0x44, - 0x00, 0x99, 0x91, 0x99, 0x91, 0x91, 0x91, 0x11, 0x91, 0x11, 0x91, 0x4f, 0xbe, 0x78, 0xf9, 0xee, - 0xc5, 0xe9, 0x5f, 0xdf, 0xbf, 0x52, 0xe3, 0x74, 0x3a, 0x39, 0xdc, 0xd8, 0x78, 0x82, 0xbf, 0x6a, - 0xe2, 0x85, 0xe7, 0x07, 0x9b, 0x7e, 0xb8, 0xc9, 0x6f, 0x7c, 0x6f, 0x88, 0xbf, 0x53, 0x3f, 0xf5, - 0xd4, 0x60, 0xec, 0xc5, 0x89, 0x9f, 0x1e, 0x6c, 0x7e, 0x7f, 0xfa, 0x75, 0xe3, 0xd1, 0x66, 0xf6, - 0x3e, 0xf4, 0xa6, 0xfe, 0xc1, 0xe6, 0x65, 0xe0, 0x5f, 0xcd, 0xa2, 0x38, 0xdd, 0x54, 0x83, 0x28, - 0x4c, 0xfd, 0x90, 0xca, 0x5d, 0x05, 0xc3, 0x74, 0x7c, 0x30, 0xf4, 0x2f, 0x83, 0x81, 0xdf, 0xe0, - 0x07, 0x57, 0x05, 0x61, 0x90, 0x06, 0xde, 0xa4, 0x91, 0x0c, 0xbc, 0x89, 0x7f, 0xd0, 0x69, 0xb6, - 0x19, 0x4e, 0x1a, 0xa4, 0x13, 0xff, 0xf0, 0xca, 0xbb, 0xe9, 0xfb, 0xde, 0xf4, 0xec, 0xd2, 0x0f, - 0x07, 0x4f, 0x5a, 0xf2, 0x8e, 0x3e, 0x26, 0xe9, 0x0d, 0xff, 0xf8, 0x87, 0x60, 0x8a, 0x06, 0xd4, - 0x3c, 0x9e, 0xd4, 0x9c, 0x71, 0x9a, 0xce, 0x92, 0x6e, 0xab, 0x35, 0xa2, 0xc6, 0x92, 0xe6, 0x79, - 0x14, 0x9d, 0x4f, 0x7c, 0x6f, 0x16, 0x24, 0xcd, 0x41, 0x34, 0x6d, 0x0d, 0x92, 0x64, 0xfb, 0xe9, - 0xc8, 0x9b, 0x06, 0x93, 0x9b, 0x83, 0x7f, 0xf4, 0xd3, 0xe7, 0xb1, 0x17, 0x84, 0xc9, 0xd6, 0x9b, - 0x28, 0x8c, 0xba, 0x57, 0xe7, 0xe3, 0xf4, 0x1f, 0x76, 0xdb, 0xed, 0xde, 0x1e, 0xfd, 0x6f, 0x9f, - 0xfe, 0xf7, 0x55, 0xbb, 0xfd, 0x27, 0x5d, 0xf4, 0xe5, 0x9b, 0xad, 0x13, 0x2f, 0x4c, 0xaa, 0xcb, - 0x0c, 0x83, 0x64, 0x36, 0xf1, 0x6e, 0x0e, 0x92, 0x2b, 0x6f, 0xe6, 0xd4, 0x7b, 0x1b, 0x1b, 0x7f, - 0xbe, 0x9d, 0x7a, 0xf1, 0x79, 0x10, 0x76, 0xdb, 0xbd, 0x99, 0x37, 0x1c, 0x06, 0xe1, 0x39, 0xfd, - 0xea, 0x47, 0xd7, 0x8d, 0x24, 0xf8, 0x05, 0x0f, 0xfd, 0x28, 0x1e, 0xfa, 0x71, 0x83, 0xde, 0xdc, - 0x6d, 0x6c, 0x74, 0xe3, 0x28, 0x4a, 0x6f, 0x37, 0x36, 0x1a, 0x8d, 0xfe, 0x79, 0xf7, 0xcb, 0xb6, - 0xd7, 0xf6, 0x3a, 0xdb, 0x3d, 0x3c, 0x6c, 0xd3, 0xd3, 0xa8, 0xd3, 0xee, 0x3c, 0xa6, 0xa7, 0x81, - 0x17, 0x0f, 0xbb, 0x5f, 0x76, 0x76, 0x3b, 0x7b, 0xdb, 0x6d, 0xfd, 0xd8, 0x18, 0x47, 0x97, 0x7e, - 0x4c, 0x2f, 0x1f, 0x77, 0xbc, 0x6d, 0xaf, 0xc7, 0x00, 0x18, 0x2e, 0xbd, 0xf2, 0xb7, 0xdb, 0x3b, - 0x7b, 0x3d, 0xf3, 0xa2, 0x31, 0x0e, 0xba, 0x5f, 0x6e, 0x7b, 0xdb, 0xc3, 0x5d, 0x29, 0x96, 0xfa, - 0xd7, 0x69, 0xf7, 0xcb, 0xc1, 0xa3, 0x81, 0x37, 0x04, 0x30, 0x3c, 0x36, 0x86, 0xc1, 0xb4, 0xfb, - 0xe5, 0x7e, 0x7f, 0xdf, 0xff, 0xca, 0x33, 0xaf, 0xfa, 0x71, 0x40, 0xa3, 0xed, 0x7e, 0xe9, 0xfb, - 0xa3, 0xf6, 0x68, 0x97, 0x6b, 0x7a, 0x83, 0x01, 0x4d, 0x1f, 0xbd, 0x7a, 0xbc, 0xbb, 0xb7, 0x8f, - 0xba, 0xf2, 0xa2, 0x71, 0x3e, 0x89, 0xae, 0xba, 0xf1, 0x79, 0xdf, 0xab, 0x6d, 0xef, 0xec, 0xb8, - 0xfb, 0x8f, 0xdd, 0xc7, 0xfb, 0x6e, 0xb3, 0xb3, 0x57, 0xe7, 0x4a, 0x93, 0xe0, 0xd2, 0xa7, 0xf6, - 0xb7, 0x07, 0x7b, 0x7b, 0x7e, 0x4f, 0x1e, 0x31, 0x54, 0x2e, 0xbe, 0xb3, 0xeb, 0x76, 0x1e, 0x7f, - 0xe5, 0x3e, 0xde, 0xa5, 0xe2, 0x52, 0x3a, 0xf6, 0x93, 0xd4, 0x8b, 0xa9, 0x8d, 0xd1, 0xde, 0x63, - 0xbf, 0xdd, 0xef, 0x65, 0x6f, 0xb2, 0x3a, 0xdb, 0xbb, 0x7b, 0x6e, 0x67, 0xef, 0x91, 0xdb, 0xe9, - 0x64, 0x95, 0xfa, 0x93, 0x39, 0x35, 0xb1, 0xd3, 0x7f, 0xb4, 0x3d, 0xda, 0xef, 0xc9, 0x63, 0x56, - 0x7c, 0xef, 0xb1, 0xdb, 0xd9, 0x69, 0xbb, 0xdb, 0xbb, 0xfb, 0xba, 0x38, 0xe1, 0x1c, 0xe4, 0x7c, - 0x0b, 0xfa, 0xc0, 0x8c, 0xf8, 0xdd, 0xce, 0xce, 0x0c, 0x33, 0xd1, 0x8f, 0x86, 0x37, 0xb7, 0x7d, - 0x6f, 0x70, 0x71, 0x1e, 0x47, 0xf3, 0x70, 0xd8, 0xbd, 0xf4, 0xe2, 0x1a, 0x26, 0xa2, 0xde, 0x1b, - 0x44, 0x93, 0x28, 0xd6, 0xcf, 0xc0, 0x4d, 0xbd, 0xc7, 0x95, 0x85, 0x38, 0xba, 0xce, 0xcb, 0x37, - 0x0a, 0xd4, 0xe1, 0xb8, 0xc9, 0x4d, 0x92, 0xfa, 0xd3, 0xc6, 0x3c, 0x70, 0x13, 0x7a, 0x6e, 0x24, - 0x7e, 0x1c, 0x8c, 0x7a, 0xd3, 0x20, 0x6c, 0x8c, 0x7d, 0xc6, 0x65, 0xa7, 0xdd, 0xbe, 0x1c, 0xf7, - 0x30, 0x6f, 0x23, 0xc2, 0x58, 0xe3, 0xba, 0x3b, 0x0e, 0x86, 0x43, 0x3f, 0xa4, 0xb6, 0x07, 0xd1, - 0xd0, 0x77, 0x67, 0xb1, 0xef, 0x36, 0xa7, 0x44, 0x8b, 0xb7, 0x05, 0xf0, 0x19, 0x9d, 0x2a, 0xd0, - 0xa9, 0xe3, 0xa2, 0x44, 0x32, 0xf3, 0x06, 0x7e, 0x2f, 0x1f, 0x42, 0xf3, 0xd1, 0x9e, 0x3f, 0x25, - 0x38, 0xad, 0x3f, 0xab, 0xbf, 0xff, 0xcf, 0x7f, 0xa1, 0xff, 0x57, 0xa7, 0xfe, 0xc4, 0xa7, 0x45, - 0x18, 0xdf, 0xa8, 0xe7, 0x5e, 0x6c, 0x5e, 0xfe, 0xb9, 0xb5, 0xb1, 0xd1, 0x4c, 0xfb, 0x5e, 0x7c, - 0x3b, 0x8b, 0x12, 0x5a, 0x6e, 0x51, 0xd8, 0x4d, 0xd2, 0x60, 0x70, 0x71, 0xd3, 0x4b, 0xa3, 0x19, - 0x11, 0xe9, 0x2f, 0x8d, 0x20, 0x1c, 0xfa, 0xd7, 0xe8, 0x68, 0xaf, 0x02, 0x13, 0xdb, 0xf5, 0x5e, - 0x46, 0xbb, 0x69, 0x1a, 0x4d, 0xbb, 0x9d, 0xd9, 0xb5, 0x4a, 0xa2, 0x49, 0x30, 0x54, 0xba, 0x08, - 0x7f, 0xad, 0xe7, 0x64, 0xaf, 0x3a, 0xcd, 0xed, 0xd8, 0x9f, 0xf6, 0x34, 0x02, 0x76, 0x77, 0x67, - 0xd7, 0x3d, 0xbd, 0x5e, 0xba, 0xa3, 0x89, 0x7f, 0xdd, 0xf3, 0x26, 0xc1, 0x79, 0xd8, 0x08, 0x08, - 0x6d, 0x49, 0x17, 0xb4, 0xe4, 0xc7, 0xbd, 0x73, 0x6f, 0xd6, 0xed, 0xa0, 0x12, 0x7a, 0x30, 0x8c, - 0xa3, 0x59, 0x63, 0x14, 0x4c, 0xe8, 0x43, 0x97, 0xe6, 0x35, 0xae, 0x75, 0xb6, 0x67, 0xd7, 0xf5, - 0x3b, 0x3d, 0x8c, 0x06, 0xb3, 0x82, 0x07, 0xa1, 0xeb, 0x4a, 0x7a, 0x42, 0x0b, 0xd7, 0x42, 0x1f, - 0x37, 0x57, 0x9e, 0x65, 0xbd, 0x02, 0xea, 0xbd, 0x89, 0x9f, 0x52, 0xf3, 0x0d, 0x00, 0xc1, 0xa0, - 0x1a, 0xcd, 0xf6, 0x36, 0x15, 0xbf, 0x1a, 0x53, 0xaf, 0xf9, 0xa5, 0xdf, 0x0d, 0xa3, 0xab, 0xd8, - 0x9b, 0x15, 0x7b, 0xa5, 0xe8, 0x53, 0x78, 0x6b, 0x03, 0x95, 0xd5, 0x52, 0x2f, 0xf4, 0x83, 0x98, - 0x49, 0x56, 0x2d, 0xf1, 0x67, 0xb7, 0xcc, 0x0c, 0x81, 0x57, 0x83, 0xb2, 0xed, 0x36, 0xfd, 0x5e, - 0x9c, 0x0b, 0x41, 0x74, 0x56, 0x15, 0x08, 0xbc, 0xbd, 0x0f, 0x62, 0x9b, 0xbb, 0x18, 0xaa, 0x4d, - 0x38, 0x95, 0x43, 0x27, 0x7e, 0x50, 0x5f, 0x35, 0x42, 0xc0, 0x55, 0xfd, 0xdb, 0x25, 0x0b, 0x43, - 0x8f, 0x6d, 0xdf, 0x1a, 0xdb, 0x90, 0x98, 0x9c, 0x8c, 0xed, 0xab, 0x7c, 0x6c, 0xf8, 0xa9, 0x09, - 0x2a, 0xf6, 0x86, 0xc1, 0x3c, 0xe9, 0xee, 0xb5, 0xff, 0xd8, 0x43, 0xf7, 0x1b, 0xc9, 0x38, 0x0e, - 0xc2, 0x8b, 0x6e, 0x01, 0x40, 0x33, 0x0a, 0x17, 0xd7, 0xa7, 0x41, 0x2a, 0xf3, 0xd7, 0xb1, 0x37, - 0x24, 0x4e, 0xd4, 0x56, 0x6d, 0xf5, 0x88, 0x28, 0xb3, 0x50, 0xa0, 0x08, 0x68, 0x34, 0x5a, 0x84, - 0x94, 0x0f, 0x3c, 0xc2, 0x4c, 0xa7, 0x37, 0x84, 0xac, 0x42, 0x2d, 0x66, 0x5d, 0xa3, 0x59, 0xb2, - 0x58, 0x15, 0x5f, 0x16, 0xba, 0xb0, 0x4f, 0x5d, 0x28, 0x73, 0x39, 0xe2, 0x89, 0x5e, 0x18, 0x4c, - 0x3d, 0x5e, 0x7a, 0xb3, 0xf9, 0x24, 0xf1, 0x01, 0x59, 0x6d, 0x27, 0xca, 0xf7, 0x12, 0x9f, 0xf6, - 0xc0, 0x11, 0xb6, 0x41, 0x9f, 0x9a, 0xfd, 0x87, 0x0b, 0xff, 0x66, 0x14, 0xd3, 0x06, 0x9a, 0xa8, - 0xac, 0xdc, 0x6d, 0xfb, 0x8f, 0x2e, 0x2d, 0xcd, 0x3f, 0xde, 0x9a, 0x0e, 0x76, 0xee, 0xf6, 0xac, - 0xa7, 0xe6, 0xde, 0x5d, 0xd6, 0x5f, 0x26, 0x5d, 0xbd, 0x0f, 0x35, 0x26, 0xfe, 0x28, 0xed, 0x7a, - 0xf3, 0x34, 0xba, 0xd7, 0xda, 0x63, 0x92, 0xc8, 0x00, 0xf5, 0xd3, 0x02, 0xd2, 0xc3, 0x28, 0xf4, - 0xf5, 0x9c, 0x2d, 0x5d, 0xfd, 0xd5, 0xd4, 0x64, 0x78, 0x02, 0xb1, 0x00, 0xd5, 0x69, 0x2f, 0xcc, - 0x3c, 0x38, 0xc3, 0x60, 0x1e, 0x27, 0x54, 0x73, 0x16, 0x05, 0xdc, 0x19, 0x8b, 0x4a, 0xbf, 0xda, - 0xcb, 0xc8, 0x76, 0xfd, 0x3a, 0x4f, 0x63, 0xe2, 0xbe, 0xc2, 0xdd, 0xbc, 0xc9, 0x44, 0xd1, 0x4e, - 0x94, 0xd8, 0xc3, 0xe9, 0xf2, 0xce, 0x79, 0xab, 0x9b, 0xaf, 0xee, 0xec, 0x02, 0x61, 0x17, 0x79, - 0xab, 0xd7, 0x4f, 0x8a, 0x2c, 0x95, 0x5e, 0x14, 0x97, 0xdf, 0x67, 0xe5, 0x9e, 0x98, 0x15, 0x59, - 0x09, 0x5e, 0xff, 0xd6, 0x7c, 0x6d, 0x7e, 0x45, 0x9f, 0x4c, 0x89, 0x12, 0xe6, 0xaa, 0x07, 0x65, - 0xaf, 0xcd, 0xbd, 0x02, 0xff, 0xa3, 0xed, 0x83, 0x19, 0x6e, 0xa1, 0x7b, 0xdb, 0x59, 0xf7, 0x18, - 0xa1, 0x33, 0x2f, 0x26, 0x1a, 0xa9, 0x42, 0x6e, 0x6f, 0x9e, 0x80, 0x3d, 0xd2, 0x86, 0x33, 0x48, - 0x99, 0x40, 0x74, 0x57, 0x35, 0xa2, 0xab, 0x70, 0x89, 0xcf, 0x4d, 0x6f, 0x90, 0xd2, 0xba, 0xa9, - 0x64, 0x91, 0x85, 0x9e, 0x34, 0x2a, 0x4a, 0x68, 0x18, 0x0d, 0x2d, 0x52, 0x66, 0xc8, 0x67, 0xfa, - 0x34, 0x28, 0xd2, 0xc8, 0x99, 0x7a, 0xd7, 0x0d, 0xcd, 0x57, 0x69, 0xf5, 0x10, 0x9d, 0x19, 0xf1, - 0x4c, 0x61, 0x4d, 0x94, 0x20, 0x99, 0x5e, 0x19, 0x80, 0xfd, 0x49, 0x34, 0xb8, 0xb0, 0x16, 0xed, - 0xc8, 0x1b, 0xfa, 0x47, 0xa1, 0x6a, 0xea, 0x25, 0x5b, 0x5c, 0xa9, 0xf2, 0xf1, 0x76, 0x14, 0x47, - 0xd3, 0x6c, 0x55, 0xb6, 0x05, 0x65, 0xa3, 0x28, 0x9e, 0x76, 0xf9, 0xd7, 0xc4, 0x4b, 0xfd, 0xbf, - 0xd6, 0x76, 0xb1, 0x8d, 0xa5, 0x51, 0xbe, 0x94, 0xad, 0x62, 0x8c, 0xc3, 0x02, 0xc5, 0x1d, 0xfb, - 0x03, 0xc2, 0x08, 0x8d, 0x29, 0x01, 0xf1, 0x15, 0x68, 0x2f, 0xf6, 0x07, 0x0d, 0x48, 0xe3, 0x84, - 0xe9, 0x02, 0x05, 0xfe, 0x34, 0xa7, 0xad, 0x7d, 0x74, 0x63, 0xc6, 0xd5, 0xe5, 0xb5, 0xd1, 0xe8, - 0xfb, 0xe9, 0x95, 0xef, 0x87, 0x55, 0x6b, 0x9f, 0xf9, 0x2e, 0xb8, 0x7c, 0x17, 0xff, 0x14, 0xb7, - 0xe1, 0x02, 0x29, 0x43, 0xfc, 0xac, 0xaf, 0x63, 0x02, 0xc5, 0xd5, 0x4d, 0xbc, 0x30, 0x9b, 0x15, - 0xe6, 0x2f, 0xaa, 0x23, 0x33, 0xc3, 0xfc, 0x49, 0x13, 0x9c, 0x66, 0x3c, 0x3c, 0x22, 0xe8, 0x0f, - 0xc5, 0xf1, 0x70, 0x7f, 0x9a, 0xc2, 0x07, 0x8a, 0x3d, 0xbd, 0xdf, 0x6e, 0x66, 0x8f, 0xb8, 0x4f, - 0x33, 0x37, 0x09, 0x40, 0xa8, 0x59, 0x63, 0x15, 0xbb, 0x59, 0x26, 0x00, 0x2c, 0x6c, 0x6a, 0x79, - 0x2d, 0xfe, 0x15, 0x15, 0xf7, 0x79, 0xde, 0x0d, 0x16, 0x0b, 0xd1, 0x9e, 0x53, 0xd9, 0x33, 0x5d, - 0x12, 0x74, 0x17, 0x85, 0xc9, 0xe2, 0xa0, 0xab, 0xc6, 0xac, 0xeb, 0x5c, 0x79, 0x71, 0x81, 0x3b, - 0x2f, 0x08, 0xc8, 0xed, 0x47, 0x15, 0x13, 0xb5, 0x50, 0x6a, 0xa7, 0xc8, 0xf0, 0xb4, 0xc4, 0x5d, - 0xaf, 0xe0, 0xd0, 0xd9, 0x1c, 0xa2, 0x4f, 0x4a, 0xd0, 0x5d, 0x31, 0x89, 0xe5, 0x29, 0xb9, 0xdb, - 0xf8, 0x12, 0xdd, 0xa5, 0x65, 0x46, 0x72, 0x51, 0x3a, 0x6c, 0x86, 0xf3, 0xe9, 0x2d, 0x8f, 0x9f, - 0x27, 0xa5, 0xcb, 0x68, 0x96, 0x3a, 0xd4, 0x83, 0xc0, 0xa3, 0xbf, 0x54, 0x82, 0xa4, 0xe7, 0x41, - 0x97, 0xaa, 0xcc, 0x27, 0xc4, 0xb7, 0xe9, 0x39, 0x29, 0x43, 0x89, 0xa3, 0x2b, 0x62, 0xe7, 0xc9, - 0x22, 0xa4, 0x2a, 0xc1, 0xa5, 0xb2, 0xaa, 0x6a, 0x62, 0x7b, 0xcb, 0x06, 0xb5, 0xc3, 0x83, 0xfa, - 0xaa, 0x34, 0x80, 0xaf, 0xb6, 0xad, 0x51, 0xf2, 0x56, 0xca, 0x05, 0xf5, 0x14, 0xf8, 0xd3, 0x59, - 0x7a, 0x73, 0xbb, 0x7a, 0xcb, 0x63, 0x5a, 0xb7, 0x7a, 0x69, 0x16, 0x5c, 0x35, 0xff, 0xe5, 0x99, - 0x1a, 0x7a, 0xc9, 0xd8, 0x5f, 0xbb, 0xa6, 0xee, 0x2c, 0x71, 0xac, 0x39, 0x98, 0x90, 0x24, 0x8f, - 0x01, 0xde, 0x96, 0x76, 0x03, 0x8b, 0x65, 0x73, 0x3f, 0xf5, 0x8e, 0x58, 0x55, 0x75, 0x09, 0xcb, - 0x36, 0x2b, 0xa1, 0xc0, 0x93, 0x4e, 0x48, 0x2c, 0x66, 0x8e, 0x74, 0xe2, 0x0b, 0xe9, 0x16, 0xd8, - 0x52, 0x22, 0x2f, 0x6f, 0x3f, 0x17, 0xf7, 0xa8, 0xa2, 0x32, 0xa3, 0x49, 0xe5, 0x7a, 0x94, 0x69, - 0xb6, 0x92, 0x23, 0x56, 0xf0, 0xbc, 0x6c, 0xea, 0xf7, 0x33, 0x9e, 0x54, 0x42, 0x5e, 0x79, 0x6f, - 0xb3, 0x96, 0xa4, 0x85, 0xd7, 0x7c, 0x94, 0x84, 0xdc, 0x64, 0xb1, 0x23, 0x46, 0xe6, 0xa8, 0x42, - 0x86, 0x68, 0xf2, 0xf5, 0xc5, 0x4a, 0x6a, 0xbc, 0x73, 0xbb, 0x40, 0x23, 0x25, 0x5e, 0xb4, 0x5c, - 0x6b, 0xc1, 0x90, 0x49, 0x40, 0xb4, 0xa0, 0x0e, 0xc6, 0xfe, 0x65, 0x5c, 0xe2, 0x55, 0x25, 0xe9, - 0x40, 0x53, 0x7c, 0x69, 0x74, 0xd9, 0xce, 0x84, 0x6d, 0xcf, 0x82, 0xd8, 0x24, 0x48, 0x13, 0x6f, - 0x96, 0x10, 0xa1, 0x2e, 0x34, 0x92, 0xef, 0x66, 0x71, 0x94, 0xd2, 0x8e, 0x57, 0x6b, 0x3c, 0x6e, - 0x0f, 0xfd, 0xf3, 0xfa, 0x9a, 0xea, 0xac, 0x84, 0xdb, 0x9b, 0xb9, 0x3d, 0x00, 0xd1, 0xd0, 0x85, - 0x34, 0xa0, 0xb0, 0x2e, 0xa1, 0x9e, 0x02, 0x95, 0x7e, 0x1d, 0xf8, 0x93, 0xa1, 0x3a, 0x8e, 0xae, - 0x8a, 0xe4, 0x39, 0xc2, 0xeb, 0xac, 0xa1, 0xf3, 0x38, 0x18, 0xf6, 0xf0, 0x0f, 0xe1, 0x63, 0x3a, - 0xc3, 0x06, 0x0d, 0x99, 0x63, 0x3e, 0x0d, 0x13, 0xd2, 0xbf, 0xda, 0x10, 0x58, 0x47, 0x31, 0x0b, - 0x0b, 0x2b, 0x69, 0x68, 0x2f, 0xa3, 0xa1, 0xfb, 0xc9, 0x79, 0x99, 0xb0, 0x5d, 0x29, 0x54, 0x69, - 0x18, 0xcc, 0x70, 0x76, 0xaa, 0x44, 0xb1, 0x3b, 0x33, 0x8c, 0xee, 0xc4, 0x4b, 0x52, 0x42, 0x7c, - 0x40, 0x23, 0x2a, 0xb6, 0x6c, 0x10, 0xc8, 0xc5, 0x9a, 0x83, 0xb1, 0x17, 0x9e, 0xfb, 0x59, 0x19, - 0x40, 0x6e, 0x54, 0xf3, 0xfd, 0x55, 0x3b, 0xca, 0x4e, 0x3d, 0x83, 0xd8, 0x98, 0x78, 0x7d, 0x7f, - 0x72, 0xbb, 0x6e, 0xff, 0xad, 0x9b, 0x35, 0x35, 0xf6, 0x27, 0xb3, 0xde, 0xbd, 0xb5, 0xd4, 0x52, - 0x33, 0xeb, 0x59, 0x53, 0xb3, 0xef, 0x0d, 0xcf, 0x7d, 0xbb, 0x3b, 0x58, 0xd5, 0x39, 0x17, 0x26, - 0x24, 0xee, 0x2d, 0xe8, 0x1d, 0x84, 0xda, 0x85, 0x35, 0xc5, 0x70, 0x73, 0x02, 0x9e, 0xcf, 0x66, - 0x7e, 0x3c, 0x20, 0x91, 0xe1, 0xbe, 0x0a, 0x48, 0xc9, 0x60, 0x40, 0x38, 0x93, 0xd1, 0x70, 0xff, - 0x58, 0x3c, 0x58, 0x94, 0x17, 0x7a, 0x95, 0x4a, 0x25, 0xcc, 0x4f, 0x79, 0x4d, 0x3d, 0x41, 0xb7, - 0xeb, 0x26, 0xad, 0xf0, 0x45, 0x40, 0x68, 0x08, 0xa1, 0xa7, 0x2b, 0x7f, 0xf9, 0x78, 0xe0, 0xed, - 0x78, 0xa3, 0x85, 0xa9, 0xee, 0xec, 0xed, 0xbb, 0x9d, 0xfd, 0x1d, 0xb7, 0xf3, 0xd5, 0x1e, 0x9b, - 0xf0, 0xee, 0xcc, 0x1c, 0x50, 0x4d, 0x4b, 0xcf, 0xcc, 0xdf, 0x92, 0xce, 0x3a, 0x9b, 0xa7, 0x6e, - 0xfe, 0x2c, 0xbc, 0xd2, 0x7a, 0xd1, 0x4c, 0xa3, 0xf3, 0x73, 0xda, 0x95, 0x34, 0x47, 0x6d, 0xf8, - 0x97, 0x34, 0xd1, 0x89, 0xa1, 0xcd, 0x7c, 0xa5, 0x1e, 0x01, 0x50, 0x61, 0x95, 0x32, 0xe8, 0x0f, - 0xe9, 0xcd, 0xcc, 0x3f, 0xd8, 0xc4, 0x9c, 0x6c, 0x7e, 0x74, 0xed, 0x57, 0x24, 0x13, 0xf4, 0xfd, - 0x98, 0x5e, 0x4a, 0x93, 0xb7, 0x1b, 0x1b, 0x95, 0xd6, 0xbb, 0x07, 0x6a, 0xab, 0xf9, 0xb6, 0x4d, - 0xc4, 0x02, 0x3b, 0x42, 0x85, 0x18, 0x54, 0xa6, 0xf8, 0x25, 0xe6, 0xc0, 0xdc, 0x08, 0xa8, 0xd5, - 0x0f, 0xd2, 0xdd, 0x2d, 0x6d, 0x64, 0xfb, 0x11, 0x94, 0x11, 0x7b, 0x17, 0xb1, 0x54, 0x52, 0xa3, - 0xb6, 0xf2, 0x80, 0xbb, 0xa3, 0x68, 0x30, 0x4f, 0xf4, 0x38, 0xe5, 0xe1, 0x36, 0x9a, 0xa7, 0x10, - 0x61, 0x6d, 0x8d, 0xbc, 0x5a, 0x51, 0xaa, 0x42, 0xd9, 0x6d, 0x63, 0x1a, 0xfd, 0xd2, 0xf0, 0x88, - 0xb0, 0x3d, 0x6a, 0x9e, 0xc4, 0x24, 0x8c, 0x9c, 0x67, 0xac, 0xba, 0x7c, 0xb7, 0x4b, 0xeb, 0xa3, - 0x7f, 0x11, 0xa4, 0x0d, 0x6a, 0x96, 0x49, 0x1b, 0x7b, 0xf1, 0x9c, 0x98, 0x4c, 0xe8, 0xae, 0x2e, - 0x1f, 0x84, 0x61, 0xb1, 0xfc, 0xad, 0xf9, 0x62, 0xb5, 0xce, 0x63, 0x30, 0x5a, 0x19, 0x0d, 0x5a, - 0x4f, 0x68, 0x69, 0x2b, 0x5e, 0x56, 0xb1, 0xfc, 0x9c, 0x53, 0x41, 0x83, 0xb4, 0xb6, 0x73, 0xbf, - 0x8b, 0x73, 0x81, 0xcd, 0xa1, 0x97, 0x7a, 0x5d, 0x7e, 0x6e, 0x25, 0x97, 0xe7, 0x5b, 0xd7, 0xd3, - 0x89, 0xfb, 0xc7, 0x9d, 0x17, 0xf4, 0x53, 0xd1, 0xcf, 0x30, 0x39, 0xe0, 0x83, 0x83, 0x6e, 0xab, - 0x75, 0x75, 0x75, 0xd5, 0xbc, 0xda, 0x69, 0x46, 0xf1, 0x79, 0x8b, 0x78, 0x7f, 0x1b, 0x85, 0x1d, - 0x25, 0x07, 0x16, 0x4e, 0xa7, 0xed, 0x28, 0xb1, 0x5d, 0x1d, 0x38, 0xfb, 0xce, 0x1f, 0x77, 0x5e, - 0x11, 0x84, 0x99, 0x97, 0x8e, 0xd5, 0xf0, 0xc0, 0x79, 0xd3, 0x56, 0xed, 0xc9, 0x9e, 0xda, 0x57, - 0x7b, 0x8d, 0xfd, 0x5f, 0x1c, 0x35, 0x0a, 0x26, 0x93, 0x03, 0xe7, 0x8f, 0xdb, 0x3b, 0x62, 0x55, - 0x77, 0x5a, 0x52, 0x1a, 0xe0, 0xe8, 0xd7, 0xa6, 0xbd, 0x5e, 0x69, 0xa5, 0xd2, 0x00, 0x20, 0x5e, - 0xe8, 0x5f, 0xf6, 0xb7, 0xcc, 0x50, 0xcb, 0x6c, 0x8e, 0xed, 0x5a, 0xc5, 0x7d, 0x47, 0x4c, 0x3d, - 0xdd, 0xed, 0x5d, 0x36, 0x62, 0xd3, 0x72, 0x3a, 0xe5, 0xe5, 0xa6, 0x4e, 0xae, 0x82, 0x74, 0x30, - 0xd6, 0xf6, 0x09, 0xb3, 0x02, 0x0d, 0x2c, 0x9f, 0xf6, 0x38, 0x62, 0x2f, 0x19, 0x33, 0x0e, 0x42, - 0xd0, 0x52, 0x43, 0x94, 0x5d, 0xa1, 0xce, 0xdd, 0x7d, 0xcb, 0x08, 0x89, 0xdf, 0x05, 0xbb, 0x5c, - 0x8f, 0x78, 0x71, 0x1a, 0x0c, 0xbc, 0x89, 0x16, 0x69, 0xa7, 0x24, 0x81, 0x4d, 0xa0, 0x4f, 0x49, - 0x53, 0xc2, 0x15, 0xf2, 0x06, 0xbd, 0x3e, 0x2d, 0x3d, 0xa2, 0x9c, 0x5e, 0xae, 0x15, 0x4b, 0x2b, - 0x6d, 0xd3, 0x44, 0x3b, 0xab, 0x0b, 0xce, 0x3b, 0xb8, 0x28, 0x29, 0xe0, 0x4b, 0xfa, 0x64, 0x2d, - 0xf8, 0x2f, 0x77, 0x76, 0x76, 0xf6, 0xf7, 0xda, 0xa5, 0xd5, 0x0a, 0xdb, 0x7e, 0x6f, 0xb9, 0x3c, - 0x6c, 0xcb, 0x6d, 0x3b, 0x89, 0x9b, 0x5b, 0xf0, 0xf0, 0x68, 0x1b, 0xf4, 0x88, 0xcd, 0xfb, 0xa9, - 0x6a, 0x2b, 0x18, 0x45, 0x76, 0x8d, 0x61, 0xaf, 0xed, 0xe2, 0xff, 0x9a, 0x7b, 0x75, 0xb7, 0xad, - 0xc0, 0x5e, 0xda, 0x5a, 0xb5, 0xda, 0xdb, 0x73, 0xcd, 0xff, 0x9a, 0x6d, 0xe6, 0xa1, 0xf6, 0xc8, - 0xba, 0xdd, 0xbe, 0x4f, 0xfb, 0x0a, 0xf6, 0x00, 0xd1, 0xcc, 0x1d, 0xa7, 0x57, 0x1c, 0xec, 0x22, - 0xda, 0x20, 0xed, 0x60, 0x24, 0x46, 0x1a, 0xd0, 0xf8, 0x60, 0xe3, 0xf0, 0x12, 0x43, 0xf1, 0x97, - 0x8f, 0xbc, 0x47, 0xc3, 0xc7, 0x5e, 0x85, 0x81, 0xb5, 0x5a, 0xb2, 0xdb, 0x49, 0xd4, 0x60, 0xde, - 0x0f, 0x06, 0x8d, 0xbe, 0xff, 0x4b, 0xe0, 0xc7, 0xb5, 0xe6, 0x2e, 0x75, 0xde, 0x6d, 0x6e, 0xbb, - 0x9d, 0xba, 0x5b, 0x44, 0x53, 0xd1, 0xd0, 0x59, 0x85, 0x91, 0xdd, 0x7a, 0x89, 0x12, 0xba, 0x24, - 0x16, 0x0e, 0x2e, 0xfc, 0xe1, 0x56, 0x71, 0x8e, 0xef, 0x63, 0xcd, 0x5d, 0x85, 0xf9, 0x1d, 0x60, - 0xbe, 0xcd, 0xe6, 0x44, 0x55, 0x3e, 0x7f, 0xda, 0xb9, 0xef, 0xac, 0xac, 0xea, 0x61, 0x36, 0x57, - 0x15, 0x36, 0x9c, 0x7f, 0xae, 0x01, 0xe5, 0x85, 0x8d, 0xf7, 0xcb, 0xd1, 0x68, 0xb4, 0x1e, 0x3b, - 0x3b, 0x45, 0x09, 0xf5, 0x19, 0x0b, 0xb7, 0xea, 0x39, 0x73, 0xc7, 0xa2, 0x94, 0xba, 0xdc, 0x26, - 0x50, 0x94, 0x6c, 0x20, 0x78, 0xb6, 0x7b, 0xe5, 0x33, 0x1d, 0x2d, 0x04, 0x56, 0x1e, 0xe5, 0x64, - 0x2a, 0xd6, 0x0a, 0x39, 0xda, 0xe8, 0x5c, 0x28, 0x22, 0x1a, 0x4f, 0x7e, 0x3e, 0xc4, 0x42, 0x89, - 0xad, 0x3b, 0xef, 0x59, 0xd6, 0x48, 0xbd, 0xe3, 0xda, 0x3b, 0x93, 0x21, 0xbf, 0x95, 0x56, 0xde, - 0x47, 0x55, 0x0a, 0x4e, 0x95, 0x6c, 0xbc, 0x6e, 0xbf, 0xd5, 0xbd, 0xeb, 0x12, 0xde, 0xa0, 0xd5, - 0x0e, 0x73, 0xd1, 0x65, 0x67, 0xcf, 0xb4, 0x1f, 0x46, 0x50, 0xc7, 0x49, 0x7b, 0xf4, 0x87, 0xba, - 0x38, 0x36, 0x96, 0xc9, 0xcd, 0x32, 0xeb, 0xbe, 0x96, 0x9b, 0xda, 0xed, 0x76, 0xa1, 0xb8, 0x88, - 0xa5, 0x80, 0x56, 0xcb, 0x9a, 0xab, 0xdb, 0x30, 0xbe, 0xec, 0xec, 0x7b, 0x3b, 0xbb, 0x5e, 0xb5, - 0x15, 0xb0, 0xd1, 0xd1, 0xa7, 0x59, 0x80, 0x67, 0xc4, 0xbb, 0x65, 0x92, 0x5c, 0x55, 0x1f, 0xcc, - 0x79, 0xe9, 0xda, 0x5e, 0x0c, 0x1f, 0x7f, 0xf5, 0x55, 0x7b, 0xff, 0x1e, 0xbd, 0xa0, 0xea, 0xd0, - 0x4a, 0x6f, 0x97, 0x9d, 0x39, 0x55, 0xda, 0xc6, 0xed, 0x9a, 0xcb, 0x74, 0xdd, 0xec, 0x34, 0xba, - 0x64, 0x4c, 0x8f, 0x48, 0x7b, 0x29, 0x5a, 0xd3, 0x23, 0xd6, 0x67, 0x68, 0x8e, 0x49, 0xba, 0xf6, - 0xad, 0xb3, 0xca, 0x51, 0x70, 0xed, 0x0f, 0x99, 0x17, 0xee, 0xd1, 0xba, 0xea, 0xc9, 0xc6, 0xd7, - 0xb1, 0x09, 0x93, 0x76, 0xec, 0xa2, 0x82, 0xc1, 0x9b, 0xd6, 0x30, 0x88, 0x45, 0x83, 0xec, 0x8a, - 0x56, 0x57, 0xd4, 0x31, 0xb8, 0xb9, 0xdb, 0xe5, 0x5a, 0x9c, 0x45, 0xba, 0xd5, 0x9a, 0x0e, 0xaf, - 0xfa, 0xdc, 0x42, 0xcc, 0xf0, 0x60, 0x22, 0xde, 0x11, 0x13, 0xb1, 0xcb, 0x2f, 0xde, 0xcd, 0xd3, - 0xec, 0x8d, 0xda, 0x6e, 0x7e, 0x95, 0x28, 0x9a, 0x85, 0x2b, 0x42, 0x57, 0x62, 0x49, 0x84, 0x3b, - 0xfb, 0xed, 0x92, 0x3a, 0x02, 0x3b, 0x7d, 0xa5, 0x26, 0x98, 0xf5, 0xbc, 0x11, 0x5d, 0x2c, 0x98, - 0x00, 0xed, 0x73, 0xf5, 0xbd, 0x7a, 0x6f, 0x99, 0xc2, 0x67, 0x13, 0x76, 0xc1, 0x74, 0x69, 0x40, - 0xfb, 0x71, 0xbc, 0x68, 0x5e, 0x2c, 0x1e, 0xf1, 0x2f, 0x83, 0x6d, 0x38, 0x79, 0xb5, 0xed, 0xde, - 0xb2, 0x99, 0x6b, 0x74, 0xdd, 0xc3, 0x68, 0xae, 0x19, 0xee, 0x3a, 0xab, 0x79, 0x19, 0x36, 0x61, - 0xfe, 0xd6, 0xaa, 0xb2, 0x12, 0x74, 0x91, 0x31, 0xbf, 0x3f, 0x52, 0xc7, 0xfe, 0xc8, 0x27, 0x65, - 0x7b, 0xe0, 0xc3, 0xee, 0x4e, 0x7b, 0x45, 0x81, 0x3b, 0xcf, 0x82, 0x06, 0x30, 0x33, 0xbb, 0x2d, - 0x1a, 0xa7, 0xc4, 0x4a, 0x7d, 0x67, 0x97, 0xa8, 0x34, 0xe5, 0x54, 0xa1, 0xab, 0x64, 0xe6, 0xda, - 0xaf, 0xe4, 0x88, 0xcb, 0xd4, 0xd3, 0x05, 0xbd, 0x73, 0x3f, 0xef, 0x06, 0x9b, 0x3e, 0x6f, 0x2d, - 0x3d, 0x24, 0x57, 0x19, 0xd8, 0x06, 0xd3, 0x35, 0x3f, 0x3e, 0x9b, 0xbd, 0xbf, 0x64, 0x9d, 0x5b, - 0xb4, 0x09, 0x5b, 0x1d, 0x53, 0xe9, 0xd8, 0x36, 0xe3, 0x82, 0x9a, 0x2a, 0x6d, 0xcd, 0xd5, 0xc7, - 0x6a, 0xeb, 0x8f, 0xbb, 0xf6, 0x8b, 0xc7, 0x5d, 0x5f, 0x65, 0x06, 0xd9, 0x7b, 0xa1, 0x71, 0x77, - 0xa1, 0xb7, 0xc3, 0xdb, 0xca, 0xde, 0xad, 0xdf, 0x52, 0x4b, 0x62, 0x33, 0x15, 0x2d, 0x41, 0xd6, - 0xa6, 0x42, 0x34, 0xb1, 0xce, 0x5a, 0x88, 0x5a, 0xd0, 0x3e, 0xee, 0xeb, 0xff, 0x60, 0xa3, 0x09, - 0x3e, 0x32, 0x45, 0x9b, 0x1f, 0x8f, 0xa0, 0xfa, 0xc8, 0x1f, 0x0d, 0x4d, 0xfd, 0x74, 0x1c, 0x0d, - 0x3f, 0xa5, 0x29, 0xe1, 0x32, 0x65, 0xec, 0x97, 0x9c, 0x31, 0x4c, 0x33, 0x43, 0x3f, 0x19, 0x54, - 0x9f, 0x18, 0xe2, 0xab, 0x7f, 0xed, 0x4d, 0x67, 0x0f, 0x74, 0xf8, 0xb0, 0xda, 0xac, 0xa6, 0x13, - 0x8b, 0xfd, 0xb2, 0x0c, 0x7d, 0x45, 0x53, 0xd5, 0xe8, 0xc7, 0xbe, 0x77, 0xd1, 0xe5, 0x7f, 0x21, - 0x25, 0x14, 0x0d, 0x15, 0xdf, 0x2d, 0x1c, 0xc2, 0x05, 0x3f, 0xd3, 0x06, 0x94, 0xc6, 0xd1, 0x7a, - 0xdb, 0xaa, 0x2c, 0x7d, 0xd6, 0xb6, 0x8c, 0x57, 0x50, 0x73, 0xbf, 0x57, 0x66, 0x20, 0xdb, 0x65, - 0xf1, 0xee, 0x73, 0xad, 0xca, 0x3b, 0xe9, 0x2c, 0x36, 0xd7, 0x38, 0x9a, 0x2c, 0x95, 0x2c, 0x4b, - 0x27, 0x6c, 0xa5, 0xee, 0xe9, 0xd5, 0x4b, 0x70, 0x0a, 0x22, 0xe0, 0x6e, 0x79, 0xeb, 0x5c, 0xde, - 0xad, 0xea, 0xc1, 0x2c, 0x9a, 0x62, 0x7e, 0x93, 0xf4, 0xb8, 0x57, 0x2d, 0x3d, 0xe6, 0x5d, 0x5f, - 0xee, 0x09, 0xb0, 0x7a, 0xf7, 0xd2, 0xd5, 0x9b, 0x93, 0xc8, 0xc3, 0xc8, 0x2d, 0xc3, 0x58, 0xaf, - 0xda, 0xc8, 0x85, 0x0a, 0x24, 0xa9, 0xcd, 0x27, 0xe9, 0xed, 0xe7, 0x3e, 0x4d, 0xad, 0x38, 0x47, - 0xed, 0x98, 0x43, 0xef, 0x71, 0xe6, 0x63, 0x64, 0xb3, 0xe3, 0x82, 0x23, 0xc8, 0x42, 0x07, 0x9b, - 0x97, 0x41, 0x12, 0x60, 0xab, 0x28, 0xa8, 0xa4, 0x85, 0x22, 0x6a, 0x16, 0x17, 0xac, 0xac, 0x5f, - 0xed, 0x55, 0x5b, 0x7d, 0x8b, 0x44, 0xbe, 0x57, 0x60, 0x2e, 0x04, 0xa2, 0x61, 0xd8, 0x0b, 0x01, - 0x26, 0xc1, 0xd5, 0xbf, 0xc7, 0xda, 0x91, 0x63, 0x37, 0x2a, 0x4f, 0x2a, 0x61, 0x03, 0x5c, 0x7b, - 0xd9, 0x69, 0x69, 0x85, 0x5d, 0xb9, 0x6a, 0x8f, 0x5e, 0x38, 0x55, 0x2d, 0x00, 0xd7, 0x46, 0x0c, - 0xcb, 0x7d, 0x00, 0x06, 0xbb, 0x72, 0xa1, 0xa2, 0x1a, 0xb4, 0x6b, 0x96, 0x80, 0x59, 0x68, 0x1e, - 0x75, 0xfe, 0xf7, 0x3d, 0x0a, 0xdb, 0x5f, 0x72, 0x14, 0xa6, 0x5b, 0x7f, 0xe8, 0x49, 0x98, 0xb5, - 0x9f, 0x7d, 0xa6, 0xa3, 0xb0, 0x42, 0x47, 0xee, 0x79, 0x12, 0x56, 0xa8, 0xa3, 0xc6, 0xbb, 0xb7, - 0xeb, 0xd4, 0xc4, 0x4a, 0x47, 0x3b, 0x3e, 0x02, 0xb3, 0x0d, 0x8b, 0x25, 0xb8, 0x4d, 0xde, 0x6e, - 0x16, 0xce, 0x7a, 0x97, 0xed, 0x13, 0x8c, 0x76, 0xd1, 0x3a, 0x32, 0x11, 0x4f, 0x03, 0xbc, 0xf7, - 0xd9, 0xda, 0xfe, 0xde, 0xba, 0xc3, 0xb5, 0x22, 0xd5, 0xd8, 0x87, 0x64, 0xa5, 0xb6, 0x56, 0x1d, - 0xb1, 0xad, 0x05, 0x52, 0x79, 0xd0, 0x66, 0x7f, 0xbb, 0x87, 0x30, 0x53, 0xa4, 0x7a, 0x21, 0xc4, - 0x45, 0xed, 0xab, 0xe8, 0x52, 0xa2, 0xcf, 0xce, 0xb9, 0xad, 0x99, 0x47, 0x62, 0x3a, 0x0e, 0xae, - 0x66, 0xd9, 0x02, 0xda, 0x31, 0x36, 0xf7, 0x4f, 0xb0, 0xe4, 0x2f, 0xb1, 0xd3, 0x3f, 0x4c, 0x4e, - 0xd8, 0x5e, 0x79, 0x82, 0x55, 0x61, 0x42, 0x5c, 0xe9, 0x05, 0x55, 0x18, 0xe4, 0x27, 0x6d, 0x37, - 0xbd, 0x25, 0x36, 0x32, 0x76, 0xba, 0xae, 0x0b, 0x37, 0xf4, 0xaf, 0x67, 0x1e, 0xa9, 0xbf, 0xc3, - 0x7f, 0xb3, 0xcd, 0x65, 0x85, 0x3b, 0x94, 0xdd, 0x9f, 0xf2, 0xba, 0x5d, 0xa3, 0xf5, 0xb0, 0xd7, - 0x64, 0xe5, 0xea, 0x2e, 0x81, 0xc5, 0x83, 0x1c, 0x2f, 0xc5, 0xd1, 0xd5, 0xfd, 0xdc, 0x5e, 0xf7, - 0x2b, 0x3c, 0x55, 0xaa, 0xfd, 0x6a, 0xaa, 0x1b, 0x5a, 0x38, 0xe9, 0xac, 0xde, 0xf4, 0x34, 0xa7, - 0xa0, 0x46, 0x32, 0x87, 0xb3, 0x05, 0xcb, 0xf9, 0xfd, 0x88, 0x72, 0x69, 0x4f, 0x64, 0x53, 0xfa, - 0xbc, 0x27, 0x5d, 0xbb, 0xf7, 0x3e, 0xe9, 0x92, 0x61, 0x3d, 0x6a, 0x97, 0x17, 0x57, 0xd5, 0xa1, - 0xd7, 0x8a, 0x33, 0xa6, 0x55, 0x63, 0x5b, 0x71, 0x76, 0xe4, 0xde, 0xaf, 0xde, 0xc2, 0x19, 0xd5, - 0xb2, 0x33, 0xa7, 0x35, 0x1d, 0x79, 0xe0, 0x41, 0xdb, 0x2a, 0x58, 0xe5, 0xc3, 0xf7, 0x87, 0x9f, - 0xbb, 0xef, 0x55, 0xb5, 0x40, 0xab, 0x30, 0x0e, 0xae, 0x1b, 0x70, 0x5d, 0xb8, 0x2d, 0x9d, 0xe5, - 0x88, 0x4f, 0x03, 0xd1, 0xf5, 0x6e, 0x2e, 0x32, 0x80, 0x99, 0x6f, 0xb3, 0xdb, 0xd0, 0x0a, 0x40, - 0x5a, 0xec, 0x91, 0x99, 0xde, 0x47, 0xed, 0x05, 0xd7, 0xa5, 0x0a, 0x00, 0x6b, 0xdc, 0xd7, 0x6c, - 0x53, 0xf2, 0x23, 0x4b, 0xb9, 0x91, 0x37, 0xfb, 0xf7, 0xd3, 0x9e, 0xa5, 0xd9, 0x4f, 0x39, 0xcc, - 0xda, 0xd9, 0x2f, 0x1d, 0x94, 0x94, 0x9c, 0xcc, 0x73, 0xb8, 0x7a, 0xf4, 0x2b, 0xcf, 0xa9, 0xb2, - 0xc2, 0x8d, 0x84, 0xfa, 0x68, 0x5b, 0x28, 0xb3, 0x03, 0x9b, 0xd2, 0x7e, 0xc1, 0x87, 0x18, 0x95, - 0x96, 0xf8, 0x4a, 0x1e, 0xbc, 0x5d, 0x3a, 0x18, 0x66, 0xc9, 0x60, 0xa1, 0xd9, 0xaa, 0x83, 0xa4, - 0xc5, 0x9e, 0x18, 0x01, 0x7c, 0x37, 0x3b, 0x35, 0xe2, 0x9f, 0xd9, 0x49, 0x92, 0xe6, 0x86, 0x3b, - 0x55, 0x9b, 0x6e, 0xce, 0xd2, 0x56, 0x9e, 0x22, 0x95, 0xba, 0x57, 0x3e, 0x50, 0x59, 0x40, 0xd7, - 0xb2, 0x63, 0x9f, 0x87, 0x00, 0x59, 0x7d, 0x32, 0xd3, 0xd9, 0xaf, 0x38, 0x99, 0x29, 0x7a, 0xaf, - 0x0d, 0x48, 0xff, 0x9d, 0xf4, 0x8b, 0xb1, 0x31, 0x39, 0x0b, 0x49, 0xcc, 0x67, 0xb3, 0x0e, 0x72, - 0xfa, 0x11, 0x2d, 0xba, 0xa2, 0xe8, 0xb2, 0x43, 0x2d, 0xf1, 0xe1, 0xa8, 0xac, 0x30, 0x9e, 0x4f, - 0xfb, 0xab, 0x2c, 0xe5, 0x8b, 0xce, 0x2a, 0xab, 0x20, 0x2d, 0x93, 0xad, 0x2d, 0x57, 0x53, 0x0b, - 0x03, 0xaf, 0x45, 0x7b, 0x2d, 0x7a, 0xed, 0xcd, 0x98, 0xe7, 0xde, 0xae, 0x58, 0x4a, 0x4c, 0x3d, - 0x36, 0x51, 0xe9, 0x5d, 0x67, 0x7b, 0xb5, 0x74, 0x41, 0xcb, 0xba, 0xb1, 0xc2, 0xd3, 0xdb, 0x22, - 0xac, 0x5c, 0xb8, 0x40, 0x6f, 0x48, 0xac, 0x4c, 0x14, 0x3a, 0x41, 0x33, 0x55, 0x1d, 0x1e, 0x81, - 0x52, 0x30, 0xf0, 0x2e, 0x88, 0xc3, 0x3b, 0xfb, 0x22, 0x0e, 0x43, 0x10, 0xd3, 0xaa, 0x7a, 0x03, - 0x08, 0xa2, 0x81, 0xad, 0x15, 0x1a, 0xca, 0xde, 0xd3, 0x25, 0x2d, 0x69, 0x67, 0xf9, 0xe6, 0x9f, - 0x89, 0x1b, 0xd4, 0xec, 0x93, 0x96, 0x09, 0x51, 0x7c, 0xd2, 0x32, 0x11, 0x93, 0x10, 0xae, 0xf1, - 0xf7, 0x8b, 0x46, 0xa3, 0x14, 0xa4, 0xd5, 0x68, 0xe0, 0xfd, 0x30, 0xb8, 0x54, 0x83, 0x89, 0x97, - 0x24, 0x07, 0x9b, 0x70, 0xd0, 0x44, 0x14, 0xa4, 0x52, 0xe5, 0xb7, 0x12, 0x62, 0xb4, 0x69, 0x02, - 0x23, 0x9f, 0x20, 0xd6, 0xe8, 0x50, 0x87, 0x47, 0xf2, 0xef, 0x27, 0x2d, 0xaa, 0x51, 0x5d, 0x35, - 0xf1, 0x67, 0x9b, 0xab, 0xbe, 0x03, 0x0f, 0x9b, 0x2a, 0x18, 0xea, 0x47, 0x42, 0x58, 0x42, 0x93, - 0xb1, 0x79, 0x78, 0xf9, 0xa4, 0x7f, 0xd8, 0x78, 0xd2, 0xea, 0x3f, 0xa0, 0x2e, 0x28, 0xd1, 0x0f, - 0x87, 0xd4, 0xdc, 0xfa, 0xaa, 0xf7, 0xea, 0xd6, 0xe1, 0xc2, 0x6b, 0x84, 0xcf, 0x98, 0xc0, 0x1c, - 0x53, 0xff, 0xeb, 0xf7, 0x27, 0xea, 0x49, 0x3f, 0xef, 0x06, 0x7f, 0xba, 0x4f, 0xd7, 0x55, 0xe6, - 0x08, 0xbb, 0xa9, 0xa2, 0x90, 0x1f, 0x0e, 0x36, 0x13, 0x76, 0xa4, 0x38, 0xf5, 0xfa, 0x35, 0x27, - 0xce, 0xdc, 0xf0, 0x9d, 0xfa, 0xa6, 0xe2, 0x39, 0x38, 0xd8, 0x7c, 0x37, 0xf3, 0x43, 0xdb, 0x41, - 0x3f, 0xf5, 0xfa, 0x9b, 0x87, 0xc7, 0xaf, 0x5e, 0xa8, 0xca, 0xbe, 0x46, 0xa3, 0x91, 0x85, 0x20, - 0x02, 0x68, 0x3a, 0xbd, 0xa2, 0x6b, 0xac, 0x72, 0x0a, 0x21, 0xd0, 0x57, 0x11, 0x69, 0x0a, 0x05, - 0xfa, 0x69, 0x68, 0x75, 0x98, 0xf6, 0xe5, 0x28, 0x4e, 0x5f, 0x44, 0xb4, 0x5a, 0xce, 0x6b, 0xf5, - 0xcd, 0xc3, 0x57, 0xfc, 0xac, 0xfe, 0xf1, 0xe4, 0xdd, 0x5b, 0xc2, 0x01, 0xd7, 0x96, 0x76, 0x74, - 0x8b, 0xd9, 0x5f, 0x26, 0x49, 0xc4, 0xb6, 0x2c, 0x52, 0x22, 0xbd, 0xad, 0xa0, 0x44, 0xaf, 0xaf, - 0x24, 0x5c, 0xa2, 0x1a, 0x5d, 0x89, 0xf6, 0x10, 0x26, 0x64, 0x1d, 0x1a, 0x6f, 0xe1, 0x25, 0xc3, - 0x24, 0x9c, 0x55, 0x82, 0xf0, 0x66, 0x01, 0x6a, 0x17, 0x8e, 0x62, 0x2c, 0x10, 0xe8, 0xf1, 0x0f, - 0x62, 0xb0, 0x52, 0xfd, 0x1b, 0x35, 0xf4, 0x47, 0x1e, 0x6c, 0x58, 0x8a, 0x8f, 0x66, 0x8f, 0xbe, - 0x7b, 0xe1, 0xcd, 0xbc, 0x7e, 0x30, 0xa1, 0x8d, 0xbc, 0x56, 0x57, 0x63, 0xda, 0x36, 0x12, 0x15, - 0xd0, 0x14, 0x84, 0x93, 0x1b, 0x75, 0x35, 0xf6, 0x43, 0xc6, 0x27, 0xfd, 0xd7, 0xa2, 0x56, 0x5a, - 0x97, 0x9d, 0xd6, 0xc0, 0x14, 0x0f, 0x10, 0x75, 0xc5, 0x3b, 0xe9, 0xa5, 0x4f, 0x65, 0x63, 0x1f, - 0x08, 0x4c, 0x54, 0x0c, 0xc1, 0x32, 0xa1, 0xad, 0x48, 0x1d, 0x1c, 0x1c, 0xa8, 0x91, 0x37, 0x49, - 0xfc, 0x9e, 0x62, 0xd9, 0x8d, 0x46, 0x66, 0x80, 0x89, 0x01, 0x46, 0x4d, 0x49, 0x31, 0x52, 0x5e, - 0xc8, 0x61, 0xcd, 0x54, 0x34, 0x98, 0xcc, 0x63, 0x5f, 0xd1, 0xe6, 0x34, 0x18, 0xab, 0x74, 0xec, - 0x83, 0x48, 0x40, 0x0a, 0x8a, 0x46, 0x3a, 0x56, 0x61, 0xa4, 0x68, 0x21, 0x2b, 0xac, 0x96, 0x26, - 0xe3, 0xbe, 0x02, 0x39, 0x4c, 0x32, 0x5e, 0x1f, 0x53, 0xdd, 0x08, 0x7e, 0xae, 0x46, 0x56, 0xf0, - 0x33, 0x70, 0x75, 0x04, 0x1f, 0x27, 0xf5, 0xdd, 0xdc, 0xc3, 0xb8, 0x57, 0xa0, 0xdb, 0x86, 0x98, - 0x13, 0xf6, 0x3d, 0x08, 0xff, 0x30, 0x27, 0xf6, 0x6a, 0x12, 0xe2, 0x13, 0xdd, 0x17, 0xe6, 0xfc, - 0xb6, 0x82, 0x9a, 0x8a, 0x07, 0xbc, 0xba, 0x2b, 0x78, 0x99, 0xe4, 0x2c, 0xc0, 0x50, 0x63, 0x37, - 0x77, 0x34, 0xaf, 0x22, 0x4b, 0xc3, 0xa1, 0x33, 0x42, 0x34, 0xc3, 0x32, 0xc4, 0xb7, 0x48, 0xb6, - 0xa5, 0xbd, 0x40, 0xaa, 0x98, 0xe2, 0x0d, 0xfd, 0xb5, 0xc8, 0x6a, 0xf4, 0xbe, 0x68, 0x7a, 0x97, - 0xed, 0x9d, 0x03, 0x5e, 0x64, 0xf3, 0x98, 0xf7, 0xab, 0x66, 0xb3, 0x59, 0x42, 0x77, 0x01, 0x30, - 0xb6, 0xa6, 0x4d, 0xc5, 0x1b, 0xc2, 0xc1, 0xa6, 0x6d, 0x79, 0x59, 0xc6, 0xf6, 0xb4, 0x48, 0x5d, - 0xea, 0x5f, 0xf6, 0xb6, 0x12, 0x52, 0x25, 0x8f, 0xa0, 0x19, 0x56, 0x99, 0xc3, 0x82, 0x80, 0xb3, - 0x1e, 0x8d, 0xbf, 0x40, 0x3e, 0xf1, 0xfc, 0xe1, 0x05, 0x2b, 0x2c, 0x09, 0x18, 0xc8, 0x33, 0x3c, - 0x2b, 0xfd, 0xa2, 0xc0, 0x42, 0x96, 0x36, 0xa5, 0x75, 0x1a, 0x9b, 0x9a, 0xbc, 0x4b, 0xff, 0x59, - 0x38, 0x3c, 0x96, 0x0f, 0x00, 0x7b, 0x42, 0x6f, 0xd4, 0x9f, 0xbc, 0xe9, 0xac, 0xa7, 0xf4, 0xdb, - 0xfb, 0xc1, 0xd6, 0x7e, 0x06, 0x16, 0x6c, 0xfd, 0xc6, 0xea, 0xf2, 0x4b, 0x79, 0xf3, 0xa9, 0x00, - 0xd1, 0x7d, 0x12, 0x2e, 0x5f, 0x0a, 0x3f, 0x01, 0x44, 0x83, 0xee, 0x25, 0x3a, 0xf6, 0x0a, 0x0b, - 0x0e, 0xd6, 0x0b, 0x43, 0x53, 0x06, 0x5c, 0xb9, 0x57, 0xd8, 0xb1, 0x0d, 0xfc, 0x85, 0x90, 0xcd, - 0xfb, 0xd9, 0x1c, 0x64, 0x56, 0x45, 0xc9, 0xa4, 0x25, 0x31, 0x0f, 0x53, 0x50, 0x15, 0x8b, 0x02, - 0xab, 0x58, 0x7d, 0xb7, 0x74, 0xc8, 0xbd, 0x6a, 0x85, 0xe5, 0x4b, 0x8b, 0xd8, 0xe5, 0x66, 0xa9, - 0x5c, 0x76, 0xd2, 0x2d, 0xd9, 0x21, 0x76, 0x0e, 0x5f, 0xd8, 0x2b, 0x83, 0xa4, 0x9f, 0x1d, 0xce, - 0xe6, 0xc0, 0x67, 0x9c, 0x56, 0x15, 0x7e, 0x41, 0x3d, 0x4d, 0x59, 0x3a, 0x7a, 0x92, 0xc6, 0xf8, - 0x79, 0xf8, 0x86, 0xcf, 0x1a, 0x9f, 0xb4, 0xe8, 0x27, 0x1e, 0x5f, 0x85, 0x43, 0xd6, 0xa3, 0xb2, - 0x17, 0x2f, 0x7d, 0x12, 0x7c, 0x83, 0x99, 0x40, 0xd6, 0xef, 0x08, 0xc7, 0x33, 0x5a, 0x16, 0xbe, - 0x7a, 0x25, 0x67, 0x84, 0xf2, 0xa1, 0x05, 0x88, 0x2d, 0x03, 0xdd, 0x88, 0x5e, 0xdc, 0xcc, 0xd0, - 0xee, 0x87, 0x9c, 0x6e, 0x6e, 0x1e, 0x7e, 0xf3, 0xea, 0x94, 0x8a, 0x0f, 0xcb, 0x9f, 0x71, 0xca, - 0xba, 0x79, 0x68, 0xb6, 0x09, 0x2d, 0x11, 0x55, 0x15, 0x84, 0x3d, 0x99, 0xd7, 0x8b, 0xd2, 0x85, - 0x5c, 0xa5, 0x65, 0x20, 0x05, 0x07, 0x59, 0x97, 0xd1, 0xcd, 0x87, 0x6f, 0xb4, 0x8c, 0xd5, 0x0a, - 0x40, 0xfa, 0xa4, 0x73, 0xf3, 0xf0, 0x76, 0x33, 0xba, 0xd8, 0x24, 0xd5, 0x66, 0xee, 0xbb, 0xec, - 0xc2, 0xba, 0xd9, 0xbd, 0xc5, 0xfa, 0x3c, 0x33, 0x62, 0x59, 0x77, 0xb3, 0xdd, 0xdc, 0x69, 0xee, - 0x6e, 0xba, 0x9b, 0x46, 0xd8, 0xea, 0x6e, 0x62, 0x2d, 0xed, 0xfb, 0x9b, 0x77, 0x77, 0x02, 0x19, - 0x48, 0xf8, 0xed, 0xa3, 0x16, 0x56, 0xb7, 0x7c, 0xd0, 0x5f, 0xcf, 0x27, 0x93, 0x22, 0x3f, 0x54, - 0x5e, 0xa2, 0x85, 0x8e, 0x07, 0x8e, 0x4f, 0xa0, 0xd0, 0x2f, 0xe2, 0xa8, 0x77, 0x9f, 0x79, 0x14, - 0xd6, 0x16, 0xbf, 0x62, 0x2c, 0x1c, 0x34, 0x82, 0xd8, 0x3d, 0x74, 0x49, 0x36, 0xe9, 0xe9, 0x3c, - 0xd5, 0xb2, 0x04, 0xf4, 0x90, 0xe8, 0xc1, 0x83, 0x62, 0x63, 0x50, 0x82, 0x5f, 0x97, 0x24, 0x88, - 0x44, 0xed, 0x26, 0xa4, 0x52, 0x7a, 0xca, 0xe1, 0xd2, 0xcc, 0x41, 0x92, 0xa5, 0x79, 0xfb, 0xbc, - 0x63, 0x9e, 0x46, 0xc3, 0x55, 0x83, 0x3d, 0xf1, 0xc3, 0x24, 0x8a, 0x15, 0x4a, 0x29, 0x9f, 0xe3, - 0xee, 0x64, 0xf6, 0x78, 0xd4, 0xc4, 0x08, 0x61, 0x46, 0x60, 0x4a, 0x26, 0xb1, 0xda, 0x25, 0x91, - 0x66, 0xa8, 0xb7, 0x5a, 0x45, 0xca, 0x10, 0xc3, 0x7e, 0x30, 0x2a, 0xc4, 0x48, 0xee, 0x0f, 0xcf, - 0x08, 0xc2, 0x66, 0xb7, 0xed, 0xe6, 0x2f, 0x00, 0x6e, 0xb3, 0xbb, 0xed, 0x6e, 0xd2, 0x17, 0xc2, - 0xce, 0x87, 0xdb, 0x4d, 0x53, 0x84, 0x07, 0xc1, 0x6f, 0xd8, 0xd3, 0x8b, 0xdf, 0xb1, 0x42, 0x4a, - 0xc5, 0xf7, 0xf6, 0xe9, 0x41, 0x54, 0xd2, 0x4d, 0xd2, 0x49, 0x77, 0x51, 0xdc, 0xbb, 0x3e, 0x63, - 0x04, 0x3f, 0xa6, 0x07, 0x1e, 0x67, 0x77, 0x93, 0xa8, 0x69, 0xf3, 0xee, 0x23, 0xfd, 0xdf, 0x67, - 0xc5, 0xee, 0xb9, 0x9f, 0x3e, 0x7d, 0x12, 0x1c, 0x92, 0x3e, 0xfa, 0xa4, 0x15, 0x1c, 0x2e, 0x47, - 0xf3, 0x37, 0x3e, 0xc9, 0x28, 0x2a, 0xa1, 0x3d, 0x1c, 0x2c, 0x90, 0x29, 0x5c, 0x31, 0x4d, 0xd0, - 0x0e, 0x32, 0x99, 0xfb, 0x9f, 0x46, 0x4f, 0x34, 0x2a, 0x8b, 0x9a, 0xdc, 0x4d, 0x06, 0xb5, 0xd9, - 0xdd, 0x6f, 0x7f, 0xde, 0x31, 0x26, 0xd9, 0x18, 0x0f, 0x74, 0x67, 0x57, 0x8d, 0x94, 0xe4, 0xb5, - 0xc2, 0x00, 0x9b, 0xea, 0x35, 0xc8, 0x45, 0x16, 0x80, 0x88, 0xe6, 0x2a, 0x98, 0x4e, 0xfd, 0x61, - 0x40, 0x5a, 0xfa, 0xe4, 0xa6, 0xa7, 0xb4, 0xb0, 0x60, 0x4a, 0xc0, 0xdf, 0x37, 0xf6, 0x21, 0x38, - 0x9f, 0x91, 0x6a, 0x05, 0x39, 0xeb, 0xb7, 0x22, 0xa7, 0x1f, 0x10, 0xc3, 0x4d, 0xfd, 0x1c, 0x41, - 0xbb, 0x70, 0xa1, 0xfc, 0xac, 0x28, 0x8a, 0x8d, 0x04, 0xb3, 0x0c, 0x2b, 0xc7, 0x3e, 0x24, 0xcb, - 0x0c, 0x31, 0x71, 0x34, 0x85, 0xe4, 0x75, 0xc1, 0x0b, 0x4a, 0x46, 0xcb, 0x8a, 0xc1, 0x08, 0x6c, - 0x94, 0xf6, 0xe2, 0x08, 0xe7, 0x93, 0xb3, 0x60, 0xc6, 0x71, 0xca, 0x0f, 0x1e, 0xbf, 0x00, 0x94, - 0xb7, 0x85, 0x71, 0xfe, 0xd6, 0x61, 0x7a, 0x24, 0x85, 0xa6, 0xf3, 0xea, 0x35, 0x2f, 0xe3, 0x94, - 0xb9, 0x9e, 0xe3, 0xac, 0xd1, 0x14, 0x56, 0xb5, 0xd0, 0xf7, 0x31, 0xf5, 0xfa, 0xb9, 0xe9, 0x87, - 0x22, 0x71, 0x6e, 0x11, 0x1d, 0xcc, 0xcd, 0x53, 0x4f, 0x9d, 0x60, 0xdf, 0x7a, 0xc5, 0xfa, 0x59, - 0xfd, 0xc1, 0x43, 0xa6, 0x99, 0x0d, 0x86, 0xe6, 0x25, 0xa4, 0x65, 0x02, 0x69, 0x1e, 0x61, 0x25, - 0x7b, 0xe9, 0xd3, 0x8e, 0xd2, 0x6e, 0xee, 0x11, 0x6f, 0x81, 0x5a, 0xc3, 0x8f, 0x8d, 0x76, 0x93, - 0x78, 0xcd, 0x8d, 0x77, 0xc5, 0x4f, 0x9d, 0xe6, 0xe3, 0xdf, 0x05, 0x57, 0xb4, 0xe9, 0x4c, 0x82, - 0x3e, 0x08, 0xf0, 0x6c, 0xe2, 0x93, 0x42, 0xb9, 0x1c, 0x77, 0xdf, 0x46, 0xc4, 0x0e, 0x40, 0x05, - 0x03, 0x0f, 0x6c, 0x58, 0x71, 0xf1, 0xae, 0x22, 0x39, 0x39, 0x26, 0x9d, 0x2e, 0x51, 0xff, 0xad, - 0x03, 0x17, 0xd2, 0x68, 0xa4, 0x20, 0x5a, 0x4e, 0x5c, 0x48, 0xa0, 0x97, 0xf4, 0x1a, 0x24, 0x34, - 0x83, 0x3c, 0x40, 0x0a, 0x54, 0x8e, 0xe4, 0x34, 0x0e, 0xa6, 0xc7, 0x32, 0xf0, 0x16, 0x7e, 0xbf, - 0xd7, 0xc3, 0x56, 0x35, 0xb3, 0xde, 0x62, 0xff, 0xe7, 0x79, 0x10, 0xfb, 0xc3, 0x87, 0x23, 0xdb, - 0x82, 0x4d, 0x58, 0xdc, 0x6e, 0x82, 0x01, 0xdb, 0x6d, 0x10, 0x53, 0x6e, 0x37, 0x77, 0x77, 0xdc, - 0x4d, 0xdd, 0xd4, 0xb1, 0x6e, 0xa9, 0x82, 0x22, 0x49, 0x26, 0x15, 0xc1, 0x8c, 0xfe, 0x82, 0x0e, - 0x6c, 0x29, 0x75, 0x95, 0x80, 0xf9, 0x4a, 0xaf, 0x91, 0x17, 0xe2, 0xca, 0xf4, 0x9f, 0x4b, 0xc4, - 0x24, 0x6e, 0xbe, 0x56, 0xe0, 0x32, 0x12, 0x36, 0xad, 0x23, 0x18, 0xbc, 0x98, 0xb3, 0x09, 0x5f, - 0x49, 0x32, 0x5b, 0xcb, 0x43, 0xd9, 0x26, 0x76, 0xcc, 0xcf, 0xbd, 0x79, 0x60, 0x2c, 0x90, 0x6b, - 0x56, 0xc8, 0xcb, 0x83, 0x74, 0xee, 0x4d, 0xd8, 0x8c, 0x97, 0xb1, 0x3e, 0x0c, 0xa9, 0x36, 0xf5, - 0x6e, 0x88, 0x49, 0x8e, 0x48, 0x3b, 0x91, 0x81, 0x09, 0x4a, 0xea, 0x9f, 0x36, 0xae, 0xbd, 0xc7, - 0x9f, 0x69, 0x5c, 0x58, 0x36, 0x44, 0xd6, 0xad, 0x60, 0x18, 0xaf, 0x10, 0x21, 0xa3, 0x78, 0x20, - 0x06, 0x20, 0xb3, 0xd3, 0xa9, 0xa3, 0x97, 0xc7, 0xca, 0x98, 0xad, 0x1f, 0x3c, 0x04, 0x6a, 0xec, - 0x33, 0x2e, 0x9e, 0xa3, 0x93, 0xf7, 0x5a, 0xf3, 0x2e, 0x59, 0x8b, 0xfe, 0x33, 0x2d, 0x22, 0x6f, - 0x15, 0xc9, 0x91, 0x6a, 0x8d, 0x03, 0xcc, 0x28, 0x81, 0x5d, 0x8e, 0xe6, 0xe7, 0x3c, 0x8c, 0x10, - 0x36, 0x93, 0x74, 0x55, 0x32, 0x9e, 0xc3, 0xff, 0xd7, 0x55, 0xe7, 0x5e, 0x40, 0x52, 0xef, 0x84, - 0xe3, 0xee, 0x78, 0x75, 0xb9, 0x30, 0xf6, 0xa5, 0x0f, 0x9f, 0x3b, 0xd3, 0xce, 0xd9, 0x9c, 0xc8, - 0xf0, 0xd1, 0xce, 0xce, 0x0e, 0x36, 0x28, 0x08, 0xdd, 0x67, 0x68, 0x82, 0x36, 0x9e, 0xf6, 0xf6, - 0xae, 0xcb, 0xba, 0xce, 0xe7, 0x5c, 0x77, 0xde, 0x55, 0x7f, 0xf5, 0xf8, 0x95, 0x38, 0xe4, 0xf5, - 0xbd, 0x09, 0x1f, 0x88, 0x2b, 0x89, 0x3b, 0x45, 0x04, 0x3c, 0x54, 0x00, 0xea, 0xaf, 0xab, 0x8e, - 0xbf, 0x79, 0xce, 0x68, 0x48, 0x78, 0xe8, 0xa2, 0xa6, 0x7c, 0x82, 0x3a, 0x47, 0x70, 0xcf, 0x00, - 0x97, 0x16, 0xe1, 0x5e, 0x9b, 0xb6, 0x0a, 0x33, 0x70, 0x92, 0xdc, 0x3f, 0xff, 0xb8, 0x83, 0x9f, - 0x97, 0x0f, 0xfb, 0xbb, 0xb9, 0x1f, 0xdf, 0x28, 0xb8, 0xec, 0x60, 0x05, 0x1c, 0x7d, 0xa7, 0xd8, - 0x3b, 0xc7, 0xa7, 0xe9, 0x4e, 0x44, 0xdf, 0x19, 0xcc, 0x63, 0xc4, 0xd6, 0xcb, 0x7c, 0x3f, 0x94, - 0x81, 0xb2, 0xba, 0x42, 0xf0, 0x58, 0x91, 0x23, 0xaa, 0x09, 0xfd, 0xc4, 0x12, 0xca, 0xf7, 0xda, - 0xa4, 0x7a, 0x7c, 0xde, 0x81, 0x1a, 0xc1, 0x9c, 0x5b, 0xbd, 0xaf, 0x68, 0x9e, 0x29, 0x21, 0xf6, - 0xf0, 0x9b, 0xea, 0x65, 0x94, 0xc2, 0x0d, 0x53, 0x74, 0xbf, 0x11, 0x11, 0x42, 0x32, 0xef, 0x37, - 0xb4, 0x44, 0x5e, 0xf3, 0x9b, 0xe7, 0x4d, 0xa1, 0x0f, 0x3e, 0x65, 0x6b, 0xde, 0x9c, 0x45, 0xa3, - 0x24, 0x3d, 0xd8, 0x6e, 0xb7, 0x1f, 0xce, 0x8c, 0x0d, 0x8a, 0xc4, 0x0c, 0x92, 0xa4, 0x9f, 0xa4, - 0xb6, 0xbc, 0x7f, 0x77, 0x72, 0x3f, 0x0c, 0x49, 0x6a, 0xd0, 0xe5, 0x18, 0x79, 0x0e, 0x93, 0x7c, - 0x43, 0x27, 0x10, 0x2d, 0x12, 0x04, 0x6f, 0x39, 0x30, 0x60, 0xa8, 0x5a, 0x34, 0x4f, 0x67, 0x73, - 0x1c, 0xde, 0xa8, 0x1c, 0x74, 0xbd, 0x69, 0x0b, 0xac, 0x0f, 0x67, 0xe8, 0xdc, 0xe4, 0x12, 0x91, - 0xe8, 0x53, 0x29, 0x03, 0x87, 0x89, 0xc4, 0xc4, 0x5a, 0x41, 0x32, 0x5b, 0xa1, 0x89, 0x78, 0x57, - 0x4c, 0xfe, 0xba, 0x30, 0xcc, 0x34, 0xef, 0x69, 0xa8, 0xd4, 0x80, 0x3f, 0x4f, 0x1a, 0x6c, 0x87, - 0x54, 0xb3, 0x09, 0x2d, 0x50, 0x05, 0xf3, 0xe2, 0xca, 0x81, 0xe1, 0xc4, 0xf1, 0xcc, 0x62, 0x6f, - 0x0a, 0xdc, 0xed, 0x6f, 0x1b, 0x1b, 0xfc, 0x1e, 0x6b, 0x5c, 0x81, 0xb7, 0x7d, 0x86, 0x0d, 0x2b, - 0x3b, 0x72, 0xf8, 0xcf, 0xb5, 0x45, 0xc9, 0xb9, 0x4a, 0x6b, 0x8d, 0xea, 0x78, 0xa2, 0xa5, 0x75, - 0x8d, 0x82, 0xa6, 0x7a, 0xc7, 0x1d, 0x26, 0x91, 0xe9, 0x09, 0x84, 0xa5, 0xc3, 0xa7, 0xc3, 0x20, - 0x3e, 0x68, 0x01, 0xf2, 0x93, 0x16, 0xbf, 0xe0, 0xf5, 0xab, 0x69, 0x56, 0x82, 0xdf, 0xa2, 0xf8, - 0xe1, 0x14, 0x2a, 0x27, 0x0d, 0xda, 0x9e, 0x88, 0x65, 0x4a, 0xa0, 0xe8, 0xa9, 0x95, 0x12, 0x23, - 0xff, 0xdc, 0xca, 0xb3, 0x46, 0x43, 0x34, 0x5b, 0x85, 0x85, 0x68, 0x96, 0xf1, 0xe7, 0x38, 0xa7, - 0x87, 0x4f, 0x1f, 0x55, 0xf4, 0xbb, 0x8d, 0x83, 0xb6, 0xcf, 0x64, 0x95, 0x29, 0x40, 0x77, 0x5e, - 0xe4, 0x09, 0x57, 0xf5, 0x6f, 0x52, 0x52, 0xe3, 0xae, 0xe2, 0x80, 0x04, 0x0f, 0x12, 0x39, 0x58, - 0x42, 0x54, 0x6c, 0xc5, 0xa7, 0x7d, 0xd7, 0x3f, 0x9f, 0x22, 0x96, 0xe0, 0x93, 0x06, 0x7a, 0x49, - 0x5c, 0x95, 0xcf, 0x29, 0xdd, 0x4d, 0xf1, 0x96, 0x60, 0xbb, 0x19, 0x37, 0x47, 0xbf, 0x7e, 0x8f, - 0xc1, 0x2f, 0xd3, 0x3b, 0x8c, 0x71, 0x20, 0x49, 0x35, 0xd1, 0x36, 0x31, 0x24, 0xfe, 0xd5, 0xd2, - 0x2f, 0xc6, 0xfe, 0xe5, 0x20, 0x23, 0xe0, 0x60, 0x82, 0xc3, 0xda, 0x50, 0x17, 0x16, 0xd8, 0x4d, - 0x22, 0x40, 0x53, 0x80, 0x77, 0x6b, 0x1c, 0x8b, 0xb8, 0x6a, 0x9a, 0x06, 0x53, 0x1f, 0x58, 0xf3, - 0xfd, 0x56, 0x4a, 0x3b, 0xd8, 0x44, 0xf0, 0xd9, 0x54, 0xdf, 0x1f, 0xb1, 0x4e, 0xc1, 0x70, 0xa0, - 0x55, 0x17, 0x0f, 0xe9, 0x95, 0xd7, 0x8f, 0x2e, 0xfd, 0xe6, 0x83, 0xf1, 0xaa, 0x57, 0xc1, 0x34, - 0x4c, 0x5b, 0xd3, 0xe9, 0xa0, 0x3f, 0xb9, 0x68, 0xcf, 0x3a, 0xb4, 0x38, 0xb8, 0xc7, 0x24, 0x03, - 0x90, 0x3c, 0xf3, 0xf1, 0xf7, 0x42, 0x6c, 0x6b, 0x18, 0x5d, 0x85, 0x30, 0x23, 0x3d, 0x45, 0x6b, - 0x07, 0xb4, 0xf3, 0x87, 0xac, 0x4b, 0xac, 0xdc, 0xf2, 0xd3, 0xd8, 0xf7, 0xa6, 0xb4, 0xeb, 0x67, - 0x60, 0xc0, 0xf0, 0x49, 0x31, 0xf1, 0xd2, 0xd4, 0x1b, 0x8c, 0x41, 0x5b, 0xca, 0x80, 0x5d, 0x89, - 0x8b, 0x1a, 0xda, 0x54, 0x60, 0x7c, 0xf5, 0xdf, 0x6b, 0x74, 0xfe, 0x84, 0x76, 0xde, 0x07, 0x8c, - 0xed, 0x25, 0x57, 0x28, 0x8c, 0x8d, 0x37, 0xed, 0x25, 0x44, 0xd3, 0xc4, 0x49, 0xd7, 0x3c, 0xc1, - 0x52, 0x1b, 0xfb, 0x21, 0xd3, 0x98, 0x0a, 0x12, 0x6d, 0xce, 0x9e, 0xdc, 0xa8, 0xbe, 0x0f, 0x08, - 0x52, 0xcd, 0x1f, 0xde, 0x93, 0x30, 0x3e, 0x87, 0x3a, 0xf6, 0x92, 0xd4, 0xaf, 0x86, 0x4c, 0xd4, - 0x7f, 0xae, 0xfd, 0x6d, 0x48, 0x03, 0x5b, 0xcb, 0x0e, 0x31, 0x7a, 0xe4, 0x90, 0x0f, 0x43, 0x7f, - 0xa2, 0xa4, 0xb0, 0xaa, 0xed, 0xb6, 0x77, 0x55, 0x30, 0x52, 0x24, 0x91, 0xea, 0xf9, 0xa9, 0x7f, - 0x32, 0x03, 0x94, 0xb7, 0xc6, 0x06, 0xcc, 0xb6, 0x5f, 0xf7, 0xf7, 0x31, 0x75, 0xc8, 0x70, 0x49, - 0x26, 0xd7, 0x8d, 0x81, 0x8a, 0xdf, 0xae, 0x97, 0xc8, 0x87, 0x36, 0x02, 0x74, 0x55, 0xf0, 0xac, - 0x8b, 0xfe, 0x8c, 0x30, 0xd1, 0x69, 0x20, 0x0f, 0xcd, 0xa7, 0x48, 0xda, 0xc6, 0x0a, 0xfe, 0x6f, - 0x60, 0xfe, 0xce, 0x46, 0x7e, 0x1e, 0xcd, 0x3e, 0x65, 0xd4, 0xdf, 0xbc, 0x7b, 0xaf, 0xd8, 0x55, - 0x96, 0x7a, 0x88, 0xa1, 0x27, 0xb4, 0x08, 0xc3, 0x61, 0xf2, 0xc9, 0x43, 0xa6, 0x6e, 0xe4, 0xc3, - 0xed, 0x34, 0xdb, 0xf9, 0xfe, 0xf7, 0xbb, 0xcc, 0xf9, 0x3d, 0x4c, 0x41, 0xb6, 0xf5, 0x87, 0x34, - 0x86, 0xc2, 0xf0, 0xff, 0x0d, 0xac, 0x41, 0x0b, 0x07, 0xff, 0x05, 0xc3, 0xcf, 0x3d, 0x0f, 0xfe, - 0x83, 0x9f, 0x17, 0xbd, 0x69, 0x4c, 0xe8, 0xab, 0xf1, 0x3d, 0x79, 0xc9, 0xf2, 0x26, 0x5b, 0xa8, - 0x13, 0x44, 0xe0, 0xf3, 0xce, 0x4b, 0xea, 0x86, 0x43, 0xdb, 0x30, 0x9a, 0x6c, 0xcc, 0xe2, 0x08, - 0x9f, 0xc0, 0x6a, 0x73, 0x65, 0xab, 0xa9, 0x7e, 0x60, 0x8d, 0x5b, 0x79, 0xb1, 0x4f, 0x1c, 0xd8, - 0x1b, 0xf2, 0xb9, 0xb9, 0x70, 0x73, 0x0d, 0x40, 0x11, 0x0d, 0x8f, 0x11, 0x19, 0x4d, 0x38, 0x53, - 0x03, 0xda, 0xba, 0xfc, 0xa1, 0x1c, 0x47, 0x8a, 0xd7, 0x03, 0xf6, 0xf4, 0x0b, 0x5f, 0xf9, 0xa3, - 0x11, 0x9a, 0x8f, 0x64, 0xc7, 0x0f, 0x49, 0x81, 0xd1, 0xe2, 0x14, 0x04, 0x06, 0x12, 0x89, 0xcd, - 0x61, 0x13, 0x9a, 0x47, 0x09, 0x73, 0xc4, 0xd2, 0xb4, 0xdd, 0x24, 0xe8, 0xd7, 0x78, 0xc7, 0x78, - 0x64, 0xac, 0x8c, 0x60, 0x29, 0xa4, 0x5c, 0xb4, 0xc3, 0x58, 0xe0, 0x01, 0x2a, 0x74, 0xfe, 0xde, - 0x0c, 0x52, 0x58, 0xbb, 0xe5, 0x1a, 0x64, 0xf9, 0xd0, 0x8b, 0x77, 0x90, 0x71, 0x04, 0x5a, 0xc0, - 0xb0, 0x89, 0x36, 0xdc, 0x34, 0xf5, 0x92, 0x00, 0xc4, 0xa1, 0x6b, 0x89, 0x17, 0x09, 0x3b, 0x4c, - 0x2b, 0x2b, 0x5b, 0x9a, 0x29, 0x2b, 0x11, 0x48, 0xd8, 0x4d, 0x37, 0xa1, 0xd7, 0x0d, 0xfc, 0x71, - 0x34, 0x19, 0xfa, 0xf1, 0xc1, 0x66, 0xd6, 0x33, 0xbe, 0xa9, 0x23, 0xd3, 0xf2, 0x45, 0x2d, 0xaf, - 0xdf, 0x13, 0xae, 0xac, 0xb1, 0x22, 0x60, 0x9e, 0x4b, 0xd2, 0x9a, 0x63, 0xd5, 0x71, 0xb7, 0xdd, - 0x1d, 0x56, 0x47, 0xbc, 0x38, 0xf6, 0x6e, 0x92, 0x0c, 0xea, 0x4a, 0x0f, 0xa5, 0xdc, 0x69, 0xc8, - 0x4f, 0x8f, 0xbe, 0xe3, 0x6e, 0xd6, 0xc4, 0x87, 0x30, 0x77, 0x9d, 0xc9, 0x66, 0x8b, 0x7e, 0xcc, - 0x2a, 0xe6, 0xea, 0x1e, 0xa1, 0x7c, 0x76, 0x32, 0xd1, 0xcd, 0xc3, 0x17, 0x68, 0x92, 0x64, 0x89, - 0x8c, 0x28, 0x49, 0x1e, 0x98, 0x44, 0x57, 0x20, 0xe1, 0x08, 0x2e, 0x9e, 0x41, 0x9a, 0x28, 0x7f, - 0x18, 0x90, 0x2a, 0xd5, 0x54, 0x6f, 0xe6, 0x93, 0x34, 0x10, 0xeb, 0x88, 0x94, 0xa7, 0x4f, 0x3c, - 0x93, 0x22, 0x97, 0xc2, 0xc0, 0x94, 0x9b, 0x4f, 0x48, 0xc4, 0x9c, 0xfd, 0x66, 0xa2, 0x92, 0xb8, - 0xcc, 0x8c, 0xb0, 0xf2, 0xa9, 0x7b, 0x41, 0x9c, 0xfd, 0x3c, 0x8a, 0xd9, 0x9f, 0x81, 0x45, 0x87, - 0x65, 0xf8, 0xd8, 0xbb, 0x37, 0x3e, 0xf6, 0x97, 0xe0, 0x83, 0x30, 0x21, 0x27, 0xf5, 0xf0, 0xa2, - 0xc4, 0x9c, 0x02, 0x1d, 0x2c, 0x50, 0xb2, 0x24, 0x4d, 0x93, 0x7a, 0xf8, 0x67, 0x78, 0xd9, 0xd2, - 0xf8, 0x13, 0x53, 0x34, 0xd1, 0xc2, 0x58, 0x34, 0x3b, 0x03, 0x09, 0xa9, 0x03, 0x35, 0xf5, 0x42, - 0x62, 0x3a, 0x5a, 0x24, 0xeb, 0xa1, 0xd2, 0x9f, 0x86, 0xfe, 0x79, 0x6f, 0x7d, 0x45, 0xb8, 0x43, - 0x19, 0x49, 0x2e, 0x43, 0xa9, 0xb5, 0x96, 0x06, 0x19, 0x26, 0x0a, 0x1e, 0x75, 0xbf, 0x01, 0xe9, - 0x12, 0x88, 0x9f, 0x63, 0x5d, 0xcc, 0x87, 0x62, 0x38, 0xd7, 0x5e, 0xb5, 0x2d, 0x62, 0xa4, 0x62, - 0x61, 0xb2, 0x16, 0x77, 0xbe, 0x70, 0x4d, 0xa0, 0x7d, 0x35, 0xd9, 0x4b, 0x1c, 0xb9, 0x45, 0xef, - 0x3f, 0xa3, 0x81, 0xa3, 0xef, 0x40, 0xec, 0xd2, 0xd6, 0xb3, 0xc9, 0xc4, 0x26, 0xf9, 0xf5, 0x10, - 0xc4, 0xf9, 0x57, 0x40, 0x54, 0x3a, 0xfe, 0x32, 0x10, 0x0e, 0x67, 0x2b, 0xc3, 0xd0, 0x68, 0x14, - 0xc3, 0x94, 0xbc, 0xd2, 0x88, 0x2b, 0x46, 0xb3, 0xc0, 0xc5, 0x34, 0x03, 0x5c, 0xe4, 0x0f, 0x10, - 0xa9, 0x37, 0x99, 0xf7, 0xcf, 0xd2, 0x83, 0xcd, 0xe6, 0x4f, 0x49, 0x14, 0x56, 0x3b, 0x2a, 0xa2, - 0xc3, 0xcc, 0xb6, 0x0f, 0xb4, 0x21, 0x8c, 0x7a, 0x9c, 0x8e, 0x03, 0xf0, 0x87, 0x27, 0x2d, 0xee, - 0xdd, 0x61, 0x91, 0x1f, 0x17, 0xd1, 0x2a, 0x81, 0xe8, 0x45, 0x4e, 0x94, 0x98, 0xb7, 0xc6, 0xad, - 0x6e, 0x46, 0x5b, 0x49, 0xb1, 0x00, 0xbd, 0x01, 0x7c, 0xfa, 0xb3, 0xc6, 0x2b, 0xce, 0xd2, 0x14, - 0xef, 0xb7, 0x33, 0x5a, 0x0e, 0xb4, 0x0b, 0xfd, 0xcd, 0x33, 0xb4, 0x1b, 0x2a, 0x28, 0x7d, 0x84, - 0xa3, 0x91, 0xfe, 0x24, 0x1f, 0x0f, 0x49, 0x67, 0xe9, 0x1a, 0x17, 0x76, 0x94, 0x80, 0xce, 0x79, - 0xf8, 0xa7, 0x29, 0xb2, 0x42, 0xf7, 0x2c, 0x3f, 0x76, 0xab, 0x06, 0xb4, 0x5f, 0xbb, 0x06, 0x9e, - 0x0b, 0x55, 0x88, 0x52, 0xad, 0xcf, 0xac, 0x27, 0xaf, 0x01, 0x09, 0x97, 0x9b, 0x42, 0x2f, 0xd8, - 0x3b, 0x67, 0x75, 0x9d, 0x0c, 0x0f, 0x85, 0x8a, 0xc6, 0x37, 0xd7, 0x1a, 0x33, 0xfc, 0xe0, 0x97, - 0x80, 0xb2, 0x7f, 0x96, 0x30, 0x65, 0x9c, 0x5f, 0xb3, 0x36, 0xd7, 0x3a, 0xba, 0xa2, 0x16, 0x5e, - 0x95, 0xdd, 0x51, 0xe9, 0xfd, 0x49, 0xe6, 0x88, 0x5a, 0xb4, 0xaf, 0x15, 0xd7, 0xca, 0x7a, 0xaf, - 0xd1, 0x62, 0x33, 0x24, 0x78, 0x96, 0x5a, 0x89, 0x66, 0xd2, 0x08, 0x8c, 0x5b, 0x0f, 0x83, 0x6c, - 0xc1, 0xa1, 0xf9, 0x4c, 0xc6, 0x39, 0x59, 0xd6, 0xd8, 0xad, 0x94, 0x5f, 0x96, 0x96, 0x76, 0xb6, - 0x29, 0x2e, 0xba, 0x22, 0x9b, 0x39, 0xe4, 0x74, 0x0b, 0x85, 0xd9, 0x40, 0x22, 0xf9, 0x4d, 0xed, - 0xba, 0x5e, 0x12, 0x42, 0x4c, 0x45, 0x29, 0xb2, 0xa6, 0x0e, 0x2a, 0x2d, 0xd1, 0x5c, 0x73, 0xd2, - 0x13, 0x45, 0x56, 0x7a, 0x5b, 0xd4, 0x66, 0xdf, 0xca, 0xc9, 0x28, 0xab, 0xa9, 0x06, 0x42, 0x38, - 0x87, 0x1c, 0x45, 0x4c, 0x3b, 0xd3, 0x5f, 0xdf, 0x44, 0xc3, 0x80, 0x76, 0xd6, 0x5c, 0xeb, 0x5d, - 0x54, 0x60, 0x35, 0x70, 0x08, 0xc3, 0xf9, 0x8a, 0x60, 0x03, 0xcd, 0xa1, 0x91, 0x91, 0x19, 0x45, - 0x46, 0x4c, 0x5e, 0xa4, 0x34, 0xce, 0xeb, 0x9e, 0x77, 0x5a, 0x3f, 0xea, 0xd1, 0xbe, 0x8d, 0x72, - 0x6a, 0x41, 0x22, 0x2f, 0x24, 0x3b, 0x80, 0xad, 0xaa, 0x5f, 0x2c, 0xbf, 0xb0, 0x6c, 0x9b, 0x0b, - 0x1c, 0x47, 0xb4, 0xf3, 0xc3, 0x42, 0x64, 0x1a, 0x6c, 0x82, 0x76, 0x54, 0xd6, 0x84, 0x84, 0xc8, - 0x84, 0x34, 0x23, 0x3f, 0x96, 0x23, 0x7f, 0xda, 0x0a, 0x6f, 0xef, 0x7a, 0xf2, 0x7e, 0x12, 0x0d, - 0xbc, 0xc9, 0xe2, 0xeb, 0x42, 0x24, 0x83, 0xbc, 0xc7, 0x6b, 0xed, 0x22, 0x0a, 0x34, 0xd3, 0x5b, - 0xc7, 0xe9, 0x21, 0xf8, 0xa1, 0xa5, 0x1c, 0x71, 0x18, 0x75, 0xd4, 0xaf, 0xca, 0xa1, 0x9d, 0x6f, - 0x7e, 0x11, 0x39, 0xea, 0xef, 0xff, 0xf2, 0x3f, 0x45, 0xfa, 0x2e, 0x79, 0xbd, 0xe2, 0x58, 0x14, - 0xc6, 0xca, 0x99, 0x1f, 0x37, 0x22, 0xb6, 0x2b, 0xc0, 0xcc, 0x26, 0xa2, 0x23, 0x04, 0x6d, 0x6d, - 0xd5, 0xec, 0x43, 0x02, 0x7f, 0xc3, 0xb0, 0xea, 0xb8, 0xde, 0x2a, 0x4c, 0x52, 0x2d, 0xa7, 0x0f, - 0xbf, 0x96, 0x33, 0xa5, 0x03, 0x12, 0xce, 0xaf, 0xe0, 0xdb, 0x5f, 0xc3, 0xad, 0x5c, 0x52, 0xe2, - 0xf4, 0xdd, 0xbb, 0xd7, 0xa7, 0x47, 0xef, 0x4f, 0xd0, 0xe5, 0x8d, 0x0d, 0x47, 0xee, 0xd3, 0x6a, - 0x5e, 0xf9, 0xfd, 0xf7, 0xb4, 0x43, 0x38, 0x5d, 0xe7, 0xdb, 0xd3, 0xd3, 0xf7, 0x1a, 0x15, 0x0a, - 0x9b, 0x46, 0x53, 0x3b, 0xa5, 0x1b, 0x4f, 0x96, 0xc4, 0x48, 0xf7, 0x4d, 0xe3, 0x6b, 0xdd, 0x55, - 0x8f, 0xda, 0x8e, 0x9b, 0xc3, 0x82, 0xcf, 0xff, 0x00, 0xd1, 0x6c, 0xaf, 0xe1, 0x5a, 0x43, 0x20, - 0x5f, 0xbc, 0xff, 0x5e, 0x65, 0x2f, 0xc5, 0xe1, 0x46, 0xd5, 0xda, 0x8d, 0xed, 0x7a, 0x53, 0x7d, - 0x4b, 0xb2, 0x00, 0x35, 0x44, 0x12, 0x0b, 0x9c, 0xb7, 0x69, 0xc0, 0x90, 0xb6, 0x71, 0x54, 0xaa, - 0x68, 0xc1, 0xc9, 0x4b, 0x22, 0x36, 0xbb, 0xad, 0x8e, 0xdd, 0x14, 0x01, 0xed, 0x47, 0x89, 0x4f, - 0x6d, 0xbc, 0x62, 0x07, 0x27, 0x35, 0x24, 0x36, 0x1f, 0xc0, 0xed, 0x69, 0x12, 0x9d, 0x9f, 0xb3, - 0xfe, 0x41, 0xb2, 0x4e, 0x3a, 0x24, 0xa5, 0xa4, 0xa9, 0xbe, 0x4f, 0xfc, 0xd1, 0x7c, 0xc2, 0x42, - 0xd5, 0xd0, 0xef, 0xcf, 0xf9, 0xbb, 0x05, 0x98, 0xb8, 0xa5, 0x80, 0xe6, 0x63, 0xe3, 0x26, 0xbb, - 0x40, 0x12, 0x60, 0xed, 0xba, 0x39, 0x26, 0x66, 0x71, 0x05, 0xc5, 0x89, 0xdf, 0x37, 0x55, 0xa3, - 0xa3, 0xa5, 0x25, 0x52, 0x40, 0x53, 0x12, 0xa5, 0x9a, 0xea, 0x1d, 0x42, 0x5e, 0x04, 0xff, 0xb0, - 0xaa, 0x4c, 0x21, 0xbe, 0xce, 0x70, 0x47, 0x15, 0x03, 0x80, 0x81, 0x94, 0xd0, 0x36, 0xa1, 0xbe, - 0xd9, 0xad, 0x80, 0x55, 0xe4, 0x8d, 0xe4, 0x9e, 0xa0, 0xf0, 0xe8, 0x60, 0x77, 0x51, 0xab, 0x25, - 0x55, 0x1b, 0x03, 0x5b, 0xa4, 0x36, 0x34, 0xd5, 0xfb, 0x68, 0x36, 0x47, 0x18, 0xe6, 0x50, 0x0d, - 0x6f, 0x48, 0xb1, 0x40, 0xba, 0x2b, 0x6a, 0xbd, 0x40, 0x4c, 0xec, 0xcd, 0xc9, 0x6d, 0x91, 0x50, - 0xd0, 0x94, 0xf6, 0x9e, 0x07, 0x21, 0xb5, 0xf6, 0x1e, 0xe9, 0x74, 0x09, 0x1e, 0x14, 0x3e, 0xe3, - 0x37, 0x05, 0x22, 0xeb, 0x07, 0xa1, 0x47, 0xf2, 0x50, 0xad, 0x49, 0x3f, 0xa8, 0x8d, 0x57, 0x58, - 0x5f, 0xd4, 0xf6, 0x3c, 0xc1, 0x6c, 0x04, 0x13, 0x04, 0x8b, 0x9b, 0xf0, 0x1f, 0x06, 0x2c, 0x90, - 0x71, 0x04, 0xf5, 0xc6, 0x03, 0xaa, 0xe8, 0xdf, 0x60, 0x3a, 0x9f, 0xea, 0x11, 0xf3, 0xa1, 0xb6, - 0x9a, 0x04, 0xd3, 0x80, 0x90, 0xd3, 0xd6, 0x70, 0xd0, 0x64, 0x16, 0x41, 0x74, 0xec, 0x0f, 0xe7, - 0xa4, 0xa6, 0xaa, 0x30, 0x0a, 0xf8, 0x62, 0x26, 0x35, 0xf4, 0xe2, 0x0b, 0x95, 0x0c, 0xfc, 0x90, - 0x3b, 0x2e, 0xfd, 0x16, 0x4f, 0x01, 0x02, 0xfd, 0x7d, 0x62, 0x35, 0x91, 0xb9, 0x15, 0xc0, 0x2e, - 0x8d, 0xaa, 0x84, 0x82, 0x38, 0xd2, 0x16, 0x0d, 0x69, 0x0e, 0x28, 0x43, 0x90, 0xe3, 0x40, 0xd5, - 0xe0, 0x5d, 0xc9, 0xbe, 0x00, 0x84, 0x55, 0x1c, 0x29, 0x8a, 0xef, 0x8e, 0x82, 0x30, 0x24, 0x72, - 0xb5, 0xb8, 0x05, 0xb2, 0x0e, 0x4b, 0x34, 0x18, 0x44, 0x43, 0xbd, 0xda, 0x76, 0xf0, 0x9f, 0xf2, - 0x52, 0xb5, 0xdf, 0x46, 0x55, 0xd0, 0x0e, 0x3a, 0x2c, 0x25, 0x71, 0x6f, 0x5a, 0xe2, 0xd2, 0xa4, - 0xd1, 0x28, 0x00, 0x4e, 0xd4, 0x62, 0x38, 0xd8, 0xc0, 0xb1, 0x86, 0x54, 0x70, 0x2c, 0x1f, 0x3e, - 0x43, 0x9a, 0xdc, 0x34, 0xd5, 0x73, 0x6d, 0x73, 0xe2, 0xbb, 0x17, 0xf5, 0x49, 0x78, 0xa1, 0x46, - 0x36, 0x55, 0xde, 0x55, 0xff, 0x8d, 0x90, 0xc5, 0x5f, 0xe0, 0x3c, 0xa0, 0xb4, 0xf3, 0x80, 0x26, - 0x07, 0xa6, 0x04, 0x6b, 0x74, 0xae, 0x1a, 0xa4, 0x67, 0x22, 0xef, 0xd3, 0x6b, 0x4e, 0xdf, 0xb8, - 0xe8, 0x65, 0x60, 0xc3, 0x7e, 0x81, 0x55, 0xfe, 0xa2, 0x5c, 0x02, 0x38, 0xfc, 0x27, 0x7f, 0x72, - 0x49, 0x7f, 0xd8, 0x70, 0x4b, 0x05, 0xd9, 0x53, 0xf8, 0x20, 0x83, 0xde, 0x54, 0xb0, 0x91, 0x35, - 0x3a, 0xb0, 0x93, 0x59, 0xcb, 0x06, 0xde, 0x06, 0x02, 0x1e, 0x96, 0x87, 0xe6, 0x34, 0x88, 0xe3, - 0x28, 0xa6, 0x16, 0xbe, 0x9e, 0x04, 0x33, 0xb1, 0x46, 0xa8, 0x31, 0x29, 0x0c, 0xbf, 0x20, 0x12, - 0x89, 0x11, 0x71, 0x5c, 0xe2, 0x23, 0x56, 0xe5, 0x11, 0xd5, 0x29, 0x56, 0x35, 0xb9, 0xdc, 0xd6, - 0x54, 0x94, 0x68, 0x54, 0xaa, 0x7a, 0xcc, 0x3f, 0x74, 0xe5, 0x5a, 0x5b, 0x41, 0x3d, 0x7e, 0xd4, - 0x26, 0x92, 0x3b, 0x27, 0x59, 0x0d, 0x73, 0x5f, 0x09, 0x44, 0xbb, 0xb0, 0xc6, 0x03, 0x8d, 0xf7, - 0x63, 0xc0, 0xd0, 0x6a, 0x45, 0x57, 0x0d, 0xfa, 0xf1, 0x01, 0xf3, 0x4e, 0x2f, 0x4c, 0x8d, 0xe9, - 0xd0, 0x55, 0x97, 0xf4, 0x96, 0x6f, 0x52, 0x21, 0xb6, 0xe3, 0x2a, 0x0f, 0x8f, 0xde, 0xd0, 0x9b, - 0xf1, 0x6c, 0xe6, 0xef, 0x7f, 0xc6, 0xfb, 0x9f, 0xb5, 0x01, 0xe8, 0x87, 0xe7, 0xc7, 0x76, 0x73, - 0x44, 0x51, 0xd4, 0xd6, 0x29, 0xa9, 0x41, 0xbe, 0x36, 0xa0, 0x30, 0xcb, 0xd7, 0x76, 0x39, 0xe2, - 0xbb, 0x13, 0x52, 0x82, 0x68, 0x36, 0x59, 0x25, 0x14, 0xff, 0x71, 0xa1, 0xfe, 0xa6, 0x42, 0xb4, - 0x50, 0x00, 0x2e, 0x47, 0xad, 0xd9, 0x20, 0xa1, 0x78, 0xa1, 0xff, 0x19, 0x1f, 0xc1, 0x39, 0xc4, - 0x5f, 0xae, 0xbf, 0xd5, 0xe4, 0xdc, 0x79, 0xbc, 0xdd, 0xbe, 0xee, 0xb4, 0x1f, 0xb5, 0x09, 0x11, - 0xcf, 0x58, 0x81, 0x48, 0x54, 0x42, 0xb3, 0x93, 0x0e, 0xe6, 0x69, 0xd2, 0x55, 0x5f, 0x6d, 0xb7, - 0x67, 0xae, 0xc2, 0x77, 0xfa, 0xb3, 0xfb, 0xe6, 0xfd, 0x6a, 0x6c, 0x69, 0x4c, 0xe4, 0x43, 0x58, - 0x6e, 0x55, 0xb5, 0xf8, 0x7c, 0x9f, 0x13, 0xff, 0x29, 0x8d, 0x12, 0x57, 0x58, 0x7c, 0x9f, 0xb4, - 0x7a, 0x76, 0x34, 0x5f, 0x3e, 0xb2, 0xf3, 0x68, 0x76, 0x22, 0x83, 0x5b, 0x62, 0xc6, 0xd4, 0x8b, - 0x7e, 0x32, 0x61, 0x53, 0x99, 0x47, 0x23, 0xbe, 0x84, 0x72, 0x27, 0x4b, 0x95, 0xd6, 0xb9, 0xb1, - 0x0b, 0xd6, 0x97, 0xb7, 0xf1, 0xf3, 0xec, 0xa5, 0x3f, 0x49, 0x3d, 0x6a, 0xe3, 0xa8, 0xf5, 0x5e, - 0xd7, 0xfc, 0x0e, 0xfc, 0x8a, 0x5e, 0xaa, 0x5a, 0xa3, 0xb3, 0x8d, 0xa9, 0xd8, 0xea, 0x60, 0xdf, - 0x7a, 0xeb, 0x9f, 0x73, 0x42, 0x04, 0x6a, 0xf2, 0xe4, 0xcd, 0xb3, 0xd7, 0xaf, 0x5f, 0x1d, 0xab, - 0xa3, 0x86, 0x9e, 0xc3, 0x5a, 0xec, 0x05, 0x38, 0x00, 0xd1, 0x2f, 0x00, 0xc2, 0xe4, 0x4f, 0x00, - 0x80, 0xf7, 0xf5, 0x9e, 0x12, 0x3c, 0x25, 0x6a, 0xae, 0x35, 0x34, 0x9a, 0xed, 0xb7, 0x12, 0xb8, - 0xea, 0xc7, 0x1c, 0x25, 0xa6, 0x5e, 0xfc, 0xb0, 0xdf, 0x69, 0xaf, 0x98, 0x68, 0x30, 0xc9, 0xd3, - 0x31, 0x64, 0xd3, 0x68, 0x32, 0xc4, 0x0e, 0x82, 0x17, 0x0d, 0xbd, 0xfd, 0xc0, 0x0e, 0x9a, 0x92, - 0x9a, 0x7d, 0xce, 0xa6, 0x3c, 0x5d, 0x08, 0xa4, 0xc0, 0x8c, 0x5e, 0x11, 0x09, 0xb4, 0x05, 0x5d, - 0xd4, 0x20, 0x4d, 0xf8, 0x1e, 0x7e, 0x76, 0x9a, 0x7b, 0xd7, 0x88, 0xf3, 0xbe, 0xf0, 0x57, 0x4f, - 0x3b, 0xb7, 0x0c, 0x27, 0x5a, 0xec, 0x97, 0x60, 0x24, 0x21, 0x4d, 0xc0, 0x9c, 0x07, 0xc7, 0x9f, - 0x1a, 0x0c, 0xc3, 0xd0, 0xb3, 0x71, 0x7f, 0x55, 0x92, 0x49, 0x40, 0x69, 0xbf, 0x3e, 0xb0, 0x4b, - 0xea, 0xa4, 0xc5, 0x46, 0xb6, 0xd7, 0x2c, 0x4d, 0x3f, 0x21, 0x51, 0x0b, 0xf1, 0x53, 0xd8, 0xeb, - 0xc1, 0x62, 0x1a, 0xf9, 0x2b, 0x24, 0x4b, 0x83, 0x43, 0x7b, 0x8d, 0x67, 0xbe, 0xa1, 0x05, 0x79, - 0xb5, 0xa5, 0x4e, 0x7e, 0x78, 0xd1, 0x38, 0x25, 0x70, 0xa3, 0xf7, 0x31, 0x7b, 0x42, 0x13, 0xe9, - 0xd0, 0xdc, 0xbd, 0x3b, 0x79, 0xd9, 0x48, 0xbc, 0x91, 0xcf, 0x5b, 0x3e, 0x9c, 0xca, 0x07, 0x73, - 0xbf, 0xa5, 0x09, 0xb2, 0x95, 0xcc, 0x62, 0x82, 0xd2, 0x8a, 0x39, 0x2f, 0x65, 0x8b, 0x04, 0xb9, - 0x39, 0xa7, 0x32, 0xc1, 0xc9, 0x3f, 0x31, 0x03, 0xa9, 0x3c, 0x0f, 0x51, 0x5d, 0xd5, 0xb4, 0x3f, - 0x30, 0x4e, 0xf7, 0xc0, 0x5e, 0x88, 0x14, 0xa7, 0x08, 0xa1, 0xe7, 0xdc, 0x92, 0x54, 0x0e, 0x76, - 0x56, 0xaf, 0xde, 0x25, 0xa4, 0x13, 0xfb, 0x22, 0x88, 0x34, 0x33, 0xb4, 0xad, 0x5f, 0xf2, 0x3e, - 0x58, 0xe8, 0x59, 0x53, 0x49, 0x27, 0x0e, 0xda, 0xcd, 0xed, 0xbd, 0x04, 0x88, 0x41, 0x06, 0x37, - 0x5a, 0xe6, 0xd2, 0x99, 0x03, 0x1e, 0xd6, 0x56, 0xbb, 0x29, 0xdf, 0xb0, 0x7f, 0xf9, 0xea, 0xf8, - 0xd5, 0xb3, 0x97, 0x6f, 0x5e, 0xb1, 0x30, 0x93, 0xb9, 0xb4, 0xb3, 0xa4, 0x5d, 0xc0, 0x63, 0x3f, - 0x8a, 0x52, 0xd9, 0xa9, 0x35, 0x1e, 0x7f, 0x89, 0xa2, 0xe9, 0x3f, 0x13, 0x0a, 0x5f, 0x06, 0xe7, - 0x01, 0x4e, 0x71, 0xf1, 0xac, 0x68, 0xe7, 0x9c, 0xe9, 0x8c, 0xf7, 0xea, 0x9f, 0x5d, 0x26, 0x0c, - 0xc4, 0xc6, 0xb1, 0xe1, 0x17, 0xc2, 0x07, 0x1b, 0x6c, 0x96, 0xd3, 0x22, 0x60, 0xfc, 0x75, 0x15, - 0xcc, 0xbf, 0x0a, 0x4c, 0xf8, 0x16, 0x18, 0x90, 0x62, 0x06, 0x5b, 0x0e, 0x53, 0x8b, 0xb9, 0xd8, - 0x0c, 0xb4, 0xc0, 0xcb, 0xb1, 0x33, 0x90, 0x98, 0xd9, 0x77, 0x1b, 0xd0, 0x6d, 0xd3, 0x32, 0x87, - 0x3c, 0x04, 0x38, 0x90, 0x46, 0xc4, 0xef, 0x81, 0xe0, 0x43, 0xf6, 0x06, 0x11, 0x95, 0x0f, 0xf4, - 0x9e, 0xa0, 0x5d, 0xec, 0x7e, 0xf1, 0x24, 0xde, 0x06, 0x80, 0xb6, 0x24, 0x47, 0x89, 0xaa, 0x51, - 0xa7, 0xc6, 0x46, 0x7e, 0x27, 0x76, 0xa8, 0x3d, 0x8f, 0x2e, 0x03, 0x4f, 0xfd, 0xf0, 0xfe, 0x15, - 0x17, 0x75, 0xb5, 0xbc, 0xcd, 0x2f, 0x4f, 0x5e, 0xbc, 0xe6, 0x97, 0x3d, 0x3d, 0x4e, 0x6c, 0xbc, - 0x5c, 0x26, 0x89, 0xe6, 0xec, 0x98, 0x0a, 0xe9, 0x70, 0x90, 0x33, 0xf1, 0x27, 0x07, 0x19, 0xff, - 0xc5, 0xe3, 0x85, 0xef, 0xcf, 0x14, 0xed, 0x01, 0xbd, 0xac, 0x4f, 0x34, 0x65, 0x83, 0x71, 0x9b, - 0x5d, 0x9d, 0x7a, 0x8c, 0xc5, 0x7f, 0x6e, 0x31, 0x6e, 0x15, 0x62, 0x17, 0x31, 0xda, 0xac, 0x20, - 0x6c, 0xa0, 0xe1, 0x30, 0xba, 0xea, 0x89, 0x43, 0xef, 0xcc, 0x23, 0x9a, 0x3a, 0xc1, 0x30, 0x25, - 0x7f, 0x47, 0x5d, 0x06, 0x0d, 0x75, 0x6c, 0xb2, 0x6c, 0xe4, 0xa3, 0x49, 0xe4, 0xf1, 0x3a, 0x94, - 0xaf, 0xd8, 0x2a, 0x54, 0x7f, 0x82, 0x03, 0x01, 0x09, 0xbf, 0x2c, 0xa1, 0xa3, 0xa7, 0xbd, 0x86, - 0x01, 0xe6, 0x26, 0x61, 0xfc, 0x62, 0x05, 0x8a, 0xcf, 0xe2, 0x0b, 0x1a, 0xf6, 0xfb, 0x01, 0x34, - 0x28, 0xda, 0x50, 0xb8, 0xa3, 0xe3, 0x60, 0x94, 0xb6, 0x34, 0xa0, 0xfe, 0x7c, 0x48, 0xdb, 0xc3, - 0x92, 0xae, 0xf6, 0x0c, 0x46, 0x07, 0xd1, 0x94, 0x44, 0x3a, 0x71, 0x24, 0x48, 0xa2, 0x51, 0x0a, - 0x61, 0x7b, 0xeb, 0xdb, 0xbf, 0x34, 0xfa, 0xb4, 0x2c, 0x99, 0x6c, 0x44, 0x0a, 0x81, 0x94, 0xcb, - 0x81, 0x0e, 0x68, 0x46, 0x3b, 0x32, 0xd3, 0x70, 0x81, 0xa7, 0x46, 0x87, 0x96, 0xcf, 0x75, 0x8b, - 0x18, 0x59, 0x1b, 0xff, 0x7e, 0x45, 0xbf, 0xb7, 0xaf, 0x5b, 0x3b, 0xd7, 0xad, 0xdd, 0x6b, 0x42, - 0xc2, 0x4c, 0x9c, 0x50, 0x2d, 0x12, 0x2d, 0x0f, 0xb0, 0x0a, 0xe3, 0x4c, 0x68, 0xe8, 0x78, 0x0f, - 0x11, 0xe4, 0xf3, 0x19, 0x4b, 0x6f, 0x4c, 0x86, 0x63, 0xd9, 0xd1, 0x18, 0x92, 0x3f, 0x85, 0xe1, - 0xda, 0xa3, 0xf5, 0x0f, 0x01, 0x3f, 0x56, 0x66, 0xa3, 0xa9, 0xe4, 0x68, 0xac, 0x7b, 0x90, 0x5c, - 0x1b, 0x5d, 0xbd, 0x4b, 0x86, 0xb6, 0xe6, 0x42, 0xaf, 0x99, 0x6d, 0xe8, 0x98, 0x69, 0x73, 0xbe, - 0xc2, 0x68, 0x4b, 0xc4, 0xc3, 0xa0, 0xa6, 0x69, 0x52, 0x90, 0x15, 0x40, 0x49, 0xf4, 0x24, 0xa6, - 0x05, 0x14, 0x0a, 0x79, 0xb3, 0xa7, 0xbd, 0x36, 0xec, 0xc9, 0x56, 0x98, 0x6f, 0x4d, 0x3f, 0xd4, - 0x4f, 0x1a, 0x1b, 0x29, 0x60, 0xc4, 0xd5, 0xc6, 0x60, 0x1e, 0xc8, 0xa7, 0x22, 0xd8, 0x9c, 0x46, - 0x97, 0x1c, 0x6f, 0x8d, 0x21, 0x0b, 0x79, 0xd1, 0x44, 0xc0, 0x0c, 0x2d, 0x53, 0x0e, 0x0b, 0xa4, - 0x76, 0xf2, 0x10, 0xbc, 0x0f, 0x15, 0xae, 0x1d, 0x5f, 0x36, 0x4c, 0x52, 0xb9, 0xce, 0x23, 0x68, - 0x58, 0x3a, 0xf4, 0x24, 0x1f, 0x29, 0x2f, 0x71, 0xe3, 0x3a, 0x25, 0x03, 0x63, 0x4d, 0xec, 0x2f, - 0x90, 0x3b, 0x4d, 0xa4, 0xb4, 0x9b, 0x79, 0xa9, 0xc7, 0xc4, 0x6e, 0x31, 0xca, 0x60, 0x38, 0x61, - 0x39, 0xb9, 0x82, 0x69, 0x64, 0x6d, 0x89, 0xde, 0x0a, 0x5e, 0xc4, 0x9b, 0x8c, 0x8c, 0xfe, 0xfb, - 0x63, 0xa3, 0x3c, 0xcf, 0x87, 0xb8, 0x7d, 0x84, 0x56, 0x61, 0xb3, 0xb3, 0xff, 0xa8, 0xd9, 0x69, - 0x76, 0xba, 0x7b, 0xfb, 0x2c, 0x9e, 0xac, 0x80, 0xc8, 0xfd, 0xd3, 0x72, 0xe1, 0x29, 0xdf, 0x0c, - 0x05, 0xb3, 0x2c, 0x49, 0xf7, 0x69, 0x34, 0x80, 0x74, 0x18, 0xa7, 0x33, 0x55, 0x83, 0x6c, 0x38, - 0x44, 0x1e, 0xb8, 0x75, 0xc8, 0x20, 0x09, 0xee, 0xbd, 0x77, 0x03, 0x3f, 0x10, 0x2d, 0xcd, 0x90, - 0x42, 0xa3, 0x8e, 0x4f, 0xdf, 0xb7, 0x30, 0xa3, 0x88, 0x57, 0x9d, 0xc9, 0x57, 0xed, 0xae, 0x54, - 0xdb, 0xfb, 0x6a, 0xbf, 0xd9, 0xdc, 0x15, 0x19, 0xaa, 0x43, 0x7f, 0x21, 0x34, 0xf0, 0xe6, 0x33, - 0xe2, 0x70, 0x42, 0xd2, 0xe7, 0x43, 0x3f, 0xbd, 0x8a, 0xe2, 0x8b, 0x04, 0x42, 0x05, 0xd4, 0x28, - 0x7c, 0xf8, 0x69, 0x3e, 0xed, 0x47, 0x5a, 0xfa, 0x20, 0xee, 0x78, 0x61, 0xbc, 0x4b, 0x01, 0x88, - 0x0b, 0xec, 0x3c, 0x7e, 0xbc, 0xd3, 0x78, 0x73, 0xfa, 0x3d, 0xf5, 0xd6, 0x9b, 0xa4, 0xfe, 0xc5, - 0x4a, 0x14, 0x90, 0x78, 0x15, 0x72, 0xe8, 0xe0, 0xf7, 0x43, 0x48, 0xe7, 0xa4, 0x46, 0xab, 0xec, - 0x95, 0xfa, 0xfe, 0xe5, 0x7b, 0xa2, 0x12, 0x5a, 0x42, 0x72, 0x5a, 0x81, 0x5c, 0xff, 0x31, 0xb1, - 0xb6, 0x18, 0x24, 0x06, 0x42, 0x86, 0xa9, 0xc8, 0x56, 0xb2, 0xc3, 0x75, 0x18, 0xe2, 0xfb, 0x02, - 0xbe, 0x0f, 0x83, 0x6b, 0x1d, 0x7c, 0x72, 0x02, 0xb5, 0x81, 0x05, 0x0d, 0x42, 0x50, 0x1a, 0xe8, - 0xf0, 0x50, 0xde, 0x0d, 0xd0, 0xe0, 0x9c, 0x4a, 0xd2, 0x9c, 0x6a, 0x72, 0xd2, 0x44, 0xa4, 0x49, - 0x8e, 0xc4, 0x72, 0xd9, 0x08, 0x20, 0xbd, 0x23, 0xe8, 0x92, 0xc4, 0x4e, 0x7f, 0x4e, 0xe2, 0x26, - 0xec, 0x10, 0x05, 0x0e, 0x42, 0x60, 0xd2, 0x60, 0x22, 0x2b, 0xde, 0x94, 0x85, 0xa5, 0x7b, 0xea, - 0x8b, 0xde, 0x8e, 0xc3, 0xd2, 0x68, 0xc4, 0x1a, 0xdf, 0xcc, 0x9c, 0x6a, 0xc6, 0xfe, 0xd4, 0x83, - 0x31, 0x20, 0xc6, 0x97, 0x4c, 0x7f, 0x2c, 0x1a, 0x14, 0xd6, 0x0e, 0x76, 0x3e, 0x0c, 0x22, 0x6d, - 0x78, 0x79, 0x86, 0xdf, 0x8c, 0x4f, 0x31, 0xbb, 0x1c, 0x62, 0xcf, 0xa4, 0x55, 0x16, 0x0c, 0x58, - 0xcf, 0x97, 0xc5, 0x8d, 0x77, 0xc9, 0x18, 0x76, 0x08, 0x59, 0x45, 0x82, 0xfa, 0x9e, 0x7a, 0xd2, - 0xd6, 0x53, 0xdc, 0xe8, 0xd4, 0xb1, 0x63, 0xb3, 0xe5, 0xac, 0xc1, 0x59, 0x38, 0x6a, 0x03, 0xd2, - 0x4a, 0x88, 0xf9, 0x6d, 0xc9, 0x4b, 0x97, 0x28, 0x06, 0x02, 0x8a, 0x10, 0xb6, 0x0f, 0x92, 0xcd, - 0x75, 0xb9, 0xfd, 0x76, 0x67, 0x5d, 0x97, 0x13, 0x6a, 0x77, 0xe0, 0xc5, 0xba, 0xd3, 0xa6, 0xbb, - 0xe2, 0xcd, 0x2c, 0x9f, 0xb2, 0xa0, 0xde, 0x22, 0xe4, 0x65, 0x12, 0x1e, 0x2c, 0xb1, 0xa0, 0x94, - 0x1b, 0x8b, 0x53, 0x3c, 0x0b, 0xc3, 0x68, 0x0e, 0xc9, 0x8e, 0x55, 0x74, 0x33, 0x49, 0xe2, 0x53, - 0x35, 0x7d, 0xf9, 0xf6, 0x84, 0x0d, 0x54, 0x01, 0x7d, 0xaf, 0x9d, 0xe9, 0xf4, 0x3c, 0x0d, 0xb8, - 0xc3, 0x36, 0xcf, 0xd2, 0xc1, 0xac, 0x0e, 0xae, 0x25, 0xb9, 0x99, 0x5a, 0xcf, 0x42, 0x9a, 0xb2, - 0x00, 0x67, 0xfe, 0x01, 0xfc, 0xfb, 0x94, 0x69, 0x0b, 0x5c, 0xcd, 0x4a, 0x0b, 0xc2, 0x00, 0xc6, - 0xf3, 0xfe, 0x7a, 0x42, 0xb5, 0x7a, 0xab, 0xbb, 0x70, 0x7a, 0x33, 0xc3, 0x3a, 0x2e, 0xf4, 0x8a, - 0x0f, 0xd3, 0xbc, 0x21, 0x2b, 0xaf, 0x89, 0xc8, 0xf3, 0x20, 0x90, 0xd7, 0xcf, 0xde, 0x5a, 0x2d, - 0x2c, 0xf6, 0x9c, 0xf7, 0x95, 0x89, 0x8f, 0x94, 0x0d, 0x5e, 0xd2, 0x60, 0xf5, 0x60, 0x82, 0x03, - 0xfe, 0x9b, 0x68, 0xae, 0x2e, 0x42, 0x62, 0xc7, 0x57, 0xe3, 0x9b, 0x75, 0xbd, 0xc2, 0x29, 0xb3, - 0xe9, 0x0e, 0x5b, 0x9c, 0x80, 0x45, 0x39, 0x8a, 0xaa, 0x09, 0x91, 0x12, 0x26, 0x86, 0x44, 0x16, - 0x7c, 0x1c, 0x8d, 0x5d, 0x28, 0x84, 0x30, 0xa2, 0x11, 0x64, 0x59, 0x7d, 0x08, 0xe1, 0x1c, 0x65, - 0x68, 0xbc, 0x03, 0xc4, 0xe2, 0x46, 0xba, 0x7c, 0x92, 0x86, 0x4c, 0xe7, 0xab, 0xfb, 0xd1, 0x27, - 0x1a, 0x7d, 0x36, 0x09, 0x3c, 0xa8, 0xb8, 0xcf, 0x70, 0xe2, 0x48, 0x82, 0x50, 0x20, 0x90, 0xf0, - 0xc9, 0x60, 0xbd, 0xc9, 0xc6, 0xd5, 0x0c, 0xaa, 0xaa, 0x49, 0x84, 0x40, 0x14, 0x8e, 0x26, 0xc1, - 0x20, 0xb5, 0x0c, 0x62, 0x75, 0xf1, 0xb7, 0x0d, 0x7d, 0x3e, 0x64, 0xd7, 0xae, 0x0f, 0xf7, 0x61, - 0x2c, 0xbc, 0xc4, 0x9a, 0xd3, 0x39, 0x6b, 0xaa, 0x6f, 0xe6, 0x70, 0x65, 0xe3, 0x85, 0xa6, 0x57, - 0x45, 0x91, 0xf1, 0x41, 0x0d, 0x6b, 0xd0, 0xf6, 0x17, 0x8c, 0x74, 0xa9, 0xdc, 0x37, 0x8a, 0x81, - 0x91, 0xf8, 0xde, 0x24, 0x82, 0x7a, 0x55, 0xde, 0xd2, 0x8e, 0xdf, 0xd1, 0x16, 0x73, 0xec, 0x9f, - 0xf3, 0x66, 0x3b, 0x52, 0x47, 0x2c, 0x0e, 0x26, 0x69, 0x5d, 0xfd, 0x6d, 0xbe, 0xdd, 0xee, 0xec, - 0x42, 0x2d, 0x8d, 0xb0, 0x8c, 0xb5, 0xba, 0x0b, 0x69, 0x01, 0x48, 0x17, 0xf1, 0x98, 0x2a, 0x68, - 0xd6, 0xb1, 0xc0, 0x83, 0x75, 0x7b, 0xdf, 0x81, 0xef, 0xa2, 0x0d, 0x52, 0x25, 0xbd, 0x21, 0xf2, - 0x66, 0xb1, 0x4b, 0x61, 0xad, 0xb1, 0xc3, 0x92, 0xe4, 0xd6, 0x4e, 0xbb, 0xa8, 0x92, 0x6a, 0xd9, - 0xc4, 0xd8, 0x1d, 0x68, 0xd7, 0x96, 0xa6, 0x44, 0xe9, 0x33, 0x5b, 0xec, 0xf2, 0xf6, 0x4e, 0x52, - 0x9f, 0x6d, 0x13, 0x6f, 0xf9, 0xaa, 0x31, 0x74, 0x30, 0x37, 0xe1, 0xf0, 0x58, 0xa1, 0xb0, 0xb3, - 0x82, 0xbf, 0x4b, 0x0d, 0xbf, 0xc1, 0x98, 0x12, 0x54, 0x01, 0x73, 0x9a, 0x92, 0xca, 0x81, 0xc6, - 0xcf, 0x91, 0x6e, 0x0c, 0x97, 0x3d, 0x2f, 0x6d, 0xe5, 0x05, 0xf7, 0x09, 0xac, 0x5d, 0xf0, 0x10, - 0x0b, 0xfe, 0x46, 0xb1, 0x9c, 0x40, 0xa9, 0x5a, 0xbb, 0xd9, 0x69, 0xb4, 0x9b, 0x8f, 0x61, 0xb1, - 0xd3, 0x82, 0x15, 0x29, 0x11, 0xd0, 0x45, 0xe8, 0x97, 0xc6, 0x1d, 0xa7, 0x8f, 0x5c, 0xd2, 0x04, - 0x9b, 0x15, 0x8d, 0x0d, 0x7a, 0xe7, 0xa5, 0x36, 0x33, 0xb2, 0xb9, 0x8e, 0xe1, 0x67, 0x86, 0xe8, - 0xaf, 0x16, 0x0c, 0xd1, 0x6f, 0x8f, 0x33, 0xfd, 0xb8, 0x9a, 0xd0, 0xd9, 0x96, 0xe6, 0xbf, 0x0a, - 0xcf, 0x49, 0xf7, 0x00, 0x85, 0xbf, 0x22, 0x26, 0x85, 0xdf, 0x5d, 0x95, 0x0c, 0x49, 0x93, 0xd0, - 0x26, 0xce, 0x3a, 0xb5, 0x41, 0x53, 0x0d, 0xa3, 0xe7, 0x28, 0x88, 0xa7, 0x6c, 0x3f, 0x26, 0x71, - 0x46, 0x3d, 0x7b, 0xd5, 0x54, 0xd4, 0x6f, 0xd2, 0x80, 0x44, 0xba, 0x41, 0x5a, 0x5b, 0xce, 0x48, - 0x8a, 0xb7, 0x3b, 0x1e, 0xf3, 0x01, 0x2b, 0xee, 0xa1, 0x97, 0x1b, 0xfa, 0x4d, 0xb5, 0x00, 0xbd, - 0x49, 0x59, 0xb3, 0x86, 0x6c, 0x1c, 0x9c, 0x87, 0x11, 0x7e, 0xd7, 0x00, 0x64, 0xa8, 0x42, 0x21, - 0x84, 0x9d, 0x67, 0xec, 0x7a, 0x39, 0xb9, 0x82, 0xf8, 0x86, 0x68, 0xe1, 0xfa, 0xaa, 0xc1, 0x7c, - 0xcd, 0x53, 0x4e, 0x23, 0x99, 0x46, 0x21, 0x3c, 0x30, 0xd8, 0x4f, 0x53, 0xdb, 0x73, 0xbe, 0xfd, - 0xc5, 0x04, 0x62, 0x74, 0x4d, 0x0f, 0xa8, 0x20, 0xad, 0xdc, 0x81, 0x14, 0x11, 0x93, 0xa1, 0xc6, - 0xc7, 0x81, 0x94, 0x68, 0xea, 0x2e, 0x77, 0x69, 0xdb, 0x64, 0x0f, 0x61, 0xe6, 0x22, 0xf3, 0x19, - 0x78, 0x64, 0x12, 0xc5, 0x37, 0x62, 0x1a, 0x4e, 0xd8, 0x40, 0x41, 0xdb, 0x6b, 0xcd, 0x0b, 0x6f, - 0x32, 0x10, 0xf6, 0xa6, 0xd4, 0xd9, 0x5b, 0xde, 0x6b, 0xe8, 0x50, 0xcf, 0x92, 0x19, 0x89, 0x22, - 0xd4, 0x75, 0xf8, 0x6a, 0xd1, 0x9c, 0x09, 0x65, 0x34, 0x32, 0x15, 0x51, 0xdb, 0xce, 0xb4, 0x97, - 0x94, 0xd6, 0x62, 0x3c, 0xae, 0xa4, 0xed, 0x21, 0x35, 0xb6, 0x1f, 0xc4, 0xe8, 0xe3, 0xb9, 0x1f, - 0x71, 0xb2, 0xb8, 0x7a, 0x4f, 0x72, 0x4f, 0x81, 0xa2, 0x69, 0xa3, 0x4c, 0x07, 0xe3, 0x16, 0x2b, - 0x53, 0x99, 0xae, 0xad, 0xa1, 0x42, 0xc5, 0x37, 0x03, 0x6d, 0x1d, 0xed, 0xbf, 0x50, 0xfe, 0x35, - 0xcc, 0x6a, 0xc8, 0xac, 0x97, 0x05, 0x01, 0x35, 0xbc, 0x6b, 0x48, 0x6d, 0x24, 0x7b, 0xf8, 0xbf, - 0xc0, 0x63, 0x07, 0xda, 0xea, 0x35, 0x4f, 0x0c, 0x06, 0x4e, 0xb2, 0x0c, 0xc2, 0x63, 0x8c, 0x54, - 0x21, 0x72, 0x4c, 0x5d, 0xf1, 0x59, 0x81, 0xe0, 0x0c, 0x60, 0x49, 0xd7, 0x84, 0x5e, 0x09, 0xc7, - 0x2c, 0x38, 0x5e, 0xf9, 0x59, 0x47, 0x31, 0xc3, 0xd6, 0x88, 0xa1, 0x6a, 0xd2, 0x3a, 0x22, 0x51, - 0x74, 0xc2, 0xfc, 0x71, 0x19, 0xe2, 0xb4, 0x59, 0xfd, 0x78, 0x3e, 0xf1, 0x3b, 0x8f, 0xda, 0x84, - 0x3c, 0xfa, 0xf7, 0x5f, 0xff, 0x97, 0x89, 0xcb, 0x23, 0xaa, 0x9c, 0x10, 0x29, 0x23, 0x35, 0x60, - 0x6e, 0x68, 0x8f, 0xe8, 0x37, 0xad, 0x4c, 0xda, 0x3a, 0x3a, 0xad, 0xda, 0xf6, 0xff, 0xf7, 0x7f, - 0xb1, 0x41, 0x1c, 0x94, 0xea, 0x15, 0xe2, 0xfc, 0x0c, 0x08, 0xea, 0x17, 0xc4, 0x2c, 0x48, 0x61, - 0x7c, 0x10, 0x40, 0xf2, 0x38, 0xa1, 0x4d, 0xb8, 0x17, 0x56, 0x2c, 0x6c, 0xea, 0x50, 0x7f, 0xb5, - 0xbe, 0x98, 0x55, 0x12, 0x0b, 0x36, 0x8d, 0xb2, 0xd3, 0xea, 0x6c, 0xb7, 0x15, 0x71, 0x19, 0xc4, - 0xbb, 0xa8, 0x7f, 0xfd, 0x7f, 0xc4, 0xfc, 0x0e, 0xda, 0x9e, 0xc7, 0x70, 0xeb, 0x23, 0x32, 0x99, - 0x7a, 0x44, 0xac, 0x72, 0x74, 0x31, 0x99, 0xc7, 0xd5, 0xa3, 0x15, 0xfe, 0xbf, 0xa0, 0x84, 0x14, - 0x36, 0x01, 0x5e, 0x43, 0x96, 0x26, 0xb2, 0x1c, 0x4e, 0xc2, 0x0e, 0x83, 0xc7, 0x62, 0xf7, 0x14, - 0x89, 0x4d, 0x5e, 0x59, 0x4b, 0x85, 0x7a, 0x0c, 0xf7, 0x57, 0xd5, 0xd9, 0xe7, 0x3f, 0xbb, 0x8f, - 0x44, 0x7c, 0xcf, 0x08, 0x9a, 0x5f, 0xac, 0x6a, 0x44, 0x7b, 0x2c, 0x26, 0x59, 0x13, 0xe6, 0x05, - 0x71, 0xdc, 0x03, 0x64, 0x2f, 0x76, 0xd5, 0xf6, 0x41, 0x82, 0x2d, 0x26, 0x2a, 0x2c, 0x94, 0x95, - 0x30, 0x89, 0xea, 0x07, 0x39, 0x40, 0x3c, 0xd1, 0x04, 0x0f, 0xa6, 0x34, 0x3b, 0x5f, 0x75, 0x3a, - 0x9e, 0xfc, 0x99, 0xbb, 0x30, 0x98, 0x47, 0xb3, 0x79, 0x61, 0x67, 0xe5, 0xc7, 0xe5, 0x90, 0x2f, - 0x71, 0xdf, 0x53, 0x8e, 0x0e, 0x83, 0x52, 0x79, 0x0d, 0xf6, 0xda, 0x29, 0x0e, 0xff, 0xd1, 0x92, - 0xb1, 0x5b, 0x69, 0x0a, 0xf2, 0x69, 0x7a, 0xfe, 0xe6, 0x68, 0xfb, 0xab, 0xb6, 0x3a, 0x7a, 0xf3, - 0x3d, 0xac, 0x7b, 0x90, 0xa7, 0x68, 0xea, 0xa7, 0xbe, 0x07, 0x52, 0xe3, 0x3d, 0x90, 0xe4, 0x7f, - 0x9c, 0x87, 0xbd, 0x34, 0x09, 0xb6, 0xf2, 0x0c, 0x75, 0x3d, 0x3d, 0x33, 0x22, 0xf5, 0x79, 0x70, - 0x37, 0x37, 0x02, 0x95, 0x97, 0x4b, 0xf9, 0x01, 0x8e, 0x62, 0xc0, 0x3a, 0x83, 0x70, 0x79, 0xb7, - 0x82, 0xed, 0xc1, 0x4b, 0x1f, 0x92, 0x1d, 0x4c, 0xc3, 0xdb, 0x2f, 0x54, 0x7f, 0x4e, 0x40, 0xf9, - 0x85, 0xe2, 0xab, 0x29, 0x41, 0x97, 0xd4, 0x45, 0x6b, 0x90, 0x2d, 0xfa, 0xdc, 0xa2, 0x6a, 0x8d, - 0xce, 0x4a, 0xa8, 0xcf, 0x86, 0x43, 0x6c, 0x80, 0x18, 0x1e, 0xe0, 0x7a, 0xf4, 0x88, 0xfe, 0xd5, - 0xc6, 0xfe, 0xb5, 0x8d, 0xb2, 0xf6, 0xf5, 0xfe, 0x23, 0x55, 0x13, 0x5c, 0xd4, 0x97, 0x03, 0xcc, - 0x89, 0xf3, 0xdb, 0x5f, 0x34, 0x54, 0x7e, 0x55, 0xe6, 0xe4, 0xb9, 0xd1, 0xb5, 0xbd, 0x62, 0x2e, - 0xce, 0x6f, 0xe2, 0xe8, 0x18, 0x46, 0xcb, 0x97, 0xbc, 0x31, 0x7c, 0x43, 0x8f, 0x24, 0xdc, 0xcd, - 0x84, 0xff, 0x35, 0xc4, 0x10, 0x12, 0xcb, 0x69, 0x67, 0x68, 0x0e, 0x58, 0x5a, 0x89, 0x3f, 0xb0, - 0x29, 0xb2, 0xbd, 0xaa, 0x01, 0x82, 0xf0, 0x75, 0x30, 0xf1, 0xed, 0x03, 0x49, 0xea, 0xb1, 0x7d, - 0x20, 0x09, 0x77, 0x02, 0x1b, 0xa9, 0xc4, 0x87, 0x5b, 0xba, 0xe6, 0x4a, 0xb0, 0x27, 0x32, 0xf1, - 0x05, 0x09, 0xc6, 0x10, 0x03, 0xe6, 0x0a, 0x43, 0x23, 0x29, 0x8c, 0xf4, 0x09, 0xbb, 0x35, 0x2f, - 0x95, 0x44, 0x83, 0xf3, 0x99, 0xbd, 0x58, 0x97, 0x2e, 0xd5, 0x52, 0xa2, 0x0d, 0xd0, 0x2c, 0xed, - 0x67, 0x0a, 0x79, 0x30, 0x5a, 0x9c, 0xfe, 0xa2, 0x75, 0xe3, 0x5d, 0x65, 0x61, 0x31, 0x38, 0x54, - 0xd7, 0xea, 0xd1, 0xb3, 0xd3, 0xd3, 0xa3, 0xd3, 0xef, 0x5f, 0xbe, 0x82, 0xed, 0x25, 0x80, 0x54, - 0xa3, 0x53, 0x77, 0x2c, 0xcd, 0xd3, 0xb1, 0xa6, 0x03, 0xd8, 0x4c, 0xbe, 0xbe, 0x1a, 0xe6, 0xc7, - 0xc8, 0xbc, 0xbb, 0xb0, 0x23, 0x19, 0x66, 0x3e, 0x92, 0xa0, 0x4a, 0x36, 0x25, 0xd1, 0xf7, 0xae, - 0xda, 0xba, 0x76, 0x55, 0x83, 0xfe, 0xb7, 0x75, 0x43, 0x7f, 0xe9, 0x7f, 0x5b, 0xbf, 0xd0, 0x5f, - 0x22, 0x8b, 0x17, 0x26, 0x85, 0x46, 0x57, 0x2a, 0x67, 0x55, 0xc0, 0x1a, 0x3d, 0x0e, 0xd1, 0x46, - 0x10, 0x4b, 0x66, 0x84, 0xe5, 0x66, 0x48, 0xcc, 0xbb, 0x84, 0x8c, 0x39, 0x61, 0x89, 0x90, 0xb0, - 0x88, 0x8d, 0x4d, 0x3a, 0x64, 0x61, 0x71, 0xeb, 0xfa, 0x1e, 0x63, 0x78, 0x49, 0xc0, 0x97, 0x0d, - 0x82, 0x1b, 0x66, 0x29, 0xc3, 0x4a, 0xdd, 0x81, 0x2d, 0x06, 0x32, 0x5c, 0xa1, 0xeb, 0xe3, 0xaa, - 0xfc, 0x1e, 0xf7, 0xeb, 0x33, 0x3a, 0x00, 0xbf, 0xd3, 0x24, 0x2d, 0x64, 0x44, 0xa8, 0x18, 0xce, - 0x2f, 0x6b, 0x86, 0x63, 0xe5, 0xee, 0xa0, 0x11, 0x3d, 0x8f, 0x70, 0x56, 0x01, 0xfc, 0xe1, 0x7d, - 0x57, 0x08, 0xe2, 0xdd, 0xeb, 0xd7, 0x22, 0x90, 0xd0, 0xc6, 0x48, 0x12, 0x00, 0x9f, 0xfe, 0x7b, - 0x43, 0x84, 0xcd, 0x04, 0x13, 0xbf, 0x34, 0xca, 0x31, 0x7c, 0x60, 0xb5, 0xb8, 0xea, 0x8d, 0xb0, - 0x51, 0xea, 0x3e, 0xb5, 0x4c, 0xb7, 0xd9, 0xa7, 0x3b, 0xf1, 0xc1, 0x0a, 0x5f, 0x44, 0x71, 0xcc, - 0xbe, 0x9d, 0x9e, 0xea, 0x47, 0xc4, 0xf6, 0x48, 0x64, 0x9e, 0xa4, 0xcc, 0xe0, 0x40, 0x80, 0x0c, - 0x79, 0x1c, 0xcd, 0x93, 0xa2, 0xf3, 0x43, 0xfb, 0x1e, 0x03, 0x32, 0x89, 0x47, 0x96, 0x8c, 0xe8, - 0xfd, 0xd1, 0xe9, 0x8b, 0x6f, 0x3f, 0x61, 0x48, 0xa4, 0x72, 0xc2, 0x70, 0x21, 0x45, 0xb7, 0x90, - 0xd3, 0x44, 0x26, 0x5a, 0x4f, 0xdc, 0x7f, 0xff, 0x1f, 0x9c, 0xac, 0x08, 0xef, 0x1f, 0xd0, 0xdf, - 0x29, 0x02, 0xfb, 0xa4, 0xaf, 0xaf, 0x49, 0x1c, 0x1a, 0xdc, 0x68, 0xc1, 0xaa, 0xc1, 0x38, 0x88, - 0x4d, 0x0c, 0xb6, 0xd7, 0xc7, 0xea, 0xb0, 0x7a, 0xc6, 0xf4, 0x51, 0x6b, 0xb7, 0x1e, 0xb7, 0x5b, - 0x24, 0x11, 0xb5, 0x84, 0xdf, 0xbe, 0x8f, 0x91, 0xbc, 0x6f, 0x01, 0xe7, 0x3d, 0xad, 0xab, 0xb7, - 0x55, 0x3e, 0x27, 0x36, 0x43, 0x59, 0xd3, 0xc5, 0x20, 0x84, 0x7d, 0x00, 0x54, 0x62, 0x8e, 0xbc, - 0xc1, 0x3a, 0x88, 0x4b, 0x9c, 0x87, 0x1a, 0x20, 0x0f, 0x22, 0xef, 0x6c, 0x0d, 0x07, 0x47, 0x81, - 0xac, 0xe4, 0x67, 0xdf, 0x1e, 0xf1, 0xbc, 0x8a, 0xf8, 0x74, 0x15, 0x47, 0xb4, 0x46, 0x48, 0xcc, - 0xaf, 0xdf, 0xab, 0x4d, 0x9e, 0x48, 0xd3, 0x28, 0xb3, 0xaa, 0xe5, 0xad, 0x2e, 0xd1, 0xf3, 0xc5, - 0xe7, 0x25, 0x67, 0x7d, 0xc7, 0x73, 0x59, 0x99, 0x6f, 0xe1, 0xea, 0xd3, 0xff, 0x09, 0xb2, 0xb5, - 0x94, 0x21, 0x22, 0xa8, 0x15, 0x79, 0xd9, 0x5b, 0xc9, 0x53, 0x94, 0x7f, 0x9f, 0x4d, 0xe6, 0xe7, - 0x48, 0x42, 0x4d, 0xe2, 0xed, 0xd0, 0x9f, 0x4d, 0xa2, 0x9b, 0xdc, 0x62, 0x22, 0x9b, 0x2c, 0xd6, - 0x64, 0x2a, 0xb6, 0x7f, 0x12, 0xaf, 0x27, 0x44, 0xbb, 0x97, 0x12, 0x6b, 0xa0, 0x8a, 0xa7, 0x45, - 0x07, 0x7c, 0xd2, 0x23, 0x66, 0x7d, 0x31, 0x37, 0x18, 0xab, 0x78, 0xa7, 0x64, 0xe0, 0xcc, 0xf8, - 0x41, 0xd6, 0x09, 0x1e, 0x5a, 0xc2, 0xe1, 0xb1, 0x49, 0x16, 0xc7, 0xc0, 0xc7, 0xcc, 0xf1, 0x7c, - 0x96, 0x45, 0x32, 0x88, 0x8c, 0x68, 0x61, 0x40, 0xfa, 0x6e, 0x6d, 0x61, 0x05, 0xa0, 0xf9, 0xc8, - 0x9a, 0xea, 0x14, 0xa7, 0x55, 0xf2, 0x4c, 0xb4, 0x63, 0x2c, 0xee, 0x43, 0x22, 0xf1, 0x18, 0xc6, - 0xc7, 0xa9, 0x08, 0xa1, 0xb4, 0x43, 0xd0, 0xbb, 0x1e, 0xec, 0x53, 0x41, 0x92, 0xa3, 0x23, 0xf1, - 0xe1, 0x5d, 0x8b, 0x4c, 0x5e, 0xc2, 0x92, 0x8c, 0xf5, 0x64, 0xd5, 0xe4, 0x30, 0x70, 0x74, 0x4b, - 0x1b, 0x4f, 0xd9, 0x2d, 0x4a, 0x5a, 0x6c, 0x06, 0xd3, 0x73, 0x35, 0x96, 0x8b, 0x05, 0x74, 0x9f, - 0xa5, 0x6b, 0xb9, 0xf9, 0x47, 0x77, 0x35, 0xf3, 0xd5, 0xb1, 0xb1, 0xd7, 0x2d, 0xa1, 0xee, 0xca, - 0x9b, 0x65, 0x51, 0x28, 0x70, 0x38, 0x93, 0x46, 0x0c, 0x12, 0xbd, 0xfc, 0x90, 0x8e, 0x3a, 0x39, - 0xf3, 0xae, 0x42, 0xad, 0xc9, 0x68, 0x1b, 0x66, 0xdb, 0x1c, 0x6e, 0xb0, 0xc1, 0x2b, 0x43, 0x39, - 0xb4, 0xd9, 0x90, 0x16, 0x7e, 0xa6, 0xe8, 0x4c, 0xc1, 0x97, 0xfb, 0x7e, 0x7e, 0x66, 0x2e, 0x2b, - 0x13, 0x5e, 0xa7, 0xe7, 0x88, 0x99, 0x24, 0xfc, 0xf3, 0xb8, 0x24, 0xac, 0x55, 0xac, 0xa1, 0x44, - 0x46, 0x27, 0x2f, 0xeb, 0x22, 0xde, 0xcb, 0x5d, 0xdd, 0xc6, 0xea, 0x67, 0x9c, 0xd8, 0xca, 0x08, - 0x3b, 0x02, 0x35, 0xbf, 0x80, 0x8f, 0xa2, 0xbe, 0x2d, 0x50, 0x3c, 0xe5, 0x85, 0x42, 0xf8, 0x24, - 0x2f, 0x5a, 0xdc, 0xd1, 0x5f, 0xbe, 0x3a, 0x7d, 0xf5, 0xe2, 0x34, 0xdf, 0xcf, 0x61, 0x3a, 0xf8, - 0x81, 0x98, 0x44, 0x0c, 0x7b, 0x55, 0x07, 0xaa, 0x00, 0xfc, 0x04, 0x9e, 0x1d, 0x73, 0x06, 0xa9, - 0x28, 0x14, 0x17, 0x24, 0xcc, 0x71, 0x1a, 0x9d, 0xfb, 0x6c, 0x2d, 0x91, 0xf4, 0x87, 0x66, 0xc6, - 0x80, 0x1f, 0x23, 0xa1, 0x26, 0xda, 0x7a, 0x57, 0x40, 0xee, 0xdf, 0x9c, 0x84, 0x46, 0x7c, 0x8d, - 0x03, 0x43, 0xe1, 0xf6, 0xf0, 0x8f, 0x29, 0x18, 0xb2, 0xac, 0x71, 0xc1, 0x9a, 0x26, 0xae, 0x02, - 0x7c, 0x30, 0xa2, 0x67, 0x8d, 0x8f, 0x1f, 0x73, 0xe7, 0x80, 0x0f, 0x6d, 0xb7, 0x53, 0x17, 0xfb, - 0x72, 0x71, 0xea, 0x61, 0x86, 0xd9, 0x2d, 0x9f, 0x91, 0xd8, 0xe0, 0xc3, 0x69, 0x72, 0x14, 0xcd, - 0x21, 0x6b, 0xbd, 0x39, 0x51, 0x47, 0xd1, 0xf7, 0xf7, 0x06, 0xba, 0xb7, 0x0a, 0xa8, 0x9f, 0xfe, - 0x05, 0x0e, 0x21, 0x04, 0x36, 0x5b, 0xc3, 0x2a, 0xf5, 0x66, 0x6a, 0x4b, 0x53, 0x97, 0x78, 0xc4, - 0x6b, 0xa7, 0x11, 0x34, 0xb0, 0xbf, 0xdb, 0xd6, 0x7b, 0xf7, 0x34, 0xcb, 0x00, 0x3d, 0x30, 0x64, - 0xcf, 0x84, 0x01, 0x2a, 0xe8, 0x23, 0x92, 0x35, 0x73, 0xcd, 0x23, 0xb1, 0x68, 0x67, 0x5b, 0xd5, - 0x0e, 0x0f, 0xf6, 0x77, 0x2b, 0x38, 0xa7, 0x18, 0x4c, 0x4d, 0xf3, 0x62, 0x72, 0x19, 0x10, 0xa5, - 0xa6, 0x20, 0xbd, 0x62, 0x5f, 0xbf, 0xe5, 0xc4, 0x88, 0x6b, 0x3a, 0x2b, 0xd9, 0x13, 0xa5, 0xb7, - 0x3b, 0x7b, 0xdb, 0xff, 0x4e, 0xbd, 0x35, 0x86, 0x28, 0xcd, 0x19, 0xc0, 0xb0, 0x33, 0xdb, 0xd4, - 0x7d, 0x58, 0x42, 0xeb, 0xe4, 0xe5, 0x3f, 0xd9, 0x2e, 0x7c, 0x4b, 0xf9, 0x4f, 0x10, 0xd2, 0xa6, - 0x79, 0xa4, 0x1d, 0x75, 0xf4, 0x16, 0xc1, 0xef, 0xd8, 0x65, 0x83, 0x56, 0x51, 0x07, 0x23, 0x12, - 0x2f, 0x9d, 0xb7, 0x46, 0x6d, 0x1c, 0x6a, 0xc7, 0x91, 0x26, 0x2f, 0x19, 0xcb, 0x85, 0x67, 0xbd, - 0x9e, 0xab, 0x9b, 0x8d, 0xf8, 0x50, 0xf5, 0x65, 0x4c, 0xb2, 0xb7, 0xbc, 0x61, 0xf3, 0x00, 0xaf, - 0x95, 0x6c, 0x53, 0x31, 0x27, 0xad, 0x5a, 0xf0, 0x2e, 0x9c, 0xc8, 0xb2, 0xde, 0xa5, 0xeb, 0x65, - 0xc6, 0x33, 0xcd, 0xa1, 0xd6, 0x2f, 0xfd, 0x75, 0xb6, 0x17, 0x1d, 0x2f, 0xbd, 0xa0, 0xe7, 0xe6, - 0xc1, 0xd5, 0x51, 0x98, 0x6b, 0x21, 0x2b, 0x20, 0x0c, 0x83, 0x98, 0x1d, 0xbd, 0xb2, 0x6a, 0xa5, - 0x4c, 0x14, 0xb6, 0xda, 0x94, 0x4e, 0x57, 0xc3, 0x62, 0x9f, 0xdb, 0xb4, 0x00, 0x2e, 0x4b, 0x1c, - 0xae, 0xe4, 0x23, 0xb1, 0x7c, 0xe2, 0xa9, 0x6f, 0xde, 0xbf, 0xfa, 0xa6, 0x71, 0x7a, 0x52, 0x87, - 0x95, 0x00, 0x99, 0x04, 0xe0, 0xea, 0x74, 0x65, 0x2b, 0xaa, 0xe9, 0xea, 0x61, 0x6b, 0x6f, 0xd7, - 0xbc, 0x19, 0x09, 0x7f, 0x60, 0x2f, 0x24, 0x71, 0x1c, 0x54, 0x35, 0x52, 0x31, 0xe1, 0x46, 0xdb, - 0xae, 0xbb, 0x12, 0xbe, 0x59, 0x33, 0x7b, 0x1f, 0xbd, 0xec, 0xe8, 0x97, 0x0d, 0x73, 0x1c, 0x4e, - 0xaf, 0xc4, 0x3d, 0x0e, 0xc7, 0xbe, 0xf5, 0xd5, 0x6d, 0x7b, 0xd7, 0x27, 0xe2, 0x29, 0xc6, 0xa6, - 0x8a, 0x34, 0x6a, 0x88, 0xd3, 0xa0, 0x1d, 0xb3, 0xcf, 0xf2, 0xcf, 0xdb, 0xa2, 0x47, 0x19, 0xf6, - 0x8a, 0x4c, 0x16, 0xca, 0x06, 0xba, 0xc3, 0x4e, 0x8f, 0x16, 0xec, 0x37, 0xcf, 0xd7, 0x82, 0x9d, - 0x12, 0x6d, 0xe8, 0xac, 0x09, 0xcb, 0x01, 0xef, 0x15, 0x00, 0xe7, 0x3e, 0x76, 0x85, 0x00, 0x6e, - 0x8c, 0xbb, 0x5e, 0xf6, 0xb7, 0x13, 0xa8, 0xc2, 0x4e, 0xe0, 0x46, 0xa2, 0x3f, 0xb3, 0xdf, 0x33, - 0xbb, 0xce, 0x73, 0x14, 0xad, 0x8d, 0x3e, 0xe3, 0x21, 0x9c, 0xd1, 0x01, 0x2b, 0xfa, 0x15, 0x2d, - 0xc9, 0x49, 0xb2, 0x40, 0xcb, 0x1b, 0xd1, 0x26, 0x50, 0x3e, 0x92, 0xbf, 0x77, 0x1b, 0xb9, 0x1f, - 0x5f, 0x45, 0x3b, 0x2b, 0x5d, 0xfb, 0xb2, 0x91, 0x3d, 0xa0, 0xb5, 0xdc, 0x1f, 0xc0, 0x2a, 0x34, - 0xbc, 0xbf, 0x6f, 0x00, 0xe4, 0x46, 0xf6, 0xeb, 0x9e, 0x5b, 0x2d, 0xda, 0x8d, 0x39, 0x1b, 0x77, - 0x99, 0x67, 0xfd, 0xab, 0xb7, 0xdf, 0xbf, 0x31, 0x6e, 0xf5, 0x25, 0x8f, 0xd2, 0x0f, 0xce, 0xa0, - 0x1f, 0x3b, 0xae, 0x73, 0xc9, 0xff, 0x7a, 0xf2, 0x07, 0xbe, 0xa1, 0xce, 0x47, 0xb7, 0xd2, 0xc7, - 0xed, 0x83, 0xc3, 0xee, 0xe8, 0x8e, 0x38, 0x86, 0xa1, 0xb0, 0x9c, 0xe5, 0xd0, 0x2f, 0x71, 0x0a, - 0xc3, 0x37, 0xf6, 0x51, 0xe3, 0x1f, 0x24, 0x1a, 0xd3, 0xdf, 0xcc, 0x5b, 0x8d, 0x7e, 0x8b, 0xbf, - 0x1a, 0x7f, 0x24, 0x59, 0x89, 0xfe, 0x8e, 0x66, 0x97, 0x76, 0x63, 0x99, 0x83, 0x95, 0x69, 0x09, - 0xb2, 0xb3, 0xfe, 0xc3, 0x7e, 0x43, 0xf4, 0x3b, 0x77, 0xaa, 0xc9, 0x1f, 0xf6, 0xda, 0xd6, 0xc3, - 0x57, 0xf9, 0x97, 0xed, 0xec, 0xd7, 0x4e, 0xf6, 0x6b, 0xf7, 0x9a, 0x5b, 0x2c, 0x9e, 0x95, 0x7c, - 0x70, 0x92, 0xe1, 0x05, 0x95, 0x90, 0x43, 0x82, 0xbc, 0x80, 0x71, 0x7a, 0xfe, 0xe0, 0xc0, 0x9e, - 0x8c, 0x02, 0xc6, 0xf1, 0x98, 0xcb, 0x14, 0xac, 0x98, 0xd4, 0xe7, 0xd9, 0x3c, 0xc1, 0x28, 0x07, - 0x24, 0x8c, 0x3b, 0x6c, 0xc1, 0xd4, 0x7f, 0xe7, 0x5c, 0xba, 0xc4, 0xd8, 0x3e, 0x38, 0x70, 0x58, - 0x77, 0xc0, 0xb2, 0xec, 0xcf, 0x53, 0xdd, 0xa0, 0x20, 0x40, 0x7b, 0x2e, 0xbb, 0x0e, 0xe6, 0x58, - 0xff, 0xd1, 0x53, 0xcd, 0x95, 0x2a, 0x5d, 0x42, 0x3e, 0x38, 0x71, 0x3a, 0x73, 0x3e, 0x5a, 0x54, - 0x40, 0x44, 0xf0, 0xfc, 0xd5, 0xf1, 0xd9, 0xb3, 0xd3, 0xd3, 0xe3, 0x12, 0x31, 0x94, 0x7d, 0x36, - 0x6f, 0x69, 0x02, 0xba, 0x0e, 0x2d, 0x77, 0x62, 0x1f, 0x5d, 0x07, 0xb6, 0x32, 0xc7, 0xc5, 0x31, - 0x1a, 0xfd, 0x76, 0xee, 0xdc, 0x25, 0x0e, 0x97, 0x52, 0xa9, 0xa3, 0x2b, 0x6d, 0xef, 0xed, 0x55, - 0xd6, 0xd1, 0x6e, 0x7e, 0xa5, 0x16, 0x4c, 0xd1, 0x76, 0xb3, 0xbd, 0x50, 0xfa, 0xaf, 0x6b, 0x4a, - 0x5b, 0x23, 0x7c, 0xf9, 0xee, 0xfb, 0xe7, 0xaf, 0x5f, 0x9d, 0x7d, 0x7d, 0xf4, 0xea, 0xf5, 0xcb, - 0x13, 0x2b, 0xc6, 0xe4, 0xc3, 0xa2, 0xb7, 0xae, 0x5b, 0x3e, 0xec, 0x5b, 0x64, 0x04, 0xe5, 0x4e, - 0x97, 0xbb, 0xb5, 0xf1, 0x31, 0x8f, 0x5d, 0x39, 0xa1, 0xad, 0xf6, 0xe8, 0xdd, 0x5b, 0x34, 0x4a, - 0x8d, 0xdd, 0x06, 0xc3, 0xae, 0x0e, 0x04, 0x71, 0x5c, 0xbe, 0x28, 0xa6, 0xeb, 0x9c, 0xe8, 0xc7, - 0x0b, 0xff, 0x26, 0x01, 0xa9, 0x15, 0xa3, 0x5b, 0xdc, 0x25, 0x21, 0x2a, 0x6e, 0x39, 0x9e, 0xe4, - 0x23, 0x61, 0x47, 0xc3, 0x67, 0x26, 0x97, 0xc3, 0xd7, 0x8f, 0x06, 0xbe, 0x1d, 0x2b, 0xe2, 0x16, - 0x82, 0x3a, 0x72, 0x10, 0x44, 0xde, 0x59, 0x7d, 0x04, 0xe9, 0x9b, 0xca, 0xc5, 0xb0, 0x0c, 0xb7, - 0x10, 0x4c, 0xe1, 0x2e, 0x06, 0x3f, 0xb8, 0x85, 0x75, 0xe2, 0x5a, 0xee, 0xfc, 0x6e, 0x71, 0x89, - 0xb9, 0xd6, 0x81, 0x9e, 0x5b, 0x3e, 0x26, 0x73, 0xab, 0x8e, 0x7f, 0xd0, 0x57, 0xe9, 0x2a, 0x7c, - 0x01, 0xf3, 0xce, 0xca, 0x93, 0xe9, 0xae, 0xed, 0xdf, 0xef, 0xda, 0x1e, 0xfb, 0x6e, 0xd1, 0x0b, - 0x3f, 0x83, 0x26, 0xf3, 0x98, 0x81, 0xfb, 0x01, 0x8f, 0x19, 0xb8, 0x22, 0x87, 0x74, 0x6d, 0xa7, - 0x78, 0xb7, 0xe0, 0xce, 0xee, 0x96, 0x1d, 0xce, 0xdd, 0x05, 0x2a, 0x2b, 0x3b, 0x70, 0xbb, 0x4b, - 0x96, 0x9c, 0x5b, 0xb9, 0xa6, 0xdc, 0x0a, 0x06, 0xec, 0x96, 0x88, 0xb2, 0x48, 0x93, 0x6e, 0x99, - 0x8b, 0x66, 0x43, 0x36, 0x4c, 0x22, 0x1b, 0xf4, 0xbb, 0xec, 0x85, 0x1e, 0xf7, 0x82, 0x5f, 0x9c, - 0xbb, 0xe0, 0xbe, 0xe6, 0x56, 0xf2, 0x1a, 0x77, 0xa9, 0x17, 0x99, 0xbb, 0xc4, 0x57, 0xcb, 0x5d, - 0xe7, 0x55, 0xe5, 0x56, 0x79, 0x22, 0xb9, 0xd5, 0xbe, 0x3e, 0xd9, 0x10, 0x33, 0x1f, 0x8f, 0x6c, - 0x8c, 0x2f, 0xf3, 0x37, 0x7a, 0x90, 0x8b, 0x3e, 0x3d, 0xee, 0x12, 0xcf, 0x19, 0xb7, 0xec, 0xbb, - 0xe2, 0x56, 0x3a, 0x91, 0x64, 0xad, 0x73, 0x3f, 0xb3, 0x96, 0x9f, 0xc9, 0x93, 0x6e, 0xb5, 0x78, - 0xd4, 0xe7, 0x16, 0xf6, 0x0c, 0x77, 0xf1, 0x00, 0xcf, 0x2d, 0x1f, 0xb7, 0xb9, 0xc5, 0x13, 0x2d, - 0xd7, 0xf6, 0x1d, 0xc9, 0x3a, 0x80, 0x7d, 0xd4, 0x34, 0xff, 0xf5, 0xfb, 0x1f, 0xb2, 0xc6, 0x4b, - 0xae, 0x21, 0xae, 0xe5, 0xbb, 0xe1, 0x16, 0xfd, 0x2a, 0xdc, 0x32, 0x4f, 0x2c, 0x7b, 0x2b, 0x58, - 0xcb, 0x71, 0x9e, 0x2f, 0xc6, 0x37, 0xdf, 0x5b, 0x4b, 0x71, 0x6e, 0x0d, 0xb3, 0x78, 0x42, 0xe5, - 0x16, 0xce, 0x96, 0xdc, 0xc5, 0x83, 0x21, 0x77, 0xf1, 0x74, 0xc7, 0x2d, 0x9c, 0xc7, 0xb8, 0xe5, - 0x63, 0x94, 0x1c, 0xf9, 0xda, 0x8e, 0x98, 0xe3, 0x3f, 0x7b, 0x61, 0xa6, 0xa0, 0x7c, 0x2a, 0xe2, - 0x2e, 0x9e, 0x53, 0xb8, 0x15, 0x66, 0x7f, 0xb7, 0xda, 0x76, 0xee, 0x2e, 0xb1, 0x40, 0xbb, 0x15, - 0x96, 0x5e, 0xb7, 0xd2, 0xb4, 0xea, 0x56, 0x1b, 0x3f, 0x73, 0x6a, 0x66, 0x5d, 0x2f, 0x27, 0x65, - 0xa3, 0xfa, 0xe5, 0xa4, 0x5c, 0x34, 0x75, 0xba, 0x25, 0xcb, 0x9f, 0xbb, 0x68, 0x6e, 0x73, 0xcb, - 0x06, 0x25, 0xb7, 0xc2, 0x12, 0xe3, 0x96, 0xcc, 0x27, 0xee, 0x82, 0xe5, 0xc3, 0x5d, 0xb4, 0x2f, - 0xb8, 0x95, 0x4a, 0xbc, 0x5b, 0xad, 0x71, 0xbb, 0xb6, 0x46, 0x9c, 0x8d, 0x57, 0x76, 0xdf, 0x6c, - 0xbc, 0x99, 0x2a, 0x96, 0x8d, 0xb7, 0xa4, 0xa1, 0xba, 0x05, 0x61, 0xc9, 0x2d, 0x49, 0x56, 0xae, - 0xad, 0x8e, 0xba, 0x15, 0xaa, 0x96, 0x5b, 0x54, 0x91, 0xdc, 0xb2, 0x62, 0xe3, 0xda, 0xba, 0x87, - 0xbb, 0x20, 0x1b, 0x94, 0xe4, 0xf8, 0x8f, 0x77, 0x1b, 0x1f, 0x7b, 0x76, 0x1c, 0x2f, 0xae, 0x7a, - 0x19, 0xfb, 0x13, 0x98, 0xd5, 0xec, 0x68, 0x5e, 0x2f, 0xb9, 0x09, 0x07, 0x6a, 0x34, 0x0f, 0x45, - 0xfb, 0xf7, 0x66, 0x41, 0x0d, 0xe7, 0xb4, 0xf5, 0x5b, 0x44, 0x21, 0x8b, 0x28, 0x01, 0x57, 0x1f, - 0xef, 0xca, 0x43, 0x92, 0x0d, 0x78, 0x77, 0xc8, 0xf7, 0x1e, 0xbe, 0xc7, 0x7e, 0x3a, 0x8f, 0x43, - 0x15, 0x73, 0x66, 0x05, 0x0e, 0x9c, 0xbd, 0xdb, 0xd8, 0xc8, 0x60, 0xf1, 0x15, 0x5a, 0xb5, 0x69, - 0x72, 0xee, 0xaa, 0xe8, 0xe2, 0x00, 0x2e, 0x27, 0x36, 0x54, 0x1f, 0xee, 0xf6, 0xc3, 0x68, 0x30, - 0xc7, 0xd9, 0x74, 0x53, 0xcc, 0x2f, 0xaf, 0x26, 0x7c, 0x52, 0x5d, 0x23, 0xbe, 0x76, 0xe9, 0x48, - 0x13, 0xfe, 0xa4, 0xc9, 0x61, 0xd0, 0x26, 0x48, 0x98, 0x81, 0x2a, 0x47, 0x6d, 0xa9, 0x5a, 0x74, - 0xa1, 0x9e, 0xea, 0x17, 0x8d, 0xe8, 0xc2, 0x51, 0x5d, 0xf3, 0xe0, 0xc7, 0x71, 0x5e, 0x1b, 0x89, - 0x34, 0x5e, 0xe8, 0x4b, 0xb9, 0x48, 0x33, 0x4a, 0xce, 0xf9, 0x43, 0xd6, 0xf0, 0xb9, 0x9f, 0xea, - 0x56, 0x9f, 0xdf, 0x1c, 0x0d, 0x6b, 0x02, 0x21, 0x71, 0xea, 0x4d, 0xdc, 0xcd, 0x1b, 0x0e, 0x5f, - 0x8c, 0x83, 0xc9, 0xb0, 0xe6, 0x4f, 0x04, 0x5c, 0xe2, 0xa7, 0xa7, 0xc1, 0xd4, 0x27, 0xa6, 0x5f, - 0xab, 0xd5, 0xd5, 0xc1, 0x21, 0xe0, 0xc7, 0xfe, 0x94, 0x38, 0x70, 0x8d, 0xd4, 0xed, 0x1d, 0x38, - 0x2f, 0x08, 0x0e, 0x72, 0xb4, 0xf3, 0x05, 0x76, 0x16, 0xbe, 0x33, 0xec, 0xe4, 0xd7, 0x99, 0x05, - 0x43, 0xc1, 0x4b, 0xd6, 0x27, 0x4e, 0xbb, 0x71, 0xa2, 0x8d, 0xa9, 0xcf, 0x26, 0x93, 0x9a, 0xd3, - 0x84, 0xc6, 0x51, 0x07, 0x29, 0xbd, 0xf2, 0x68, 0x06, 0x6a, 0xa9, 0x1b, 0x70, 0xfb, 0xb7, 0x92, - 0x5b, 0x42, 0x30, 0x1a, 0x70, 0x18, 0xf3, 0x87, 0xfc, 0x9e, 0x3b, 0x97, 0xef, 0xab, 0x73, 0x71, - 0x11, 0x9b, 0x6b, 0xdf, 0x99, 0xf6, 0xb1, 0x27, 0xd5, 0x52, 0x41, 0x2d, 0xb2, 0x20, 0x36, 0x25, - 0xc4, 0xa0, 0xe6, 0x18, 0x0f, 0x3e, 0x40, 0xfb, 0x10, 0x7c, 0xe4, 0xab, 0xe5, 0xa8, 0x83, 0x5c, - 0xe3, 0xae, 0xde, 0xbb, 0x47, 0x3f, 0x4d, 0x36, 0x0a, 0xab, 0xbf, 0x03, 0xf4, 0x75, 0x60, 0xb5, - 0xa6, 0x91, 0x66, 0x5a, 0xab, 0xd7, 0xd7, 0x4c, 0x0a, 0x41, 0x75, 0xb6, 0xa8, 0x1b, 0x16, 0x08, - 0x6f, 0x38, 0xcc, 0xeb, 0x73, 0x75, 0x42, 0x3a, 0x4e, 0x0e, 0x38, 0x6b, 0xae, 0x78, 0x86, 0xe3, - 0xb0, 0x52, 0x0e, 0x31, 0x38, 0x61, 0x93, 0xef, 0x0d, 0xd9, 0x9e, 0xce, 0x64, 0x2c, 0x57, 0xef, - 0x29, 0x6a, 0x23, 0xbe, 0x29, 0xe4, 0x72, 0xf2, 0x52, 0x49, 0x87, 0x30, 0x83, 0xad, 0x1c, 0x60, - 0x5c, 0x7d, 0x29, 0x86, 0x84, 0x4a, 0x51, 0x35, 0xdf, 0x83, 0x19, 0x12, 0xe7, 0x10, 0x04, 0x6c, - 0x46, 0x1f, 0x02, 0xf8, 0x1f, 0x0d, 0x68, 0x6b, 0x8c, 0x52, 0x75, 0x1e, 0xb1, 0x43, 0x12, 0xa9, - 0xff, 0x34, 0xdd, 0x4a, 0x05, 0x23, 0x9a, 0x5f, 0xc6, 0x22, 0xdf, 0x87, 0x47, 0x60, 0xe0, 0x07, - 0x8d, 0xbb, 0x00, 0x4d, 0x76, 0x98, 0x1a, 0x8d, 0x0a, 0xfa, 0x7a, 0x8d, 0xe8, 0x5b, 0x32, 0x05, - 0xc8, 0xc2, 0x71, 0x68, 0x20, 0x3c, 0x8a, 0x11, 0x87, 0x69, 0x77, 0x99, 0xe8, 0x89, 0x89, 0xfb, - 0x49, 0x42, 0x3d, 0x73, 0xc5, 0xe9, 0x4a, 0x63, 0x8e, 0x5a, 0x91, 0x30, 0x84, 0xe6, 0x19, 0xcd, - 0xf3, 0x7b, 0xe2, 0xe6, 0xf5, 0x5b, 0x35, 0x98, 0xf8, 0x5e, 0xc6, 0xe3, 0x16, 0xbe, 0xf7, 0x54, - 0xe9, 0x0d, 0xd4, 0x93, 0xf9, 0x64, 0xd2, 0x53, 0x77, 0xc5, 0x6e, 0xdb, 0x97, 0xed, 0xdd, 0x72, - 0xff, 0x2a, 0xd2, 0x3f, 0xf4, 0xf8, 0x03, 0xcd, 0xc0, 0x6b, 0x3e, 0xea, 0x9c, 0x11, 0xbc, 0xae, - 0xdc, 0x6c, 0x28, 0x19, 0xf4, 0xb6, 0x26, 0x34, 0x67, 0x6e, 0x76, 0xdd, 0x08, 0x26, 0x40, 0xae, - 0x78, 0xf3, 0x25, 0x8e, 0x93, 0x17, 0x83, 0x46, 0x99, 0xaa, 0xe8, 0x19, 0x32, 0x2f, 0x99, 0x91, - 0xc8, 0xd2, 0x43, 0x13, 0x59, 0x0f, 0x4e, 0xb8, 0x11, 0x2c, 0xc2, 0x6d, 0x59, 0x84, 0x44, 0xac, - 0xa5, 0x85, 0x68, 0xe5, 0x50, 0xa1, 0x45, 0x57, 0xb9, 0x24, 0xa9, 0xb9, 0xaf, 0xa7, 0x44, 0x72, - 0x29, 0x4d, 0x4a, 0xc8, 0x63, 0x25, 0x34, 0x84, 0x84, 0x05, 0x46, 0x8c, 0xfa, 0xf5, 0x57, 0x15, - 0xaa, 0x27, 0xaa, 0x5d, 0x37, 0x7c, 0xcf, 0x11, 0x97, 0x55, 0xa7, 0x97, 0x31, 0xb5, 0x39, 0x2f, - 0x40, 0x30, 0xef, 0x7f, 0xc2, 0x3f, 0xcc, 0xc6, 0xbf, 0xc1, 0x3f, 0xa7, 0xcf, 0xb1, 0xea, 0x14, - 0x9c, 0x1c, 0x55, 0x40, 0x85, 0xda, 0x78, 0xe0, 0xc3, 0x5e, 0x6a, 0xe0, 0xf0, 0x80, 0xf3, 0x12, - 0xab, 0x3f, 0xfd, 0x89, 0xbe, 0x3d, 0x51, 0xf3, 0xe6, 0xc4, 0x0f, 0xcf, 0xd3, 0xb1, 0x6a, 0xa8, - 0x0e, 0x4d, 0x63, 0xa8, 0x5a, 0xf2, 0xbd, 0xa7, 0x82, 0xad, 0x2d, 0x99, 0x1e, 0xdd, 0x81, 0x5a, - 0xc0, 0x53, 0xd4, 0x26, 0x3e, 0x18, 0xd2, 0x0a, 0xfe, 0x1a, 0xfe, 0x60, 0x35, 0xea, 0x5f, 0xd7, - 0x7a, 0xec, 0xd4, 0xeb, 0x44, 0x37, 0x0e, 0x53, 0xcf, 0x9c, 0x56, 0x74, 0xaf, 0xc0, 0xa3, 0x69, - 0xc8, 0xcf, 0x3d, 0xd2, 0xac, 0x88, 0xbb, 0xd6, 0x66, 0x3c, 0x64, 0xcd, 0x4b, 0xa8, 0x8f, 0xb5, - 0x19, 0x86, 0xec, 0xd0, 0x3a, 0xa6, 0x45, 0x47, 0xe8, 0x27, 0xc5, 0xed, 0xdd, 0xa8, 0xe6, 0xb4, - 0x1c, 0xc6, 0xaf, 0xee, 0x42, 0x80, 0xde, 0xa3, 0x03, 0xa4, 0x29, 0x4d, 0x48, 0xa8, 0xa2, 0x2e, - 0x6d, 0x51, 0xb7, 0xa9, 0x0b, 0x59, 0x75, 0x6e, 0xb1, 0xb4, 0xcf, 0x54, 0x90, 0x10, 0x1a, 0xa7, - 0xb5, 0x78, 0x6b, 0x71, 0xb4, 0x0f, 0x42, 0x35, 0x42, 0x42, 0x44, 0x3d, 0xa3, 0xf3, 0x8f, 0xd9, - 0x5e, 0x84, 0x1c, 0xd1, 0x24, 0x06, 0x42, 0x5c, 0x27, 0x75, 0x5a, 0x12, 0x98, 0x60, 0xf7, 0x72, - 0x16, 0x33, 0x79, 0x3a, 0x66, 0x85, 0x09, 0xe5, 0x60, 0x32, 0xeb, 0xee, 0xf2, 0x2a, 0x3a, 0x43, - 0xe4, 0xbd, 0x6b, 0x09, 0x51, 0x57, 0x15, 0xe7, 0xd2, 0x1f, 0xf5, 0xe2, 0xd0, 0x9b, 0xa9, 0x3f, - 0x78, 0x31, 0x42, 0x72, 0x8c, 0x1a, 0x8d, 0x06, 0x33, 0x4e, 0x7f, 0x9a, 0xb4, 0x93, 0xe9, 0x5f, - 0x7c, 0xc1, 0x97, 0xf5, 0xbb, 0xa9, 0x57, 0xcc, 0xe2, 0xab, 0xa6, 0x74, 0xb6, 0x0e, 0x24, 0x23, - 0xa1, 0x46, 0xde, 0x04, 0x07, 0x7c, 0x1c, 0xe8, 0x96, 0x58, 0x18, 0xe1, 0x89, 0xb0, 0x88, 0xd5, - 0x94, 0x24, 0x90, 0x5a, 0x08, 0xa7, 0xf2, 0x5f, 0x7c, 0xa1, 0x6b, 0x18, 0xc7, 0x1a, 0x2e, 0xb8, - 0x94, 0x27, 0x9b, 0xec, 0x2d, 0x34, 0xee, 0xd2, 0x16, 0x8b, 0x53, 0x59, 0xab, 0x91, 0x30, 0xd2, - 0x77, 0xa2, 0xc0, 0xe1, 0x34, 0x6f, 0x90, 0x46, 0x24, 0x1d, 0x05, 0x8f, 0xb1, 0x0d, 0x48, 0x76, - 0xdd, 0x7e, 0x1a, 0x4a, 0x36, 0x9c, 0x83, 0xd5, 0x1d, 0xc9, 0x52, 0xea, 0x38, 0xf5, 0x85, 0xea, - 0xd1, 0xec, 0x7e, 0xb5, 0xa3, 0x59, 0xb1, 0x32, 0xb2, 0xd2, 0xac, 0xab, 0x99, 0xa5, 0xaf, 0x31, - 0x55, 0xc1, 0x30, 0xcc, 0x78, 0x35, 0xb7, 0x54, 0xd9, 0x28, 0x9a, 0xd9, 0xdd, 0x96, 0x07, 0x0a, - 0xe2, 0x50, 0xcf, 0xfe, 0x1e, 0xcd, 0x96, 0x7d, 0x06, 0xfc, 0x12, 0x8e, 0x6d, 0x49, 0xf3, 0xc0, - 0x36, 0xb4, 0xea, 0x5b, 0xd2, 0x6c, 0xb9, 0x94, 0x25, 0xaf, 0x2e, 0x8e, 0x04, 0x38, 0x22, 0x0a, - 0x00, 0x52, 0x93, 0x30, 0x46, 0x4b, 0x8b, 0x12, 0x87, 0x7b, 0x7c, 0xfa, 0xde, 0x65, 0x2f, 0x7e, - 0x9d, 0xf9, 0x19, 0xc5, 0x70, 0x27, 0x54, 0x53, 0x49, 0xa2, 0x13, 0x0c, 0x81, 0x4f, 0xfd, 0x01, - 0xc7, 0xb8, 0x51, 0x63, 0x6b, 0x0c, 0x23, 0x7d, 0x92, 0x0c, 0x2f, 0x21, 0x12, 0x32, 0x63, 0xbf, - 0xe9, 0x14, 0x3a, 0xaf, 0x2f, 0xa1, 0x35, 0x97, 0xd4, 0xf2, 0xa7, 0x3b, 0x12, 0x9e, 0x12, 0x5f, - 0xad, 0xc2, 0x91, 0x55, 0xba, 0x12, 0x49, 0x85, 0xef, 0xc5, 0x86, 0x72, 0xfc, 0xdd, 0x99, 0x79, - 0x01, 0x2f, 0x01, 0xd5, 0xe1, 0x2f, 0xad, 0xb8, 0x6c, 0x76, 0x64, 0xb6, 0x01, 0x8f, 0xbf, 0x60, - 0x89, 0x19, 0x98, 0x2b, 0xe7, 0x1e, 0x72, 0x7c, 0x99, 0xf6, 0x59, 0xba, 0x5f, 0x5c, 0x6d, 0x6b, - 0x20, 0x21, 0x39, 0xd6, 0x02, 0x28, 0x7b, 0x33, 0x22, 0x99, 0x9f, 0x8a, 0x9c, 0xf1, 0x89, 0x48, - 0xfd, 0x5e, 0x20, 0x39, 0xa1, 0xd6, 0x1a, 0x98, 0x5c, 0xa6, 0x04, 0x54, 0x90, 0x81, 0x5c, 0x4a, - 0xeb, 0x48, 0x1f, 0x65, 0x9c, 0xac, 0x1e, 0xe1, 0x97, 0x00, 0xc6, 0xc4, 0xde, 0xf9, 0x14, 0xd5, - 0xe0, 0x56, 0x31, 0xa8, 0x32, 0xf1, 0x9e, 0x8c, 0xa3, 0x2b, 0x9c, 0xf6, 0x84, 0xfe, 0x95, 0xaf, - 0x85, 0x79, 0x1a, 0x21, 0x28, 0xc8, 0xec, 0x7c, 0xd8, 0xb0, 0x84, 0xa4, 0x74, 0x54, 0x08, 0x67, - 0x72, 0xb4, 0xb3, 0x1c, 0xe9, 0x99, 0x46, 0xc4, 0x96, 0xda, 0x43, 0x9e, 0x81, 0x0c, 0xd5, 0xba, - 0xcd, 0x2a, 0x9a, 0x5b, 0xa0, 0xba, 0x72, 0x59, 0x7b, 0xd9, 0xdd, 0x15, 0x50, 0x92, 0xf6, 0xd7, - 0x21, 0x84, 0xfb, 0xeb, 0x94, 0x30, 0xe9, 0x9b, 0x10, 0xa1, 0x55, 0x35, 0xb9, 0x50, 0x5e, 0x33, - 0xed, 0x37, 0xf9, 0x7a, 0xdf, 0x6f, 0x4f, 0xdf, 0xbc, 0x96, 0xbc, 0x48, 0x39, 0x92, 0xbf, 0x28, - 0x22, 0xca, 0x42, 0xf4, 0xfa, 0x16, 0x1e, 0x46, 0xb1, 0x4a, 0xfa, 0x7e, 0x5f, 0x3c, 0x96, 0x0a, - 0xdb, 0x88, 0x54, 0xd9, 0xec, 0x26, 0x51, 0x4c, 0x9a, 0x93, 0xe7, 0xf6, 0x79, 0x8b, 0xec, 0x37, - 0x39, 0x55, 0x3a, 0x89, 0x39, 0x9e, 0xfc, 0xaa, 0xe7, 0x35, 0x48, 0x73, 0xa8, 0x09, 0x06, 0x47, - 0x1c, 0x4d, 0x28, 0x00, 0xac, 0xe1, 0x66, 0xf3, 0x12, 0xaf, 0x50, 0x23, 0xd3, 0xd8, 0xb1, 0x60, - 0x42, 0xbc, 0xb0, 0x31, 0x6b, 0x7d, 0x50, 0xca, 0xa9, 0xcc, 0xaa, 0xcb, 0xd9, 0x6c, 0x89, 0x3e, - 0x97, 0x16, 0xe5, 0x74, 0x60, 0x4b, 0x4b, 0xad, 0xaf, 0x1f, 0x47, 0x57, 0xc4, 0xd8, 0x90, 0x07, - 0x6c, 0x65, 0xee, 0x35, 0x35, 0x9c, 0x6c, 0x1e, 0xbe, 0xcc, 0xd2, 0xa2, 0xeb, 0x0c, 0x6b, 0x8b, - 0x80, 0x57, 0x03, 0xb1, 0x2e, 0x7c, 0xae, 0xbc, 0x18, 0x58, 0xf2, 0x97, 0x67, 0xe0, 0xa5, 0xf3, - 0x25, 0xfc, 0x0d, 0xa0, 0x10, 0x93, 0x12, 0xf3, 0xa1, 0xfd, 0xb1, 0x44, 0x49, 0x23, 0x36, 0x4a, - 0x2e, 0x2b, 0xde, 0xf9, 0xb8, 0x82, 0x17, 0x8d, 0xd8, 0x7c, 0x5d, 0x5f, 0x56, 0x77, 0x7b, 0xb1, - 0x29, 0xa1, 0x9c, 0xa7, 0x7c, 0xa0, 0xf2, 0x92, 0xa6, 0xbc, 0x66, 0x5e, 0xfd, 0x99, 0x3d, 0xa9, - 0x89, 0xca, 0xa3, 0xd7, 0x08, 0x97, 0xf3, 0x4f, 0x52, 0x44, 0xe7, 0xd4, 0x20, 0x90, 0x2e, 0x52, - 0x38, 0x37, 0x53, 0xd0, 0x62, 0x49, 0x85, 0x1d, 0x82, 0x6f, 0xea, 0x54, 0x77, 0x90, 0xd3, 0xb4, - 0xa2, 0x6d, 0x23, 0x5a, 0xeb, 0x27, 0x1c, 0xa8, 0x86, 0x33, 0xe9, 0x31, 0x89, 0xb3, 0x58, 0xa9, - 0x6b, 0x53, 0xe4, 0xb3, 0x0a, 0xc7, 0x66, 0xe5, 0xef, 0x8f, 0x8f, 0xe0, 0x69, 0x16, 0x85, 0x20, - 0x54, 0x41, 0x5d, 0x61, 0xfc, 0x77, 0x6b, 0x7a, 0x19, 0x4f, 0x2b, 0x7a, 0x49, 0xed, 0xca, 0x1c, - 0x56, 0x41, 0x24, 0xb6, 0x62, 0xdb, 0x34, 0xd2, 0xd8, 0xfa, 0x7a, 0x57, 0xe0, 0x79, 0xa5, 0xc5, - 0x7d, 0x1f, 0xae, 0xb7, 0x84, 0x63, 0x69, 0x81, 0x34, 0x61, 0x81, 0xb7, 0xb0, 0x01, 0xfb, 0xec, - 0xc2, 0x50, 0x78, 0x32, 0xaa, 0x2d, 0x8b, 0xb4, 0x8e, 0x68, 0xbd, 0x90, 0x41, 0xb8, 0x9e, 0x25, - 0xcd, 0x67, 0x7c, 0x32, 0xb7, 0x2f, 0x89, 0x2e, 0x6c, 0x6f, 0xf8, 0x55, 0x46, 0xa6, 0xaa, 0xfe, - 0xe7, 0x16, 0x04, 0xcd, 0x61, 0x75, 0xc6, 0x77, 0xea, 0x99, 0xfc, 0xd2, 0xc2, 0xb9, 0x7e, 0x80, - 0x74, 0x90, 0x71, 0xa1, 0xac, 0xb4, 0xc8, 0xe5, 0x3a, 0x31, 0x7c, 0x4e, 0x2a, 0x5a, 0x8e, 0x14, - 0xcb, 0x95, 0xad, 0x69, 0xd9, 0xb5, 0xb4, 0x35, 0xad, 0x58, 0x47, 0xb2, 0x0f, 0x90, 0x2e, 0xf9, - 0x31, 0xff, 0x42, 0xad, 0x21, 0x58, 0x16, 0xfe, 0xf9, 0x56, 0x75, 0x9d, 0x3c, 0x86, 0xa5, 0xe8, - 0x90, 0x3d, 0xf8, 0x9d, 0xba, 0x54, 0x6f, 0xce, 0xe6, 0xc9, 0xb8, 0x56, 0x51, 0x96, 0x37, 0x57, - 0xfe, 0x69, 0x73, 0xc7, 0x6a, 0xf0, 0x12, 0x5b, 0xbf, 0x14, 0xba, 0xbd, 0x88, 0x17, 0xaa, 0xd5, - 0xd7, 0x42, 0x37, 0x97, 0x89, 0x14, 0x1a, 0x28, 0x61, 0x3b, 0x2f, 0x74, 0x08, 0xbd, 0xd2, 0x6a, - 0xdc, 0xa1, 0x2f, 0x2c, 0x3c, 0x54, 0x95, 0x5e, 0x40, 0x29, 0x92, 0xdd, 0x71, 0x88, 0x1a, 0xea, - 0x6b, 0x31, 0xe3, 0x29, 0x55, 0x57, 0x35, 0x03, 0x22, 0x69, 0xfe, 0x14, 0x05, 0x61, 0xcd, 0x71, - 0x95, 0xc3, 0x2a, 0x73, 0x9d, 0x4d, 0x8a, 0xf6, 0x86, 0x58, 0xb6, 0x26, 0xd6, 0x78, 0x6e, 0x09, - 0xca, 0x4d, 0x2e, 0xa9, 0x00, 0x1a, 0xbf, 0xee, 0xf2, 0x6b, 0x06, 0x85, 0xb6, 0x0b, 0x60, 0x0a, - 0x26, 0x4d, 0xce, 0x3f, 0x1a, 0x3a, 0x4b, 0xb7, 0x56, 0xa3, 0x38, 0x7a, 0x49, 0x14, 0xea, 0x11, - 0x64, 0xa3, 0x25, 0x89, 0xf8, 0x4c, 0xbe, 0xac, 0xe8, 0xa6, 0xae, 0x4a, 0x78, 0xd5, 0xbf, 0xbe, - 0x60, 0x74, 0x13, 0xef, 0x71, 0xca, 0x2f, 0xb5, 0x1b, 0x01, 0xc6, 0x44, 0x52, 0x3d, 0xa3, 0x46, - 0x7f, 0xce, 0x10, 0x12, 0x46, 0xce, 0x9a, 0xb1, 0x8c, 0x46, 0x4e, 0x6f, 0x15, 0x43, 0x59, 0xe8, - 0x60, 0x99, 0x33, 0xaf, 0x86, 0x0a, 0x98, 0x77, 0x4a, 0xdb, 0xcc, 0xf4, 0x72, 0xd3, 0x26, 0xb3, - 0x9c, 0x4b, 0x2c, 0x31, 0x97, 0x89, 0x65, 0x48, 0x0c, 0x43, 0x6c, 0xaa, 0xba, 0xf2, 0x2d, 0x83, - 0x15, 0x73, 0x1a, 0x43, 0x4f, 0x62, 0xbe, 0x22, 0x75, 0x4e, 0x15, 0x15, 0x7d, 0x98, 0x6d, 0x06, - 0x63, 0xe2, 0x2a, 0x7e, 0x12, 0x3a, 0xe9, 0x06, 0xed, 0x38, 0x3a, 0x95, 0x94, 0x97, 0x66, 0xfe, - 0xc9, 0xb9, 0x43, 0xaf, 0xf6, 0xae, 0xaa, 0x37, 0x15, 0x22, 0x2f, 0xc0, 0xd1, 0xc4, 0x53, 0x6f, - 0x5b, 0x59, 0xce, 0xfe, 0x00, 0x52, 0xba, 0x0d, 0x86, 0x54, 0xac, 0xcb, 0x20, 0x09, 0xd8, 0xad, - 0x36, 0xd2, 0xcb, 0xb5, 0x25, 0xab, 0x31, 0x05, 0xcb, 0x97, 0x10, 0xec, 0x3f, 0xb7, 0xca, 0x86, - 0x95, 0x4a, 0xb3, 0xd8, 0x3a, 0xd3, 0xca, 0xbf, 0xb3, 0x55, 0xa5, 0x60, 0x26, 0xf9, 0x1d, 0x34, - 0xb5, 0xff, 0x30, 0xfa, 0xd5, 0x7f, 0x6d, 0x4d, 0xff, 0xb5, 0x35, 0xfd, 0xd7, 0xd6, 0xf4, 0x1f, - 0x6b, 0x6b, 0x2a, 0x6e, 0x26, 0x77, 0x95, 0xb6, 0x6a, 0x93, 0x9b, 0x3b, 0xb7, 0x8f, 0xff, 0x94, - 0x71, 0xcc, 0x25, 0xac, 0x0e, 0xa6, 0x48, 0xeb, 0x5c, 0x47, 0xd5, 0x6e, 0x55, 0x74, 0xa1, 0x2f, - 0x3f, 0x53, 0x2c, 0xee, 0x76, 0x6f, 0x95, 0xde, 0x9c, 0xba, 0xd9, 0x36, 0xa5, 0xee, 0xee, 0x84, - 0x34, 0x89, 0x28, 0x7f, 0x62, 0xd6, 0xb7, 0xb0, 0xb3, 0x89, 0x1d, 0xce, 0x1f, 0xd2, 0x02, 0xb1, - 0xcf, 0x23, 0x17, 0x0c, 0xea, 0x2e, 0xfc, 0x63, 0xeb, 0x72, 0x5c, 0xc0, 0xb3, 0x26, 0x80, 0x08, - 0x6c, 0x26, 0x7a, 0xff, 0x54, 0x25, 0x77, 0x8b, 0x87, 0xbc, 0x48, 0xdf, 0x4e, 0xbe, 0x6d, 0x2e, - 0x41, 0x0b, 0x92, 0x89, 0xdf, 0x1f, 0x2b, 0x30, 0xb1, 0xfe, 0x5e, 0x48, 0xe1, 0x80, 0xfe, 0xdf, - 0x0f, 0x29, 0xd1, 0xec, 0x9e, 0x38, 0xd1, 0x0a, 0x18, 0xab, 0x5f, 0xfa, 0x08, 0xe9, 0x0b, 0x16, - 0x1c, 0xe2, 0x69, 0xcd, 0xd1, 0x37, 0x84, 0x65, 0x0b, 0x91, 0x28, 0xf7, 0xa9, 0x53, 0x37, 0x07, - 0x4a, 0xbd, 0xfb, 0x21, 0x72, 0xe1, 0x72, 0xb2, 0x25, 0x5a, 0x25, 0x77, 0xe1, 0xb3, 0xe2, 0x5b, - 0x1a, 0x1d, 0x66, 0xfd, 0x47, 0x7a, 0xce, 0x8a, 0xb3, 0xc0, 0x07, 0xa3, 0x57, 0xe0, 0x56, 0x22, - 0x38, 0x3f, 0xc0, 0xfb, 0x7a, 0xe2, 0xb1, 0x55, 0x3a, 0x24, 0x89, 0x8a, 0x13, 0xf7, 0xb2, 0x30, - 0x16, 0x84, 0xb0, 0x52, 0x47, 0x6c, 0xae, 0x17, 0x3f, 0xe5, 0xaa, 0x93, 0xbd, 0x91, 0xd4, 0x95, - 0xcc, 0xe4, 0xb5, 0xa8, 0xff, 0x93, 0x2b, 0xe7, 0xb6, 0xd7, 0x07, 0x8e, 0x63, 0x3b, 0x25, 0x40, - 0x66, 0xd3, 0x79, 0xcb, 0x6d, 0x1b, 0xd4, 0x87, 0x0b, 0xf7, 0xf2, 0x23, 0xec, 0x50, 0xef, 0x38, - 0x5e, 0xaf, 0x89, 0x43, 0x63, 0x9c, 0xdc, 0x12, 0xa0, 0x7a, 0xbd, 0x70, 0x06, 0x7f, 0xe1, 0x73, - 0xf8, 0x07, 0xc3, 0xc6, 0xa1, 0x18, 0xff, 0xd8, 0x72, 0x9a, 0xce, 0xd6, 0x05, 0x31, 0xa8, 0x0b, - 0x7d, 0xf0, 0x4e, 0x88, 0xbd, 0x04, 0x32, 0xf4, 0xbe, 0x73, 0x29, 0x9b, 0x8c, 0x04, 0x03, 0x32, - 0xdf, 0xfb, 0xe2, 0x19, 0xae, 0xa7, 0x69, 0x06, 0x09, 0xff, 0xad, 0x5d, 0x66, 0xad, 0x28, 0xd3, - 0x05, 0x62, 0x6c, 0xc1, 0x79, 0x88, 0x9b, 0x60, 0xdd, 0xd2, 0xe8, 0x2e, 0x5d, 0xf4, 0x42, 0x1f, - 0x0c, 0x5b, 0x3c, 0x5b, 0xd7, 0xa7, 0x1a, 0x1f, 0xe8, 0x3b, 0x44, 0xbe, 0x4b, 0x53, 0x64, 0x63, - 0x43, 0xff, 0xa3, 0x0f, 0xf5, 0xa8, 0x4c, 0xd9, 0x8f, 0x01, 0xde, 0x3e, 0xf1, 0x14, 0x91, 0x69, - 0x72, 0xcd, 0x0c, 0xe7, 0x6d, 0xaa, 0x44, 0x35, 0x3e, 0xc3, 0x5f, 0xad, 0x46, 0xad, 0xb8, 0xb8, - 0xb9, 0x58, 0xfa, 0x4e, 0x63, 0x66, 0xe4, 0x60, 0xa4, 0xb6, 0xcf, 0x62, 0x7e, 0x9a, 0xca, 0x8f, - 0xe6, 0x38, 0x9b, 0x3d, 0xc4, 0xb9, 0xa3, 0x79, 0x01, 0x9f, 0xb6, 0xe1, 0xac, 0x40, 0xc1, 0xb5, - 0xb6, 0x39, 0xf6, 0x92, 0x1a, 0x8f, 0x3a, 0x2b, 0x3c, 0x8c, 0xe6, 0x24, 0x3c, 0x67, 0xc5, 0x0d, - 0xaa, 0x91, 0xfa, 0x19, 0x5d, 0xe8, 0x47, 0xd1, 0xc4, 0xf7, 0x42, 0xab, 0x79, 0xbc, 0x59, 0x5a, - 0xdc, 0x48, 0x18, 0xb7, 0xd9, 0x04, 0x4a, 0xb8, 0x3c, 0x4d, 0x11, 0xce, 0xa5, 0xcf, 0xfd, 0xb8, - 0x86, 0x91, 0xe6, 0xd0, 0xe0, 0x77, 0xae, 0xd1, 0x5b, 0xd5, 0x23, 0x1b, 0xdb, 0xc4, 0x5d, 0x60, - 0xa3, 0x72, 0x4a, 0xee, 0x33, 0x1c, 0x09, 0xf5, 0x2c, 0x4d, 0x63, 0x19, 0x99, 0x45, 0xa5, 0x1e, - 0x5e, 0xd2, 0xfc, 0xd9, 0xfe, 0xd3, 0x32, 0xa7, 0xfa, 0x2c, 0x30, 0x87, 0x5d, 0x22, 0x58, 0xae, - 0x29, 0xf2, 0x76, 0x73, 0xea, 0xcd, 0x6a, 0xb5, 0x0f, 0x58, 0xc6, 0xae, 0xdc, 0x2f, 0xfd, 0x91, - 0x25, 0xf2, 0x1f, 0xd5, 0x1f, 0x6e, 0xf1, 0xf2, 0xee, 0x60, 0xf3, 0x0f, 0xb7, 0xfc, 0xfe, 0x6e, - 0xf3, 0x47, 0x5d, 0x45, 0x84, 0x10, 0x67, 0xc1, 0xc9, 0xe5, 0x98, 0x9d, 0x1a, 0x94, 0x71, 0x3c, - 0xe1, 0x40, 0x98, 0x25, 0x27, 0xec, 0x28, 0xa8, 0x93, 0x8a, 0xb3, 0x62, 0x92, 0x0d, 0x8a, 0xeb, - 0xac, 0x90, 0x88, 0x0d, 0x70, 0xbe, 0x64, 0x4a, 0x7b, 0x7c, 0xe0, 0xe7, 0x82, 0xe5, 0xa9, 0xb0, - 0x72, 0x13, 0x7f, 0x80, 0x75, 0x6b, 0xbc, 0xa1, 0x8b, 0x8b, 0x15, 0x77, 0x2c, 0xdc, 0xc7, 0x07, - 0x49, 0xa1, 0x64, 0x51, 0x98, 0x48, 0x74, 0xb4, 0xd4, 0x80, 0xd4, 0x2d, 0x6f, 0x96, 0x10, 0xd7, - 0xb2, 0x4a, 0xda, 0x3d, 0xfa, 0xd1, 0xbe, 0xc9, 0x41, 0xd7, 0x32, 0xd7, 0xaf, 0xe4, 0x17, 0x6a, - 0x20, 0x77, 0x1b, 0x89, 0xdb, 0xb8, 0x4b, 0x56, 0xb7, 0x5f, 0xe1, 0x9a, 0x93, 0xb7, 0x55, 0x37, - 0x97, 0xca, 0xf0, 0x7d, 0x42, 0x87, 0x7f, 0xb8, 0x45, 0x2e, 0x09, 0x76, 0x53, 0xbb, 0xe3, 0x8b, - 0x7f, 0x9e, 0x24, 0x48, 0xca, 0x59, 0x6a, 0x74, 0x30, 0xf6, 0x2f, 0xe3, 0x28, 0xdc, 0x3c, 0x24, - 0x69, 0x70, 0xef, 0xf9, 0x8b, 0x27, 0x2d, 0x14, 0xd2, 0x37, 0x65, 0x54, 0x75, 0x12, 0xd7, 0x52, - 0x98, 0x9b, 0x8b, 0x7e, 0xec, 0xd9, 0x78, 0xe3, 0x7b, 0x2c, 0x0e, 0x78, 0xa8, 0x65, 0xb3, 0xa4, - 0x5d, 0x39, 0xc3, 0x1e, 0x94, 0x11, 0xea, 0xa0, 0x71, 0x28, 0xc9, 0x5c, 0x23, 0x4b, 0x8a, 0xdd, - 0x44, 0x32, 0x72, 0xad, 0x99, 0x0f, 0xa9, 0xc1, 0xea, 0x6f, 0x61, 0x46, 0x98, 0xef, 0x38, 0x85, - 0xef, 0x4b, 0xe7, 0x81, 0xcb, 0x36, 0x38, 0x58, 0x74, 0xf3, 0x90, 0x9b, 0x35, 0x7d, 0x52, 0x05, - 0xd4, 0xf5, 0xbd, 0x21, 0xe2, 0x65, 0xf1, 0x6f, 0x03, 0xc5, 0x36, 0x0f, 0x5f, 0x1f, 0xfd, 0xf0, - 0xaa, 0x80, 0xb9, 0x4c, 0xdc, 0x64, 0xf8, 0xa5, 0xbb, 0x85, 0x46, 0x13, 0xff, 0xba, 0x77, 0xee, - 0xcd, 0xe4, 0x4e, 0xaf, 0x9e, 0x37, 0x21, 0x96, 0xdd, 0x08, 0x52, 0x7f, 0x9a, 0x74, 0x25, 0x11, - 0xd1, 0xe6, 0xa1, 0x65, 0xa0, 0x95, 0xa6, 0x71, 0x65, 0x07, 0xf5, 0x46, 0xda, 0x2b, 0x5c, 0x15, - 0x35, 0xf2, 0xa6, 0xc1, 0xe4, 0xa6, 0x8b, 0xac, 0x36, 0x9c, 0x01, 0xcb, 0xba, 0xcb, 0x83, 0x3b, - 0x64, 0x83, 0x5a, 0x79, 0x11, 0x8d, 0x06, 0xaa, 0xaf, 0xd9, 0x42, 0xfe, 0xe2, 0x2e, 0x02, 0x49, - 0x2c, 0x7a, 0x34, 0xa1, 0xf9, 0xe2, 0x65, 0x7b, 0x1a, 0x07, 0x53, 0x5c, 0xf1, 0xa2, 0x98, 0xc4, - 0x0e, 0x36, 0xbf, 0xad, 0xca, 0x1b, 0xc1, 0x69, 0x53, 0xd1, 0x22, 0x01, 0xe8, 0x2a, 0x24, 0xea, - 0x53, 0xde, 0x25, 0x7d, 0xc5, 0x55, 0x78, 0xff, 0xad, 0xd3, 0xdc, 0x49, 0xb0, 0x0e, 0x71, 0xd4, - 0x30, 0x81, 0x0f, 0xd6, 0x84, 0xb3, 0x5c, 0xe5, 0xee, 0xab, 0x2d, 0xdb, 0x67, 0xd5, 0x64, 0x4f, - 0x72, 0x95, 0x4e, 0x1b, 0xcd, 0x21, 0xe0, 0x53, 0xed, 0x86, 0x25, 0xe1, 0xe7, 0xcd, 0xcd, 0xc3, - 0x17, 0x3a, 0x7d, 0x8e, 0x64, 0x3f, 0x00, 0x80, 0xa4, 0x7c, 0xa3, 0x8d, 0xb9, 0x77, 0xe6, 0xc7, - 0xec, 0x14, 0x99, 0xe8, 0xb2, 0x60, 0x06, 0x07, 0x9a, 0x33, 0xed, 0x7c, 0xa3, 0x78, 0xf4, 0x84, - 0xfd, 0x0a, 0x6a, 0x21, 0xd1, 0x2e, 0x3c, 0x3e, 0xf3, 0x3d, 0x18, 0x32, 0x1d, 0xef, 0x66, 0xb8, - 0xb5, 0x21, 0xbf, 0xf2, 0x84, 0xd8, 0x3f, 0x7c, 0xdf, 0x82, 0x10, 0x67, 0x5f, 0x05, 0xd2, 0xe6, - 0x7d, 0xc4, 0x2e, 0xca, 0xec, 0xba, 0x54, 0x68, 0xca, 0xc2, 0x87, 0x7d, 0x57, 0x0a, 0x97, 0x7a, - 0x0a, 0xaf, 0x6a, 0x4f, 0x27, 0xf3, 0x84, 0xb4, 0xa4, 0x51, 0x70, 0x66, 0x12, 0x86, 0x3b, 0x25, - 0x38, 0x23, 0x3e, 0x22, 0x59, 0xdc, 0x86, 0x4b, 0xc5, 0xe2, 0xe8, 0xea, 0x9e, 0xdc, 0x4f, 0xa1, - 0x6c, 0xf5, 0x6a, 0xb3, 0xbe, 0x63, 0x79, 0xeb, 0x0f, 0x0d, 0x12, 0x77, 0xfc, 0x9b, 0x52, 0x7b, - 0x12, 0x9b, 0x7d, 0xa0, 0x32, 0x29, 0x60, 0x8d, 0xc7, 0x7d, 0x36, 0x85, 0xa4, 0xf0, 0x3d, 0x43, - 0x09, 0xf5, 0xfd, 0xdb, 0xa3, 0x7f, 0xce, 0x32, 0x5c, 0x26, 0xc5, 0x42, 0x5d, 0xc0, 0x6d, 0xd2, - 0xb2, 0x0b, 0xa8, 0xf3, 0x4d, 0x52, 0x33, 0x66, 0x50, 0x4d, 0x9a, 0xb1, 0xcf, 0x37, 0x01, 0xd6, - 0x5a, 0x67, 0xad, 0x73, 0xd7, 0x51, 0x4e, 0x19, 0x09, 0xbc, 0xb6, 0x39, 0x86, 0x1d, 0x9e, 0x2b, - 0x98, 0x00, 0xf4, 0x8c, 0x73, 0xe3, 0xa1, 0xdd, 0x7c, 0xe9, 0xb3, 0x7e, 0x29, 0x8f, 0x26, 0x60, - 0xb2, 0x0a, 0xd4, 0x29, 0x6e, 0x78, 0xac, 0x82, 0x04, 0xc6, 0xc1, 0x30, 0x8e, 0x5f, 0x9d, 0x9c, - 0x3e, 0x3b, 0x3e, 0xcd, 0x6b, 0xb3, 0x4b, 0x18, 0x47, 0x3d, 0x67, 0xfb, 0x97, 0xa6, 0xb1, 0x51, - 0x9a, 0xcb, 0x2a, 0x4e, 0x4e, 0x7d, 0x2a, 0x2b, 0xfe, 0x63, 0xf1, 0xe6, 0x34, 0xd9, 0x28, 0x88, - 0x67, 0xdb, 0x77, 0xa0, 0x11, 0xdb, 0x1f, 0x5c, 0xf4, 0xa3, 0xeb, 0x4d, 0x05, 0xb5, 0xbc, 0x41, - 0x58, 0xc2, 0xc6, 0x4e, 0x7f, 0xee, 0x36, 0x15, 0x6f, 0xf0, 0x4f, 0x1d, 0x2e, 0xc2, 0x21, 0xb6, - 0xce, 0x9d, 0x75, 0x13, 0x1a, 0x4f, 0xa5, 0xdc, 0x68, 0x43, 0xfb, 0xaf, 0xd4, 0x71, 0x5c, 0xde, - 0xaa, 0x74, 0x0d, 0x5c, 0x8f, 0x66, 0xf3, 0x4b, 0xe9, 0x40, 0x83, 0x13, 0x25, 0x63, 0xeb, 0xd0, - 0x7c, 0x52, 0x2e, 0x50, 0xfb, 0x31, 0x1b, 0x9a, 0x16, 0x49, 0xad, 0x11, 0xb2, 0x64, 0x67, 0x8f, - 0xd0, 0x22, 0x19, 0xcc, 0x0c, 0x88, 0x98, 0x0a, 0x16, 0xa2, 0x86, 0x20, 0x27, 0x1b, 0x47, 0x41, - 0xbc, 0x78, 0xcd, 0x85, 0xeb, 0x84, 0xec, 0xc5, 0xb7, 0xf0, 0x88, 0x83, 0x6f, 0x63, 0x09, 0x7e, - 0x34, 0x63, 0x53, 0x56, 0x2e, 0x6b, 0xb2, 0x50, 0x14, 0x95, 0x0f, 0xfc, 0x74, 0x67, 0xfa, 0xbc, - 0x86, 0x19, 0xde, 0x53, 0xf9, 0xf3, 0x21, 0xfa, 0xf8, 0xeb, 0xaf, 0x51, 0x37, 0xb2, 0x8f, 0xd9, - 0xb4, 0xe0, 0xf5, 0xe3, 0x13, 0x7d, 0x1d, 0x11, 0x8b, 0x50, 0x40, 0x79, 0xc4, 0x08, 0x8f, 0x68, - 0x18, 0xfa, 0x4c, 0x12, 0x6b, 0xf2, 0xa9, 0x23, 0x49, 0x13, 0x34, 0xf6, 0x69, 0x2b, 0xa7, 0x66, - 0x68, 0x13, 0x97, 0xca, 0x39, 0xdf, 0x82, 0xf3, 0xad, 0x25, 0x7e, 0x15, 0x7b, 0x36, 0x88, 0x7c, - 0x24, 0x51, 0x3f, 0x50, 0x4b, 0xa4, 0x56, 0xd0, 0x1f, 0x09, 0x17, 0x89, 0x4f, 0xa2, 0x2a, 0x5f, - 0x6b, 0xd7, 0xe4, 0x4e, 0x89, 0xcd, 0x24, 0x7f, 0xce, 0x69, 0xcf, 0xa6, 0x30, 0x7d, 0xc5, 0xe2, - 0x22, 0xf1, 0xac, 0x23, 0x94, 0x3f, 0xdc, 0x4a, 0xbf, 0xee, 0x88, 0x4a, 0x68, 0xdc, 0x84, 0x6a, - 0x1a, 0x97, 0x40, 0x5b, 0x49, 0x0b, 0x5a, 0x4c, 0x5e, 0xa4, 0x06, 0x23, 0xf6, 0x96, 0x04, 0x63, - 0xe6, 0x89, 0x9c, 0x54, 0x93, 0x36, 0xce, 0xf0, 0x66, 0xd3, 0x32, 0x01, 0xe5, 0xa3, 0xb0, 0x57, - 0x84, 0x60, 0x85, 0xc6, 0xc1, 0x00, 0xef, 0x2a, 0x86, 0x96, 0xcd, 0x19, 0xfd, 0xb8, 0xc7, 0x48, - 0x19, 0xb7, 0x5f, 0x23, 0x49, 0xbc, 0x8d, 0x5d, 0x1a, 0xf6, 0xaa, 0x61, 0x42, 0x41, 0xa8, 0x5e, - 0xd3, 0x95, 0x7d, 0x2d, 0x0d, 0xfa, 0x73, 0xf5, 0xba, 0x44, 0x11, 0x55, 0x7d, 0x5e, 0xdb, 0x47, - 0xb9, 0x85, 0xf5, 0x37, 0xf7, 0xc7, 0xea, 0x46, 0xa1, 0x17, 0xe6, 0x47, 0xab, 0xa5, 0xbe, 0x89, - 0x7d, 0xce, 0x4e, 0xa4, 0x6a, 0x43, 0xc9, 0x37, 0x3b, 0x26, 0x45, 0x12, 0x39, 0x4b, 0x6e, 0x8c, - 0x56, 0xca, 0x39, 0x73, 0x39, 0x4b, 0x3d, 0x2d, 0x44, 0x64, 0x77, 0x40, 0xa2, 0x94, 0x64, 0x3e, - 0xc3, 0x4f, 0x7f, 0x88, 0x5c, 0x36, 0x39, 0x34, 0x8e, 0x65, 0xd6, 0xa1, 0x81, 0x5f, 0xcf, 0x92, - 0x3c, 0x73, 0xa8, 0xab, 0x8f, 0x78, 0x48, 0xa9, 0xe4, 0x54, 0xf6, 0x59, 0xca, 0xd1, 0x67, 0x7f, - 0x79, 0x4e, 0x9b, 0x78, 0x34, 0x6b, 0xaa, 0x7f, 0xf2, 0x7d, 0xc9, 0xc7, 0x98, 0x83, 0xd3, 0x97, - 0xe0, 0x64, 0xc7, 0x36, 0x72, 0xf5, 0x2a, 0xa7, 0x85, 0x9c, 0x78, 0x21, 0x72, 0x3c, 0xdd, 0xa8, - 0x94, 0x38, 0x79, 0x8a, 0x1b, 0x7b, 0x70, 0x65, 0x70, 0x82, 0x94, 0x15, 0xdf, 0xfe, 0x45, 0xf2, - 0xe2, 0xe1, 0x86, 0xaa, 0x38, 0x07, 0x86, 0x3d, 0x06, 0x89, 0xa3, 0x74, 0x16, 0x4d, 0x51, 0x9f, - 0x38, 0xac, 0xb9, 0x59, 0xd8, 0x74, 0xec, 0xc1, 0x55, 0xc8, 0x0e, 0xec, 0x37, 0x5a, 0x7e, 0xd9, - 0xb4, 0xaa, 0x1c, 0x64, 0x7e, 0x3d, 0xf9, 0xb6, 0x63, 0xc1, 0xac, 0xdf, 0x66, 0x73, 0xce, 0x7f, - 0xf3, 0xfd, 0xf4, 0x49, 0x8d, 0x5f, 0xfc, 0x2a, 0x0b, 0xba, 0xfe, 0xb7, 0x7e, 0xcb, 0x55, 0xce, - 0x93, 0x3f, 0x74, 0xb2, 0x94, 0xb9, 0x0e, 0xdb, 0x81, 0xac, 0x3d, 0x0e, 0xe3, 0x26, 0x4e, 0x6e, - 0x2e, 0x55, 0xe3, 0xae, 0xfc, 0xfa, 0xab, 0x63, 0x6d, 0xc9, 0xa5, 0xb6, 0x75, 0x0d, 0x07, 0xd7, - 0xbd, 0x48, 0x32, 0x4c, 0xce, 0xff, 0xc0, 0x99, 0x25, 0x82, 0xc4, 0xcc, 0x73, 0x93, 0xad, 0x51, - 0x54, 0x74, 0x29, 0x98, 0xa2, 0xf0, 0xb2, 0x75, 0xc0, 0xbe, 0x65, 0x90, 0x52, 0x42, 0xaf, 0x24, - 0xc1, 0xdc, 0x47, 0x5f, 0x30, 0x42, 0xf0, 0x1f, 0x6e, 0xa9, 0xcd, 0x1c, 0x1f, 0x9b, 0x90, 0x2f, - 0xfe, 0xf4, 0xf3, 0x3c, 0x4a, 0x7b, 0x4e, 0xfd, 0x0e, 0x1c, 0x8f, 0x8b, 0xdf, 0x55, 0x29, 0x14, - 0x7f, 0xb8, 0xcd, 0xc5, 0x0e, 0x2e, 0x9a, 0x89, 0x0e, 0x77, 0x7a, 0xcf, 0xfc, 0xc3, 0xad, 0x35, - 0x82, 0xa7, 0xce, 0x72, 0xad, 0x24, 0xf4, 0x36, 0x0f, 0xdf, 0xb6, 0x9e, 0xe9, 0x6a, 0xbc, 0x87, - 0xe4, 0x1a, 0xdd, 0xa1, 0x66, 0x1b, 0x77, 0x45, 0x25, 0xae, 0x42, 0x0a, 0xa6, 0xd1, 0xd7, 0x6d, - 0x63, 0x90, 0x56, 0xad, 0xed, 0x22, 0x04, 0xa1, 0x9e, 0x9b, 0x2e, 0x88, 0x44, 0x5f, 0x62, 0xc1, - 0x73, 0xbe, 0xda, 0x90, 0x48, 0x38, 0x49, 0xba, 0x5a, 0xbb, 0xe7, 0xe5, 0x98, 0x11, 0x5d, 0xbe, - 0x32, 0x3d, 0xdc, 0x03, 0x18, 0xc3, 0x0c, 0xa1, 0x7e, 0x9c, 0x07, 0x3f, 0x66, 0xa9, 0xcf, 0x05, - 0x1a, 0xee, 0xb0, 0xd3, 0xeb, 0x0d, 0xa7, 0x08, 0xc1, 0x20, 0x8f, 0x60, 0x86, 0xa0, 0x2a, 0x89, - 0x07, 0xb4, 0xdd, 0x28, 0xbb, 0x18, 0x03, 0xa7, 0xaa, 0xdf, 0xc4, 0xd1, 0x7c, 0xc6, 0xd9, 0x2c, - 0x05, 0xd0, 0x3c, 0x68, 0x22, 0xa3, 0xf9, 0x4c, 0x2c, 0x83, 0x5a, 0x67, 0x96, 0x73, 0x54, 0x9d, - 0xa9, 0x84, 0x2a, 0x9d, 0x8e, 0xfd, 0x44, 0x5b, 0xb2, 0x12, 0x35, 0xf5, 0x6e, 0x90, 0x3e, 0x46, - 0x9f, 0xdd, 0x4a, 0x26, 0x78, 0x52, 0x35, 0x04, 0x9c, 0xd7, 0x67, 0x8f, 0xd9, 0xc2, 0x75, 0x71, - 0x62, 0x7a, 0xcc, 0x53, 0x33, 0xf1, 0xf5, 0xd2, 0xec, 0x5b, 0x3b, 0x19, 0x35, 0x74, 0xbe, 0x17, - 0x24, 0x97, 0xcd, 0x83, 0x4a, 0x36, 0xf4, 0xa2, 0x46, 0x34, 0x07, 0x20, 0x59, 0x9a, 0x00, 0xf5, - 0xe6, 0xd9, 0x50, 0x92, 0x5f, 0x98, 0xa4, 0x45, 0xf3, 0x89, 0xb1, 0xb2, 0x49, 0xd2, 0x15, 0xc2, - 0x09, 0xf4, 0x3c, 0x49, 0x51, 0x87, 0x4b, 0x8e, 0xc1, 0x03, 0x6e, 0x0b, 0x4e, 0xe5, 0x40, 0x3c, - 0xb3, 0x00, 0xeb, 0x16, 0xc3, 0xa2, 0x32, 0x93, 0x14, 0xec, 0x20, 0xb6, 0x96, 0xc3, 0x3a, 0x8e, - 0x68, 0x38, 0x19, 0x24, 0x0e, 0xaf, 0xb9, 0x28, 0xf8, 0x43, 0x33, 0x56, 0xcd, 0xf5, 0x8d, 0x45, - 0xd8, 0x1f, 0x58, 0xc7, 0xa0, 0x39, 0xaf, 0x32, 0x92, 0xda, 0xfc, 0xa7, 0x6e, 0x1f, 0x50, 0x7e, - 0x01, 0xdf, 0x4d, 0xda, 0xbc, 0xf1, 0xb7, 0x39, 0x0f, 0x6c, 0xe5, 0x29, 0x2b, 0x03, 0xa1, 0x3e, - 0x20, 0xad, 0x94, 0x54, 0xf3, 0xa4, 0xe6, 0x9c, 0x39, 0xb6, 0x8a, 0x65, 0x7b, 0x64, 0x11, 0x76, - 0x93, 0x0b, 0x62, 0x17, 0x49, 0xe8, 0x5d, 0xf8, 0x67, 0xcc, 0x5b, 0x87, 0x44, 0x03, 0x54, 0x3d, - 0x87, 0x95, 0x8d, 0x2d, 0x37, 0x16, 0x2e, 0x83, 0x65, 0xf2, 0x0d, 0x07, 0xb8, 0xea, 0x45, 0xd3, - 0xa3, 0x26, 0x9f, 0x9c, 0x47, 0xbf, 0x7d, 0x77, 0xfa, 0xaa, 0x5b, 0xe0, 0xc0, 0x9a, 0xa0, 0x90, - 0x1f, 0x88, 0x3e, 0x72, 0x8f, 0x40, 0x9a, 0xf0, 0x88, 0x96, 0x84, 0xf5, 0xb8, 0xee, 0xc9, 0xdc, - 0x2e, 0x42, 0x20, 0xb1, 0x6c, 0x72, 0x78, 0xd9, 0xf5, 0x7a, 0x37, 0x66, 0x25, 0x9d, 0xd3, 0x7e, - 0xe7, 0x0f, 0x1b, 0xb2, 0xe3, 0x69, 0xbe, 0x5a, 0x5f, 0xb5, 0xb1, 0xb8, 0xa5, 0xdd, 0x0d, 0x6d, - 0x9d, 0x14, 0xee, 0x37, 0x91, 0xb5, 0x91, 0x27, 0xc9, 0x86, 0x7f, 0x03, 0xa9, 0x26, 0x72, 0xd1, - 0x03, 0xad, 0x27, 0x6c, 0xb1, 0x6e, 0xb6, 0xb7, 0x16, 0x37, 0x9b, 0x73, 0xd9, 0x62, 0x9a, 0xd9, - 0x12, 0x83, 0xe4, 0xf5, 0x86, 0xe9, 0x35, 0x13, 0xba, 0x6a, 0x42, 0x26, 0x1f, 0x38, 0x52, 0x23, - 0xff, 0x4d, 0x25, 0x3f, 0x7c, 0xac, 0xcb, 0xe1, 0x68, 0x4e, 0x2d, 0x85, 0x63, 0x71, 0x8b, 0x9c, - 0xb8, 0x9e, 0xab, 0x34, 0x05, 0x55, 0x11, 0x95, 0x40, 0xce, 0xc9, 0x89, 0x06, 0x7c, 0x34, 0xca, - 0xd7, 0x7e, 0xc8, 0xa7, 0xc9, 0x8c, 0xa3, 0x40, 0xae, 0xd0, 0x32, 0x06, 0x3b, 0x61, 0x24, 0x9b, - 0x47, 0x27, 0xef, 0x37, 0x5d, 0xb5, 0xc9, 0x71, 0xf6, 0x9b, 0x75, 0x57, 0x09, 0xa7, 0xcb, 0x81, - 0x31, 0xf3, 0x60, 0x9e, 0x85, 0x8b, 0x2c, 0x38, 0xa5, 0xa6, 0x75, 0xb9, 0x05, 0xa7, 0x66, 0x33, - 0x4b, 0xd6, 0x8b, 0x1b, 0x44, 0x6a, 0x13, 0xbe, 0x7b, 0x82, 0xf3, 0x4d, 0xf7, 0x7d, 0xce, 0x9c, - 0x28, 0xcb, 0x54, 0xc3, 0x7b, 0xed, 0x73, 0x96, 0xc9, 0xc2, 0xe2, 0x66, 0x6f, 0xf9, 0x40, 0x6e, - 0x72, 0x37, 0xa9, 0x9a, 0xc7, 0x11, 0xbc, 0x47, 0xd8, 0x2f, 0x44, 0xb2, 0x40, 0x23, 0x1f, 0x01, - 0x5f, 0x3d, 0x94, 0x5a, 0x94, 0x22, 0x17, 0x64, 0x15, 0x84, 0x09, 0xeb, 0x82, 0x55, 0x3b, 0x98, - 0x8d, 0x53, 0x58, 0x12, 0xdb, 0x90, 0x4b, 0x68, 0x78, 0x03, 0xd5, 0xf7, 0x38, 0x36, 0xad, 0xad, - 0x59, 0x0c, 0xa1, 0xd0, 0x90, 0x5c, 0x63, 0xdc, 0xb3, 0xd5, 0xa5, 0x7c, 0x66, 0xc6, 0x9c, 0x81, - 0x1f, 0x5b, 0x43, 0x45, 0xec, 0x9f, 0x41, 0xf1, 0xa1, 0x6a, 0x16, 0x0d, 0x9d, 0xf4, 0x66, 0xbc, - 0xe3, 0xd4, 0x2d, 0xf7, 0x03, 0x5a, 0x8d, 0xe3, 0xe2, 0x49, 0xf0, 0x81, 0xa6, 0x96, 0x82, 0x8b, - 0xaf, 0xf4, 0x6b, 0x4c, 0xbb, 0x37, 0xae, 0x3b, 0x4a, 0xf3, 0x36, 0x8a, 0x6e, 0xbd, 0x0f, 0xb0, - 0x47, 0x5a, 0x95, 0x68, 0x85, 0x5f, 0x2c, 0xf3, 0x80, 0x14, 0xfe, 0x84, 0x4a, 0xb6, 0x87, 0xf5, - 0x7d, 0xcc, 0xc5, 0x56, 0xe1, 0xf5, 0x16, 0x63, 0xbb, 0xf0, 0xbf, 0x85, 0xd1, 0x58, 0x8c, 0xc5, - 0x8c, 0xe7, 0xfb, 0x18, 0x8a, 0xff, 0xfe, 0x7f, 0xfe, 0xbf, 0x0f, 0xb5, 0x12, 0x7f, 0xf2, 0x94, - 0xdc, 0x2d, 0xd0, 0x5a, 0x71, 0x53, 0xd1, 0x0b, 0x7f, 0xc1, 0x85, 0x65, 0x1e, 0x64, 0x4c, 0x69, - 0x41, 0x2d, 0x4e, 0x63, 0x68, 0xec, 0xc4, 0x14, 0x8c, 0x68, 0x0e, 0x7e, 0x05, 0xaa, 0xb3, 0x50, - 0x0f, 0xf2, 0x17, 0xeb, 0x5c, 0x95, 0x41, 0x8f, 0x34, 0xe7, 0xb2, 0xd1, 0xce, 0x22, 0xa1, 0xae, - 0xaa, 0x49, 0x1b, 0x07, 0x1c, 0x98, 0x0c, 0x84, 0x43, 0xd7, 0x96, 0x6c, 0xf8, 0x85, 0x8f, 0xb9, - 0x22, 0x5e, 0xa3, 0xee, 0x4c, 0x83, 0xf0, 0xd7, 0x5f, 0x39, 0x4c, 0xcf, 0x71, 0x4a, 0x9e, 0x28, - 0x4b, 0xcc, 0x8a, 0xe5, 0x4e, 0xe0, 0xf0, 0xce, 0x9b, 0xf4, 0x64, 0xdf, 0xf3, 0xb1, 0xf3, 0x44, - 0x7c, 0xfc, 0x82, 0xab, 0xca, 0xae, 0x4a, 0x68, 0xc8, 0xcc, 0x8a, 0x65, 0x3b, 0x22, 0xdb, 0xa6, - 0x7a, 0x55, 0x26, 0x17, 0xc1, 0x9a, 0xfc, 0xa4, 0x92, 0xf7, 0xb5, 0xac, 0x15, 0x21, 0xfd, 0x36, - 0xd3, 0x5a, 0x05, 0x2c, 0xb6, 0xad, 0xdd, 0xd7, 0xb8, 0x66, 0xcf, 0xaf, 0x6d, 0x5d, 0xb3, 0x70, - 0xbd, 0x30, 0x77, 0x05, 0xde, 0xf3, 0xbf, 0xab, 0x8d, 0x2d, 0x63, 0x68, 0x99, 0xc5, 0x21, 0x1f, - 0xa7, 0x28, 0x6b, 0x4e, 0x45, 0x18, 0x85, 0xb6, 0x84, 0x81, 0x3a, 0xc5, 0xf4, 0x94, 0xfc, 0xfa, - 0x2b, 0x36, 0x6c, 0xb6, 0x87, 0x1d, 0x1c, 0x7e, 0xb2, 0x35, 0x2b, 0xb2, 0x6c, 0x59, 0x55, 0x06, - 0xac, 0xcf, 0x62, 0x69, 0x2a, 0x58, 0x0e, 0x2a, 0x4c, 0x4d, 0xab, 0x50, 0x92, 0x1f, 0xec, 0x96, - 0x51, 0xe2, 0xa1, 0x53, 0x8a, 0xd6, 0x2a, 0x3a, 0x22, 0xab, 0x96, 0xfa, 0x32, 0xf5, 0xae, 0xcd, - 0xb3, 0x77, 0x7d, 0xb7, 0xa9, 0xed, 0x4e, 0xfc, 0x02, 0x3f, 0x49, 0xa1, 0x25, 0xf5, 0xc7, 0xb9, - 0xdb, 0xfc, 0xb1, 0x7a, 0x8c, 0xd5, 0x76, 0xa8, 0xdf, 0xd9, 0x06, 0x55, 0x1a, 0xff, 0xed, 0xda, - 0x9e, 0xfd, 0x4e, 0x16, 0x9d, 0xf2, 0x5e, 0xbb, 0xca, 0xa6, 0xa3, 0x45, 0xe9, 0xfb, 0x1b, 0x74, - 0x18, 0x98, 0xa4, 0x5c, 0x4a, 0xca, 0x32, 0xb6, 0x16, 0xad, 0x6b, 0x6b, 0x64, 0x62, 0x1b, 0x52, - 0xa5, 0x25, 0xc8, 0x16, 0x94, 0x91, 0x6a, 0x40, 0x4e, 0x41, 0x12, 0x25, 0x37, 0x43, 0x89, 0x34, - 0x66, 0x74, 0xdc, 0xdc, 0x36, 0x24, 0xfa, 0xad, 0x0c, 0xa2, 0x81, 0xd4, 0x52, 0xc1, 0x88, 0xfa, - 0xa5, 0x5d, 0xe3, 0xd4, 0x15, 0xdf, 0xc9, 0x0a, 0xe9, 0x93, 0x28, 0xee, 0xdc, 0x27, 0x21, 0x00, - 0x9d, 0x16, 0x07, 0x92, 0x2d, 0x88, 0xb0, 0xa4, 0xde, 0x0b, 0xff, 0x6b, 0x96, 0xb7, 0xbe, 0xb2, - 0xed, 0xa7, 0xda, 0xb0, 0x63, 0x71, 0xbc, 0xcf, 0x69, 0xd9, 0xb1, 0x19, 0xac, 0x36, 0xed, 0xd0, - 0x1a, 0xd0, 0x58, 0xd0, 0x76, 0x9d, 0x25, 0x4d, 0x3f, 0xd8, 0xb0, 0x93, 0x85, 0xb0, 0x70, 0xbd, - 0xe5, 0x76, 0x97, 0xf2, 0xb6, 0x71, 0xaf, 0x23, 0xae, 0xcc, 0x70, 0x5f, 0x3a, 0xe3, 0xb2, 0xd1, - 0xfb, 0x54, 0x1f, 0x6c, 0xe5, 0x86, 0x23, 0xec, 0x36, 0xc5, 0x23, 0xe7, 0xa5, 0xa7, 0x60, 0x85, - 0xcf, 0x0f, 0x36, 0x31, 0xfd, 0x87, 0xb5, 0x25, 0xd9, 0xa2, 0x5e, 0x85, 0x31, 0xa9, 0xb8, 0xd4, - 0x5b, 0x7f, 0x96, 0xe4, 0x90, 0x52, 0xce, 0x5c, 0x4f, 0x80, 0x6b, 0x0b, 0xb0, 0x3c, 0x75, 0xf2, - 0x5d, 0x7d, 0x07, 0x11, 0x8b, 0x87, 0xf0, 0x2c, 0x6b, 0x48, 0x69, 0x56, 0xb4, 0xb2, 0xc5, 0xf9, - 0xe7, 0x5c, 0xa7, 0x83, 0xb2, 0x75, 0x15, 0xcd, 0x69, 0x5a, 0x6e, 0xbc, 0xf0, 0x42, 0x92, 0x44, - 0x0b, 0xc7, 0xe0, 0x2b, 0x73, 0xb3, 0xcb, 0x06, 0xa1, 0xaf, 0x98, 0xd4, 0x12, 0x12, 0xaa, 0x4a, - 0x62, 0x69, 0x41, 0x70, 0x66, 0x0f, 0x53, 0x94, 0xab, 0x2f, 0x33, 0x7c, 0x65, 0xbe, 0xa2, 0x2b, - 0x13, 0x95, 0x64, 0x4e, 0x2a, 0x08, 0xf9, 0x82, 0x4f, 0x4f, 0xbd, 0xc9, 0x87, 0xed, 0x4d, 0xed, - 0x11, 0xa0, 0x8c, 0x73, 0x6b, 0xee, 0xbe, 0xb2, 0xf0, 0x9d, 0x19, 0x8c, 0xd3, 0xbb, 0x5f, 0x3b, - 0x72, 0xff, 0x57, 0x52, 0xd5, 0x0e, 0x9c, 0x0f, 0xca, 0x3e, 0x45, 0x05, 0x3e, 0x5d, 0xf4, 0xcf, - 0x5a, 0x22, 0x62, 0x5a, 0x69, 0x80, 0x8a, 0x8b, 0xa9, 0xdc, 0x25, 0x8b, 0xe4, 0xeb, 0x56, 0xad, - 0xe4, 0x92, 0xb3, 0x77, 0x20, 0xca, 0xbc, 0x7c, 0xf2, 0x4d, 0x13, 0x61, 0xc9, 0x0e, 0x3c, 0x05, - 0xfa, 0x39, 0xc9, 0x1d, 0xde, 0x74, 0x02, 0xf3, 0xaf, 0x79, 0x3b, 0x10, 0xab, 0x94, 0x69, 0x80, - 0x57, 0xd4, 0xd3, 0x72, 0x4a, 0x18, 0x5d, 0x41, 0x9b, 0x95, 0x8b, 0x67, 0x18, 0x45, 0x60, 0xe2, - 0x75, 0xb8, 0x02, 0x9e, 0xc9, 0x52, 0x53, 0x02, 0x89, 0x7f, 0xe6, 0x33, 0xda, 0x1d, 0xfd, 0xe7, - 0xec, 0x6c, 0x90, 0x2c, 0x64, 0x3e, 0x2a, 0x7d, 0xb5, 0xbc, 0x9c, 0xe0, 0x25, 0x5d, 0xec, 0x05, - 0xbc, 0xde, 0x56, 0x4f, 0x76, 0xe6, 0xb9, 0x41, 0xb3, 0x6c, 0x45, 0xbf, 0x87, 0x92, 0xfb, 0x63, - 0x75, 0x5d, 0x69, 0xab, 0x31, 0x40, 0xe6, 0xaf, 0x85, 0x70, 0x85, 0x10, 0x01, 0x94, 0xec, 0x73, - 0x2f, 0xc5, 0x38, 0xab, 0x52, 0x78, 0xd8, 0x21, 0x31, 0x0e, 0xab, 0xbf, 0xae, 0x7d, 0xcc, 0x8b, - 0xbe, 0x5e, 0x48, 0x43, 0x7e, 0xa3, 0x5a, 0xea, 0x58, 0xe7, 0xd2, 0x6e, 0xe1, 0x42, 0x21, 0x0e, - 0x2f, 0x5d, 0x95, 0x55, 0x8a, 0xea, 0x08, 0xd9, 0x15, 0xd1, 0x01, 0xc7, 0x94, 0x83, 0x7b, 0x8d, - 0x9c, 0x87, 0x49, 0xcf, 0x8b, 0x49, 0x12, 0xf4, 0xfb, 0x52, 0x44, 0x11, 0x77, 0x13, 0xce, 0x05, - 0xcd, 0xa6, 0xac, 0x25, 0xec, 0x53, 0x11, 0x42, 0x25, 0xdb, 0x2e, 0x3b, 0x9a, 0x2a, 0x83, 0xbb, - 0x05, 0x7f, 0x8f, 0x0f, 0x54, 0xa7, 0x30, 0x47, 0x1f, 0x0d, 0x31, 0x72, 0x0c, 0xcd, 0xc3, 0x1d, - 0x3b, 0xe2, 0x6a, 0x6f, 0x5e, 0x5a, 0xc4, 0x4f, 0x9d, 0xad, 0x0a, 0xc7, 0x5d, 0x50, 0xe4, 0x96, - 0x73, 0x50, 0xf9, 0x8d, 0xbd, 0x0c, 0xed, 0xa3, 0x8e, 0x58, 0x22, 0x64, 0x32, 0x76, 0xbc, 0xb0, - 0xd6, 0xac, 0x85, 0xac, 0x3b, 0xb5, 0x66, 0x15, 0xac, 0x0c, 0x7e, 0xb1, 0x97, 0xf9, 0xfa, 0xb5, - 0xa2, 0x5d, 0x4e, 0x2f, 0xb6, 0xb6, 0x56, 0x9c, 0x2a, 0x8a, 0x93, 0x30, 0x01, 0xdc, 0x72, 0x88, - 0xe0, 0xb6, 0x68, 0x44, 0xec, 0x22, 0xfc, 0xd4, 0xf8, 0x08, 0x93, 0x30, 0xa1, 0x3d, 0x83, 0xeb, - 0xb9, 0x6b, 0x70, 0x1e, 0x29, 0x4e, 0x9f, 0x6c, 0xf0, 0xc6, 0xeb, 0x35, 0x8f, 0x0f, 0xdb, 0xa8, - 0x6c, 0xa6, 0x22, 0x34, 0x6c, 0xa3, 0x02, 0x62, 0xee, 0x1b, 0x4b, 0xb8, 0x26, 0x4c, 0x6b, 0x30, - 0x34, 0x24, 0x7d, 0x8a, 0x44, 0x1d, 0x8e, 0x2e, 0xf2, 0x35, 0x43, 0xaf, 0xe5, 0x7e, 0xf5, 0xa1, - 0x45, 0xb3, 0x55, 0xb4, 0xa9, 0xf4, 0x7a, 0x10, 0xea, 0xac, 0xe4, 0x27, 0x15, 0xa1, 0x5d, 0x26, - 0x8b, 0xa0, 0xed, 0x75, 0xbf, 0x3a, 0x92, 0xc8, 0xf8, 0x92, 0x39, 0xc6, 0xa5, 0xfb, 0x0b, 0x7f, - 0x62, 0x3b, 0x9c, 0x97, 0xe2, 0xc2, 0x96, 0xd0, 0x6a, 0xee, 0xb3, 0x67, 0x1f, 0x09, 0x60, 0x11, - 0xc6, 0x92, 0xb3, 0xc6, 0xca, 0x42, 0xb3, 0x10, 0xe4, 0x31, 0x84, 0x12, 0x10, 0x18, 0xeb, 0xea, - 0x53, 0xf5, 0x23, 0xdf, 0xde, 0xf2, 0x87, 0xdb, 0x61, 0x33, 0x16, 0xef, 0xaf, 0xc3, 0x83, 0x36, - 0xad, 0x04, 0x96, 0x38, 0xac, 0xb7, 0x56, 0x0a, 0xa3, 0xbb, 0x7f, 0xfd, 0x5f, 0x4a, 0x5f, 0xbf, - 0x82, 0x02, 0x33, 0xed, 0x28, 0x56, 0xaa, 0x67, 0x5e, 0x97, 0x2b, 0xe2, 0x72, 0x29, 0x7c, 0xa7, - 0xbf, 0x8b, 0x95, 0xe4, 0x65, 0xb1, 0x0a, 0xde, 0x63, 0x8b, 0x9d, 0x40, 0x60, 0xa2, 0x92, 0xc8, - 0xac, 0x4e, 0x4f, 0xc4, 0x4e, 0xfe, 0xfe, 0x2f, 0xff, 0x77, 0xdd, 0xb9, 0xfb, 0x71, 0xc3, 0x18, - 0x80, 0x1c, 0x3e, 0x9b, 0x49, 0xe5, 0x1e, 0x4a, 0x39, 0xad, 0x29, 0xe7, 0x75, 0x24, 0xa6, 0x6a, - 0x27, 0xa1, 0xe4, 0x08, 0xc4, 0x8c, 0x38, 0x2b, 0x62, 0x21, 0xe7, 0xa1, 0x77, 0x49, 0x14, 0xe8, - 0xb1, 0xaf, 0xb0, 0xaa, 0x0a, 0x48, 0xa9, 0xf4, 0xce, 0x5b, 0x88, 0x35, 0x28, 0x7b, 0xe9, 0xbd, - 0x7e, 0xf5, 0xc3, 0xab, 0xd7, 0xaa, 0xc6, 0xb7, 0x54, 0xe9, 0x9b, 0xd0, 0xf5, 0x55, 0xa5, 0xae, - 0xbe, 0xd8, 0x7e, 0x3e, 0x8b, 0x11, 0x0c, 0x29, 0x97, 0x80, 0xf0, 0xa5, 0x17, 0x7c, 0xa3, 0x79, - 0x30, 0x99, 0x34, 0xff, 0x16, 0xfe, 0x2d, 0x64, 0x9f, 0xbe, 0x2b, 0xbe, 0x9a, 0x50, 0x1c, 0xfb, - 0xaa, 0xfd, 0xfa, 0xb4, 0x04, 0x66, 0xdf, 0x7a, 0x94, 0x64, 0x9e, 0x7c, 0x0b, 0x8e, 0x7c, 0x72, - 0x7d, 0x82, 0xbe, 0xf5, 0x04, 0x37, 0x32, 0xc9, 0x81, 0x4c, 0x29, 0x2a, 0xe2, 0x61, 0x44, 0xda, - 0xca, 0x10, 0x74, 0xc6, 0xbe, 0x81, 0xf7, 0x21, 0x5a, 0x59, 0xd6, 0x3f, 0x32, 0x32, 0xb3, 0x1b, - 0x16, 0xba, 0x2a, 0xa3, 0x54, 0xcb, 0x57, 0x91, 0x08, 0xc4, 0xb5, 0x88, 0xd1, 0xf6, 0x5c, 0x04, - 0xb9, 0x81, 0x12, 0xf4, 0xe0, 0x84, 0x60, 0x7e, 0xd4, 0xcd, 0xdb, 0xbb, 0x44, 0x75, 0x0e, 0xcf, - 0x8f, 0xbc, 0x58, 0xac, 0x37, 0xeb, 0x2a, 0x66, 0x59, 0x3e, 0xf3, 0x9a, 0xe6, 0x95, 0x54, 0x2d, - 0xec, 0x06, 0x0f, 0x6a, 0x74, 0x45, 0xcd, 0xb5, 0xad, 0x96, 0xdd, 0xbc, 0xe5, 0x6d, 0x65, 0x40, - 0x8b, 0x95, 0xb5, 0xe9, 0xae, 0x32, 0xa4, 0xf7, 0x85, 0x7d, 0xc9, 0x9d, 0xc9, 0x84, 0xb7, 0xb5, - 0x3c, 0xb0, 0xb7, 0xb4, 0x56, 0x12, 0xa2, 0xd5, 0x67, 0xe1, 0x50, 0x4b, 0x2b, 0x5a, 0xf8, 0x30, - 0x3d, 0xb1, 0xa5, 0x12, 0x66, 0xc3, 0xba, 0xcd, 0xe3, 0x6c, 0xfa, 0x72, 0xd2, 0x24, 0x39, 0x42, - 0xca, 0xac, 0x1e, 0x46, 0x41, 0x0e, 0xd4, 0x89, 0x37, 0x8a, 0x92, 0x8f, 0x35, 0x9b, 0x38, 0x4c, - 0x25, 0xc0, 0x36, 0xaa, 0xc5, 0x7b, 0xbf, 0xb8, 0x45, 0x73, 0x22, 0xbf, 0x9a, 0x49, 0xb9, 0x59, - 0x46, 0x6d, 0xe5, 0xee, 0x91, 0xa3, 0x4f, 0xda, 0xce, 0x2f, 0x76, 0x74, 0xaa, 0x37, 0x17, 0xed, - 0x70, 0xa2, 0x2f, 0x57, 0x30, 0x7d, 0x2d, 0x30, 0x94, 0x63, 0x29, 0x82, 0x1b, 0x9a, 0x73, 0x57, - 0x7f, 0x44, 0xdf, 0xe8, 0x3a, 0x4b, 0x97, 0xf5, 0x53, 0x75, 0x0a, 0x55, 0x4f, 0x77, 0x21, 0x61, - 0x07, 0x81, 0x20, 0x6c, 0x4c, 0x49, 0x64, 0x88, 0x6f, 0xf4, 0x58, 0x4d, 0x6d, 0x28, 0x4e, 0x62, - 0xbf, 0x89, 0x38, 0x71, 0xc9, 0x85, 0x0e, 0xf4, 0x99, 0xeb, 0x8b, 0xc2, 0x6c, 0xbe, 0x50, 0x9c, - 0x30, 0xb9, 0x86, 0xb7, 0xaa, 0x33, 0x5a, 0x0c, 0xd4, 0x78, 0xc9, 0x64, 0xb8, 0x8a, 0x89, 0x34, - 0xb5, 0x33, 0xf1, 0xc5, 0x0a, 0x26, 0x13, 0x84, 0xd5, 0xea, 0x07, 0x87, 0xb9, 0x48, 0x61, 0xc9, - 0x83, 0x56, 0x4e, 0xb5, 0xe3, 0x6a, 0xf6, 0x64, 0xf2, 0xc4, 0xd9, 0x6e, 0x76, 0x23, 0xa4, 0x81, - 0x3b, 0x2e, 0x89, 0x70, 0xc5, 0xc5, 0x07, 0x67, 0xde, 0x42, 0x80, 0x0f, 0xd7, 0xb0, 0x32, 0xc1, - 0xd9, 0x00, 0xef, 0x47, 0x5e, 0x25, 0xcf, 0xaa, 0x55, 0xf4, 0x66, 0x9c, 0x1a, 0x2b, 0xa8, 0x4e, - 0xfe, 0xab, 0xa2, 0x3d, 0x5b, 0xe0, 0x72, 0x0c, 0x49, 0x19, 0x12, 0xb3, 0x65, 0x43, 0x6b, 0x23, - 0xcc, 0x66, 0xb2, 0x98, 0xf3, 0xb2, 0x62, 0xa5, 0x67, 0x32, 0x5e, 0x96, 0xed, 0x71, 0xa3, 0x1a, - 0x92, 0x1d, 0xca, 0xb8, 0x1c, 0x54, 0x31, 0x5d, 0xab, 0x0f, 0xd9, 0x09, 0x29, 0x41, 0x21, 0x6d, - 0x81, 0xa0, 0x96, 0x6b, 0x35, 0x28, 0x91, 0x95, 0xd7, 0x0b, 0x26, 0xa7, 0x08, 0x7d, 0x88, 0x35, - 0x9a, 0xd1, 0xe6, 0x17, 0xfb, 0x83, 0x65, 0x21, 0xf6, 0x55, 0x01, 0xf3, 0x54, 0xa7, 0x25, 0x22, - 0x5b, 0x16, 0x2b, 0x7f, 0x70, 0xa8, 0xe3, 0xeb, 0x1f, 0x12, 0x60, 0xaf, 0x2b, 0x6d, 0x64, 0xf1, - 0xf5, 0x26, 0x1a, 0x83, 0x1a, 0x78, 0x0a, 0x9a, 0x5b, 0x91, 0x71, 0xb5, 0xef, 0xc5, 0x0d, 0x24, - 0x1a, 0x2e, 0xeb, 0x8c, 0xf4, 0x4e, 0x47, 0x6c, 0xcf, 0x92, 0x1c, 0x20, 0xf5, 0xe0, 0x69, 0x81, - 0x88, 0xf5, 0x56, 0x1b, 0xad, 0xcc, 0xdc, 0xc7, 0x8d, 0x50, 0x55, 0x8b, 0x20, 0xa8, 0x46, 0x29, - 0xdf, 0x2f, 0xca, 0x00, 0x0e, 0x2b, 0xa7, 0x54, 0xd8, 0x0e, 0x68, 0x87, 0x5d, 0x2e, 0x0a, 0xd9, - 0x16, 0x87, 0xc8, 0xde, 0x82, 0x0b, 0xd3, 0x9d, 0x15, 0xd3, 0x5b, 0x9c, 0xe3, 0xa3, 0xef, 0xca, - 0x19, 0x40, 0x4b, 0x13, 0xcb, 0x27, 0x96, 0x47, 0xdf, 0xd5, 0x96, 0xa7, 0x2b, 0x2e, 0x8f, 0x24, - 0xf8, 0xb9, 0x81, 0x9b, 0x77, 0xa6, 0x09, 0x4e, 0xb0, 0x88, 0xd8, 0x1d, 0xdb, 0x04, 0x32, 0x8b, - 0xfd, 0xfb, 0xd5, 0xa5, 0x82, 0xa5, 0xac, 0xc7, 0xb9, 0x59, 0x43, 0x7b, 0x15, 0xea, 0xef, 0x54, - 0xb2, 0x2c, 0x36, 0xbe, 0x16, 0x8b, 0x53, 0xa6, 0xef, 0x96, 0x29, 0x71, 0x89, 0xcc, 0x84, 0xa4, - 0xb4, 0xd6, 0x3c, 0x16, 0x26, 0x91, 0x5e, 0x14, 0xe3, 0x10, 0x45, 0x6c, 0xaa, 0xdb, 0xbc, 0x8a, - 0xcd, 0xbf, 0xec, 0xf3, 0xee, 0xbc, 0xc7, 0x28, 0x10, 0x26, 0xa8, 0x16, 0xfe, 0xfb, 0x81, 0x5d, - 0xa4, 0xf0, 0x1f, 0x42, 0x12, 0xfe, 0xb6, 0x81, 0xc9, 0x44, 0xd2, 0x0f, 0x5c, 0xe1, 0x03, 0x5b, - 0xae, 0xef, 0xa5, 0xb5, 0xbd, 0x36, 0x87, 0xb6, 0xd3, 0x47, 0x5b, 0xbb, 0xcb, 0x94, 0xf3, 0x19, - 0xe4, 0xcc, 0xd8, 0x64, 0x39, 0xb0, 0xf3, 0x1a, 0x51, 0xeb, 0x5b, 0xc8, 0x56, 0xda, 0x64, 0x34, - 0xb2, 0xe9, 0x99, 0x7e, 0x0e, 0x5f, 0x85, 0xc3, 0xda, 0xf6, 0x3e, 0x60, 0x6a, 0xab, 0xd2, 0x4c, - 0xce, 0x22, 0xd4, 0x53, 0xa2, 0x9a, 0x46, 0x5e, 0xa6, 0xc3, 0xed, 0xd2, 0x57, 0x9c, 0x7d, 0x70, - 0xed, 0xc5, 0x6e, 0x58, 0xac, 0x72, 0x11, 0xf5, 0xd4, 0x81, 0x15, 0xda, 0xed, 0x62, 0xf9, 0x7f, - 0x3c, 0x79, 0xf7, 0xb6, 0x29, 0x31, 0x7f, 0xc1, 0xc8, 0x20, 0xd5, 0xd5, 0xee, 0x17, 0xdb, 0xf5, - 0x45, 0x55, 0x96, 0x41, 0xae, 0x87, 0x53, 0x02, 0x61, 0x71, 0xc4, 0x0a, 0x72, 0x79, 0xc5, 0xd1, - 0xbf, 0x36, 0x53, 0xac, 0xd6, 0x35, 0x70, 0x59, 0x79, 0x9c, 0xca, 0x62, 0xb8, 0xaf, 0x1c, 0x2e, - 0x34, 0x65, 0x4e, 0xb4, 0x85, 0xa6, 0x34, 0x53, 0x7e, 0xc5, 0xe0, 0xb2, 0x48, 0x5f, 0xcd, 0x86, - 0xf5, 0x86, 0x6e, 0xa7, 0xc7, 0xe8, 0x4f, 0xa2, 0xbe, 0x76, 0x67, 0x7b, 0x4e, 0x3f, 0x6b, 0x1f, - 0xd6, 0x60, 0xed, 0xa3, 0x7b, 0x8b, 0xf9, 0xeb, 0x3a, 0xac, 0x7d, 0x4b, 0x5e, 0xae, 0x16, 0xd2, - 0x92, 0x3b, 0x77, 0x05, 0xe9, 0xdf, 0x5b, 0x71, 0x20, 0xe0, 0x99, 0x6e, 0x7b, 0x26, 0xa3, 0xd7, - 0xf7, 0xc7, 0xaf, 0x75, 0x21, 0xf1, 0x3f, 0xa2, 0xe7, 0x1a, 0x7a, 0x96, 0x95, 0x33, 0xe9, 0xbd, - 0x14, 0xe7, 0x77, 0x3e, 0x93, 0x85, 0x7c, 0xe6, 0x6c, 0x65, 0x79, 0xc9, 0x90, 0x89, 0xec, 0xe8, - 0xe4, 0x9d, 0x49, 0x43, 0xa6, 0x93, 0xe4, 0xb6, 0xdd, 0xce, 0x63, 0xeb, 0x08, 0xbd, 0x8b, 0x43, - 0x8c, 0x06, 0x8c, 0x07, 0x9c, 0x49, 0xdd, 0x31, 0xd0, 0xd9, 0xd1, 0xc3, 0x88, 0xcf, 0xe8, 0x4b, - 0xec, 0x5f, 0x46, 0x17, 0x56, 0x5f, 0xa4, 0xa3, 0xf5, 0x5e, 0x29, 0x6d, 0xf4, 0xcc, 0xac, 0xc4, - 0x44, 0xcf, 0x9f, 0x6c, 0xba, 0x36, 0x4d, 0x54, 0xcd, 0x47, 0x71, 0x8f, 0xd4, 0x73, 0x53, 0x45, - 0x14, 0xc1, 0x54, 0x13, 0x05, 0x1f, 0x09, 0x58, 0xa6, 0x08, 0x84, 0xa3, 0x67, 0x27, 0x4a, 0x9c, - 0x1a, 0xec, 0x43, 0xfb, 0xa3, 0xb1, 0x3b, 0xe0, 0x79, 0x85, 0x52, 0x97, 0x4a, 0xe8, 0x8c, 0xce, - 0x34, 0x8f, 0xeb, 0xac, 0xf1, 0xa6, 0x56, 0xcc, 0x9e, 0x5b, 0x4a, 0x45, 0x6f, 0x91, 0x5c, 0x4b, - 0x3a, 0xe5, 0xb8, 0xb7, 0x34, 0xf2, 0x71, 0x34, 0xec, 0x3a, 0xef, 0xdf, 0x9d, 0x9c, 0x3a, 0xae, - 0xb8, 0xcd, 0x24, 0xdd, 0x5b, 0x47, 0x53, 0x7f, 0x83, 0x2f, 0xd3, 0xa8, 0x22, 0x14, 0x17, 0x47, - 0x19, 0x5d, 0xb4, 0x5a, 0xa4, 0x99, 0x3c, 0x1a, 0x3f, 0xcf, 0x74, 0xaf, 0xa9, 0x9b, 0xe3, 0xe3, - 0xab, 0x31, 0x2f, 0xfd, 0xc1, 0x8d, 0xa4, 0x73, 0xd2, 0x8e, 0x93, 0x04, 0x77, 0x81, 0x67, 0x0e, - 0x2f, 0x56, 0x74, 0xbc, 0x73, 0xc4, 0x05, 0xd9, 0xf4, 0xf5, 0xd3, 0xa2, 0xe9, 0x6b, 0xe6, 0xc9, - 0x4d, 0xee, 0x98, 0xa2, 0x39, 0x36, 0x08, 0xd7, 0x52, 0x78, 0xca, 0xd3, 0x29, 0xa0, 0x56, 0x4f, - 0xa7, 0x3e, 0xf4, 0xd5, 0xcc, 0x50, 0xbc, 0x22, 0x64, 0x7f, 0x7c, 0x83, 0xeb, 0x13, 0x1b, 0x72, - 0xd0, 0x35, 0xf4, 0x93, 0x41, 0x1c, 0xcc, 0x52, 0x9c, 0xa6, 0x8a, 0xc3, 0x21, 0x76, 0x00, 0xc5, - 0x86, 0x64, 0x7d, 0x33, 0x78, 0x1c, 0x0c, 0xb5, 0x60, 0x08, 0x39, 0x89, 0xf6, 0x51, 0xc1, 0xd6, - 0xd1, 0x77, 0xf9, 0x7d, 0x47, 0x42, 0x19, 0x13, 0xea, 0x53, 0xec, 0xe1, 0x3e, 0xed, 0x0f, 0xb7, - 0x61, 0xd7, 0xb9, 0x39, 0x8b, 0x46, 0x09, 0x4d, 0xd4, 0xa0, 0xdb, 0xb9, 0x73, 0xf1, 0x62, 0x5e, - 0x7e, 0x71, 0x59, 0x7e, 0x31, 0xf5, 0x68, 0xfd, 0x5c, 0xe3, 0xc5, 0x63, 0x97, 0xe0, 0x25, 0xdd, - 0x9d, 0xbb, 0x8f, 0xf0, 0x75, 0x8c, 0xb7, 0x6f, 0x34, 0xd0, 0x8a, 0x12, 0x5c, 0x93, 0x36, 0xcf, - 0xb3, 0x9b, 0xce, 0xbe, 0xc0, 0xe2, 0x3a, 0x51, 0x7f, 0xa0, 0xeb, 0x10, 0x06, 0xce, 0x62, 0xbb, - 0x59, 0x7a, 0x3e, 0x5f, 0x78, 0xd1, 0x2f, 0xbd, 0xe8, 0x17, 0x61, 0x9d, 0xcd, 0x3a, 0x9f, 0x0d, - 0xdc, 0x90, 0x34, 0xa2, 0xc4, 0x0b, 0x4c, 0xff, 0x86, 0x41, 0x7c, 0x96, 0x8e, 0x71, 0x05, 0x45, - 0x56, 0xc3, 0x1f, 0x9e, 0xfb, 0x67, 0xc9, 0x34, 0x8a, 0xd2, 0xf1, 0xd9, 0xcd, 0x92, 0xf7, 0x03, - 0x0b, 0x22, 0xcf, 0xfa, 0x99, 0x64, 0x7b, 0x14, 0xa0, 0xa3, 0xd8, 0xff, 0xb9, 0x1a, 0x2a, 0x09, - 0x91, 0x7e, 0xf9, 0xcb, 0x60, 0x4c, 0xd2, 0xaa, 0xc7, 0x6f, 0xcf, 0xa6, 0xde, 0xf5, 0xb2, 0x2f, - 0xc1, 0xd2, 0x3a, 0xb8, 0xf7, 0x23, 0xfb, 0x82, 0x24, 0xc5, 0xc8, 0x6e, 0x53, 0xaa, 0x60, 0xbd, - 0x0e, 0xad, 0xbe, 0x0f, 0xe2, 0x28, 0x41, 0x94, 0xdf, 0x85, 0xee, 0xb9, 0x29, 0x56, 0x55, 0xb3, - 0x7f, 0xa3, 0xd1, 0xb1, 0x27, 0xb3, 0xbf, 0x27, 0xdf, 0xd3, 0xfc, 0x3e, 0xa3, 0xac, 0x0e, 0x49, - 0x8a, 0xa4, 0xd5, 0x59, 0xed, 0x5c, 0x0d, 0xe3, 0xb3, 0xc1, 0x9c, 0x74, 0xa4, 0x33, 0x6f, 0x78, - 0x69, 0xda, 0x9a, 0x44, 0xb8, 0x71, 0x27, 0xab, 0xc4, 0xf4, 0x7b, 0xc6, 0x77, 0xac, 0x9f, 0xb5, - 0x97, 0xbc, 0xef, 0xd8, 0x1d, 0x63, 0x7f, 0x4e, 0x5a, 0xfd, 0xf2, 0xcd, 0xc6, 0x0e, 0xb7, 0x84, - 0xd0, 0xb4, 0xb3, 0x04, 0xf7, 0x69, 0x71, 0x37, 0xf8, 0xca, 0xb0, 0xdc, 0x66, 0xc1, 0x27, 0xef, - 0x47, 0xdf, 0xb1, 0x40, 0x95, 0x67, 0x12, 0xb1, 0x65, 0x6a, 0xbc, 0x94, 0xbb, 0xb4, 0x90, 0x92, - 0xbd, 0x29, 0x6c, 0xc5, 0xf8, 0x4a, 0x25, 0x22, 0x6f, 0xa6, 0x26, 0x35, 0x3b, 0x17, 0x4e, 0xe6, - 0x7d, 0xd9, 0x3d, 0x69, 0xf3, 0xc1, 0x47, 0xce, 0x12, 0xaf, 0x13, 0x76, 0x1a, 0xe6, 0xcd, 0x2e, - 0x17, 0x07, 0xf9, 0x0a, 0xfe, 0x00, 0x58, 0x86, 0x7f, 0xeb, 0xcf, 0x7f, 0xfa, 0x13, 0x83, 0x46, - 0x1e, 0x7c, 0xe1, 0xde, 0x84, 0xa8, 0x90, 0xb6, 0x11, 0xbe, 0x0f, 0xf5, 0xeb, 0x28, 0x9e, 0xd6, - 0x50, 0x49, 0xd8, 0x93, 0xed, 0x6f, 0xb2, 0x4a, 0xfe, 0xf5, 0x75, 0x75, 0x1d, 0xdb, 0x5f, 0x99, - 0x4c, 0x72, 0x55, 0xfd, 0x24, 0xc0, 0xed, 0x3b, 0xa6, 0xf6, 0xb2, 0x93, 0xd0, 0x75, 0x50, 0x98, - 0x77, 0x37, 0xf8, 0x66, 0xa5, 0x7a, 0xc6, 0x1d, 0xf3, 0x9c, 0xa6, 0xc4, 0x20, 0x5f, 0xfa, 0x93, - 0xa0, 0xef, 0xeb, 0xdb, 0xa5, 0x11, 0x37, 0xad, 0xd3, 0xde, 0xf2, 0xf5, 0x04, 0x7a, 0xba, 0xb0, - 0xc3, 0x8d, 0xe6, 0x89, 0x76, 0x3f, 0xe6, 0xf4, 0xbf, 0x0c, 0x0b, 0xd6, 0x51, 0x23, 0x14, 0xf2, - 0xbe, 0x2e, 0xfe, 0xc3, 0x83, 0x71, 0x30, 0x83, 0x11, 0x25, 0x08, 0xf9, 0xd2, 0x31, 0x5c, 0x01, - 0x9d, 0x89, 0xd1, 0xfa, 0x46, 0x09, 0xa4, 0xe3, 0x86, 0x3b, 0x31, 0x3b, 0x46, 0xa8, 0x46, 0xc3, - 0xf2, 0x54, 0x81, 0x86, 0xbb, 0xef, 0x3b, 0x09, 0x75, 0x86, 0x6f, 0x6e, 0xe7, 0x50, 0x22, 0x1f, - 0x11, 0x19, 0x1c, 0x49, 0x4e, 0xa3, 0xa3, 0x1d, 0x6e, 0xa2, 0x23, 0x14, 0x08, 0x3d, 0xb4, 0x0f, - 0x29, 0x31, 0x44, 0x1f, 0x74, 0x74, 0x8c, 0x83, 0x9c, 0xd0, 0xcc, 0xce, 0xd8, 0xf3, 0x47, 0x72, - 0x2c, 0xb9, 0xec, 0xf4, 0x3c, 0x33, 0x37, 0x79, 0xf3, 0x81, 0x34, 0xbb, 0xe8, 0x90, 0x04, 0x0e, - 0x67, 0x65, 0x04, 0x8b, 0x2b, 0xa6, 0xe3, 0xec, 0x58, 0x7d, 0x3d, 0x5e, 0x25, 0xc4, 0xb0, 0x5e, - 0xd8, 0x76, 0x1e, 0x56, 0x73, 0x44, 0x25, 0xb5, 0x31, 0xb1, 0x4a, 0x28, 0x59, 0xa0, 0x43, 0xae, - 0xfd, 0xb6, 0xb8, 0x7a, 0xf2, 0xcb, 0x5a, 0x0f, 0x1e, 0x42, 0x91, 0x2b, 0x17, 0x49, 0xd6, 0x8e, - 0x25, 0xe9, 0xa0, 0x50, 0xfd, 0xd6, 0x92, 0x6b, 0x7f, 0x03, 0xf9, 0x6a, 0x87, 0x01, 0x95, 0x77, - 0xbe, 0xb8, 0x40, 0x6c, 0x37, 0x12, 0xab, 0xeb, 0x9b, 0x87, 0x76, 0x4a, 0x02, 0x3b, 0xe1, 0x2f, - 0x24, 0x9c, 0xc6, 0x30, 0x98, 0xd6, 0x7b, 0x9c, 0x57, 0x00, 0x27, 0xd0, 0x92, 0xa1, 0x60, 0xf3, - 0x50, 0x6b, 0x91, 0x24, 0x39, 0x64, 0xa3, 0x22, 0xa1, 0xb4, 0xd9, 0xd4, 0x8e, 0x20, 0xfc, 0xaf, - 0xd3, 0xfb, 0x4d, 0x9a, 0x40, 0xc5, 0x28, 0x0e, 0x88, 0x18, 0x2a, 0x74, 0x80, 0x19, 0x1b, 0xe9, - 0x8d, 0xb5, 0xbe, 0x84, 0x67, 0x01, 0x39, 0x33, 0x76, 0x7c, 0xf9, 0xd5, 0x34, 0x98, 0x2f, 0x9c, - 0xf9, 0x59, 0x43, 0xe9, 0x4a, 0xb2, 0x7a, 0x96, 0x70, 0x50, 0x33, 0x3f, 0x6a, 0x71, 0xed, 0x1c, - 0xb2, 0x95, 0xb8, 0x3e, 0x70, 0xd6, 0xa7, 0x73, 0x5f, 0x3d, 0x9b, 0x07, 0x36, 0x2b, 0x52, 0x96, - 0x28, 0x5c, 0x4c, 0x0d, 0x38, 0xf6, 0x92, 0xfc, 0x5a, 0x06, 0xc7, 0x1c, 0x1c, 0xc1, 0x2b, 0x78, - 0x96, 0xe7, 0x3c, 0x84, 0xe2, 0x3d, 0x4e, 0xa7, 0x93, 0xd5, 0x14, 0x30, 0xde, 0x3d, 0x2c, 0x4c, - 0xe5, 0x93, 0x16, 0xde, 0x64, 0xf8, 0xcb, 0x5b, 0x2a, 0xe5, 0xe2, 0xd0, 0xce, 0xa7, 0xc8, 0x65, - 0xc4, 0x78, 0x35, 0x67, 0x59, 0x4f, 0xd9, 0x59, 0x40, 0x5c, 0x59, 0x0b, 0x29, 0xe8, 0xb8, 0x2b, - 0x5b, 0x8b, 0x7d, 0x91, 0xf3, 0xe2, 0x38, 0xba, 0x2a, 0xb9, 0xb1, 0x66, 0x9f, 0x74, 0x16, 0x0e, - 0xdd, 0x80, 0x71, 0x3e, 0x5a, 0x04, 0x5b, 0xf0, 0xc2, 0xa5, 0xda, 0x6b, 0x1c, 0x71, 0x91, 0x46, - 0x03, 0xa8, 0x60, 0xb0, 0x8d, 0x02, 0x0e, 0x36, 0x9d, 0x2d, 0x3d, 0x84, 0x2d, 0xc7, 0xf2, 0x61, - 0x14, 0x80, 0x47, 0xdf, 0x69, 0x84, 0xd4, 0xfe, 0xe6, 0x14, 0x6a, 0xfd, 0x6d, 0xb5, 0x5b, 0x6e, - 0xd6, 0xa3, 0x06, 0x69, 0x78, 0xf0, 0xd3, 0x2f, 0xbb, 0xe6, 0x5a, 0x6b, 0x67, 0x31, 0xe2, 0x65, - 0xc4, 0x61, 0x25, 0x25, 0xe2, 0xb5, 0x3d, 0x0c, 0x6c, 0xea, 0xfe, 0x30, 0x1a, 0x36, 0xc3, 0x8f, - 0x9f, 0x0b, 0xf1, 0xce, 0x16, 0xc0, 0x81, 0x32, 0x8a, 0x98, 0xc7, 0x8e, 0x3f, 0x6c, 0x0e, 0xd8, - 0xc9, 0xa4, 0x63, 0xb9, 0xc7, 0xe6, 0xed, 0x55, 0xf8, 0xb2, 0x2e, 0x34, 0xc2, 0x65, 0xb4, 0x2b, - 0x29, 0x23, 0xf3, 0x60, 0xb3, 0xc8, 0x5a, 0x4c, 0xf3, 0x99, 0x73, 0x29, 0x69, 0x41, 0x70, 0x98, - 0x7e, 0xca, 0x67, 0xe9, 0x9b, 0x87, 0xeb, 0x72, 0x0f, 0x92, 0x5a, 0x42, 0xe8, 0x29, 0xa5, 0xcb, - 0x82, 0x3b, 0xd1, 0x53, 0xc6, 0x5c, 0xb7, 0x90, 0xa7, 0xd2, 0xec, 0x01, 0x9c, 0x53, 0x00, 0xa3, - 0xc3, 0x2f, 0x62, 0x1e, 0xf8, 0xd9, 0xab, 0x18, 0x61, 0x11, 0xa3, 0xa2, 0x62, 0x34, 0xa0, 0xf7, - 0x64, 0x39, 0x54, 0xf0, 0x40, 0xfc, 0x94, 0x56, 0x3c, 0x09, 0x05, 0x8d, 0x01, 0x6e, 0x43, 0x24, - 0x3d, 0x47, 0x5b, 0xb4, 0x88, 0xce, 0xa8, 0x81, 0x2d, 0xc7, 0xed, 0x8c, 0xe2, 0xfa, 0xa6, 0x9d, - 0x4a, 0x1d, 0x33, 0xcf, 0x9e, 0xe9, 0x07, 0xed, 0x5e, 0xf0, 0x84, 0x9b, 0x0f, 0xb6, 0xb6, 0x0a, - 0x4e, 0xc8, 0xbf, 0x1b, 0x9e, 0xb9, 0x4c, 0x30, 0xbc, 0x46, 0x89, 0xa0, 0x88, 0x78, 0x42, 0xe6, - 0x87, 0xe0, 0xe3, 0xd3, 0xa7, 0xed, 0x22, 0xea, 0x6d, 0x8f, 0xdd, 0xbc, 0x5b, 0x36, 0x3d, 0xe7, - 0x25, 0xaa, 0xbf, 0xcb, 0xd7, 0x65, 0x88, 0xd5, 0x4e, 0x6c, 0x59, 0x8b, 0x79, 0xb9, 0x95, 0x69, - 0x6c, 0xb2, 0x40, 0x18, 0x7e, 0x2e, 0x6c, 0xfd, 0x0b, 0x6b, 0x97, 0xd0, 0x2f, 0x5e, 0x17, 0xcf, - 0x26, 0x93, 0x3c, 0x7f, 0xfe, 0xfd, 0x9a, 0xd3, 0xe7, 0x56, 0x56, 0x83, 0x0b, 0xa2, 0x46, 0x55, - 0x7b, 0xc7, 0x92, 0x19, 0xef, 0xb7, 0xb7, 0xc6, 0xd1, 0x4f, 0x85, 0xe6, 0x08, 0xfa, 0x0b, 0xbc, - 0x5c, 0x0e, 0xbb, 0xbc, 0x5d, 0x2f, 0x13, 0x1e, 0x50, 0xa3, 0xfc, 0xbd, 0x22, 0xb4, 0xab, 0x48, - 0x67, 0xd6, 0xcd, 0x6e, 0xf4, 0x8c, 0xf3, 0xb0, 0xcc, 0x99, 0x9c, 0x77, 0x6a, 0x92, 0x86, 0x9b, - 0x51, 0xcc, 0xe7, 0x4f, 0x78, 0xc5, 0xf4, 0xd5, 0xb3, 0xca, 0x90, 0x4e, 0xfe, 0x8a, 0x64, 0xd4, - 0x14, 0xd6, 0x6d, 0x38, 0x3c, 0xd3, 0xb6, 0xc9, 0x60, 0x5d, 0x23, 0xcb, 0xd5, 0xac, 0x95, 0x20, - 0x4c, 0x77, 0x31, 0xae, 0x49, 0xfb, 0x19, 0x59, 0x4e, 0xe6, 0x5f, 0x1c, 0x1c, 0xf0, 0x83, 0xdd, - 0x85, 0xdc, 0x11, 0xd5, 0xf8, 0x70, 0x56, 0x1b, 0x4e, 0xbe, 0xce, 0xb3, 0xcd, 0x93, 0x04, 0x54, - 0x69, 0x39, 0x59, 0x22, 0x11, 0xdc, 0x15, 0x4e, 0x7c, 0x2b, 0xe6, 0xea, 0x76, 0xe3, 0xb7, 0x2a, - 0x3f, 0xbf, 0x5d, 0xf5, 0x59, 0x94, 0x96, 0xcb, 0xbb, 0x5d, 0x46, 0xbd, 0x2e, 0x11, 0xde, 0x83, - 0x6c, 0xbd, 0xcb, 0xfd, 0xd8, 0x6c, 0xfe, 0x63, 0xa4, 0x18, 0x71, 0x6c, 0xab, 0x45, 0xe1, 0x53, - 0xa7, 0xe3, 0xe0, 0x0a, 0xed, 0x7a, 0x2e, 0x20, 0xc6, 0x96, 0x31, 0xcd, 0xaa, 0xab, 0x74, 0x79, - 0x03, 0x82, 0xef, 0xd5, 0xd5, 0xd0, 0x16, 0xcd, 0x69, 0x15, 0xde, 0x63, 0x5f, 0x17, 0xad, 0xcd, - 0x15, 0xf3, 0x7f, 0x2f, 0xab, 0xe7, 0x22, 0x9b, 0xa9, 0xd2, 0x30, 0x1e, 0xa2, 0x20, 0x58, 0x12, - 0xa0, 0xb8, 0x27, 0x1e, 0x68, 0xe7, 0xc4, 0x03, 0xbe, 0x1f, 0x6e, 0xa5, 0x7c, 0xa0, 0xef, 0x69, - 0xc3, 0xc2, 0x49, 0x6c, 0x65, 0x66, 0x71, 0xf5, 0x7e, 0xb8, 0xc7, 0xae, 0xf0, 0xd1, 0x96, 0xd3, - 0x05, 0xa8, 0xb9, 0x62, 0xa6, 0x14, 0x96, 0xad, 0xb7, 0xdd, 0x50, 0x7b, 0x4e, 0x0c, 0xb3, 0xdd, - 0x17, 0x81, 0xed, 0x62, 0x10, 0x4e, 0x88, 0x10, 0xa3, 0xa9, 0x2f, 0xcc, 0x21, 0xe3, 0x00, 0xb4, - 0x3c, 0xcb, 0x0c, 0xc2, 0x6a, 0x33, 0x07, 0x58, 0x6e, 0x50, 0x47, 0xe8, 0x65, 0x45, 0x2b, 0xa4, - 0x12, 0x91, 0x91, 0xa4, 0x6d, 0x5c, 0x4c, 0x62, 0x71, 0x9c, 0x92, 0xd8, 0x20, 0x25, 0x2b, 0x3a, - 0x8c, 0x40, 0xa7, 0x62, 0x7f, 0x4d, 0xb8, 0x92, 0xeb, 0x14, 0xc2, 0x94, 0xb3, 0x65, 0xf1, 0x99, - 0x16, 0x86, 0x4c, 0xc1, 0x3a, 0x7f, 0xcf, 0xb2, 0xbb, 0x67, 0xd1, 0xb5, 0xb2, 0x10, 0xcd, 0x93, - 0x94, 0x98, 0x73, 0x19, 0xe9, 0x07, 0x39, 0x4f, 0xc6, 0xaf, 0x55, 0x2e, 0x9c, 0x77, 0xf5, 0xa5, - 0xd2, 0x97, 0x71, 0x92, 0x2c, 0x1e, 0xf6, 0x0b, 0x35, 0xad, 0xf5, 0xe2, 0x2c, 0xaa, 0x5a, 0x3a, - 0x11, 0x73, 0xb6, 0x24, 0x35, 0xe8, 0x32, 0xc4, 0x4a, 0x53, 0xf6, 0xdd, 0x27, 0x38, 0x66, 0x82, - 0xcb, 0x5b, 0xcb, 0x20, 0xf3, 0x8b, 0x94, 0x6c, 0xea, 0x5f, 0xa0, 0xf9, 0xcc, 0xa4, 0xff, 0x36, - 0xca, 0xfc, 0x53, 0xa8, 0x56, 0xe6, 0x8b, 0x4c, 0xcc, 0x21, 0x33, 0x76, 0xbf, 0x78, 0x76, 0xfa, - 0xea, 0x9b, 0x77, 0xc7, 0x47, 0xaf, 0x60, 0xf0, 0x46, 0xce, 0x7c, 0x4e, 0x9f, 0xa9, 0xaf, 0x84, - 0x57, 0xdf, 0xcd, 0x39, 0x6b, 0x8b, 0xe3, 0xc2, 0xa0, 0xde, 0x75, 0x5e, 0xc0, 0x81, 0x46, 0xbc, - 0xed, 0x10, 0x63, 0x40, 0x7d, 0xc0, 0x15, 0x98, 0x3a, 0x3e, 0x35, 0x69, 0xaa, 0x37, 0x11, 0xe7, - 0x03, 0xbf, 0xf0, 0x55, 0xbb, 0xb1, 0xbd, 0xb7, 0x27, 0x91, 0xde, 0x22, 0xa1, 0x25, 0x0e, 0x47, - 0xf7, 0xcb, 0x11, 0x53, 0xf7, 0x83, 0x33, 0x81, 0x7b, 0x5d, 0x48, 0x28, 0x21, 0x0a, 0x65, 0x00, - 0x1e, 0x4c, 0xe6, 0x4e, 0x3f, 0xb6, 0xde, 0x6b, 0x33, 0x24, 0x5f, 0xd2, 0xec, 0x24, 0x63, 0x2f, - 0x9e, 0xe9, 0x0f, 0xe3, 0xe4, 0x92, 0x2f, 0x3a, 0xce, 0x7a, 0xfb, 0x16, 0x77, 0x6a, 0xab, 0x63, - 0x7f, 0x38, 0xd7, 0x77, 0x3a, 0x4b, 0x7f, 0x77, 0x5e, 0xb2, 0x23, 0xcd, 0xf6, 0x4b, 0x05, 0x21, - 0x37, 0x8a, 0xbd, 0x09, 0xd4, 0x04, 0x3e, 0x90, 0xe0, 0x5b, 0xb8, 0x89, 0x83, 0xe9, 0x1a, 0x4d, - 0x05, 0xf3, 0x29, 0x75, 0x35, 0x0e, 0x3c, 0x1c, 0x11, 0x44, 0xa3, 0x91, 0x1f, 0xd3, 0x4c, 0x84, - 0x3e, 0x49, 0xcc, 0xd8, 0x37, 0x87, 0x66, 0x98, 0xa5, 0x71, 0x84, 0xf1, 0x0e, 0xee, 0x4e, 0xc6, - 0x9f, 0x33, 0xda, 0xac, 0xf4, 0xaf, 0x59, 0x87, 0x7f, 0x9d, 0x51, 0x37, 0x66, 0xc1, 0x85, 0x2f, - 0x0f, 0x24, 0x5d, 0x7b, 0xf9, 0x2f, 0xb4, 0x27, 0x4f, 0x62, 0x71, 0xb6, 0x7f, 0x97, 0xbf, 0x9d, - 0xe1, 0x6c, 0xbd, 0x30, 0xe0, 0x17, 0x30, 0x88, 0xa8, 0x3f, 0x29, 0x9a, 0x91, 0x58, 0x27, 0x06, - 0xc9, 0x27, 0x09, 0x9f, 0x66, 0x71, 0x84, 0x63, 0x1b, 0xdb, 0x09, 0xac, 0x9b, 0x59, 0xe8, 0xe9, - 0xad, 0xab, 0x44, 0x21, 0x50, 0x6c, 0x03, 0xc6, 0x06, 0x9c, 0x68, 0xbf, 0x12, 0x39, 0xf2, 0x50, - 0x08, 0xba, 0x89, 0x01, 0x01, 0xe8, 0x2c, 0x0c, 0xd9, 0xb2, 0xca, 0x63, 0xf2, 0x8c, 0x9d, 0x9b, - 0xef, 0xa1, 0x16, 0xf8, 0xb8, 0xb0, 0xf7, 0xbc, 0x7f, 0x66, 0x4e, 0x35, 0x9c, 0xfc, 0x10, 0xa5, - 0xf0, 0x20, 0x08, 0x8b, 0xb7, 0x6f, 0x50, 0xf5, 0x86, 0x06, 0x16, 0x0c, 0xce, 0xf8, 0x36, 0xfb, - 0xe1, 0xec, 0x6c, 0x30, 0x99, 0x27, 0x72, 0x67, 0x7a, 0xd4, 0x1f, 0x14, 0xc7, 0xfe, 0x52, 0x8a, - 0x2a, 0xbe, 0xd5, 0xdc, 0x8c, 0xfa, 0x2f, 0x48, 0x5a, 0xa0, 0x81, 0x08, 0xdd, 0xb9, 0x6a, 0x46, - 0xe4, 0x88, 0x2b, 0x7e, 0xd8, 0x1a, 0x49, 0x3c, 0xc9, 0x0f, 0x13, 0xa6, 0x26, 0x57, 0x7d, 0xfb, - 0xf2, 0x98, 0x56, 0x44, 0xe8, 0x13, 0x12, 0xd8, 0x52, 0x58, 0x1a, 0xe1, 0x15, 0x5f, 0xa8, 0x5e, - 0xb0, 0xac, 0x17, 0x9e, 0x71, 0x18, 0xa6, 0x5f, 0x4c, 0xd2, 0xa9, 0xfe, 0x15, 0xa2, 0xce, 0x6c, - 0x34, 0x90, 0x7f, 0x65, 0x6c, 0x63, 0x06, 0x44, 0xff, 0xca, 0x63, 0x32, 0x9e, 0xe1, 0x47, 0x61, - 0x34, 0xaf, 0xe1, 0xd1, 0x6a, 0xb9, 0x09, 0x9a, 0x01, 0xf1, 0x7b, 0x22, 0x7a, 0x36, 0x68, 0x0d, - 0xb2, 0x69, 0x76, 0xd9, 0x7e, 0xd9, 0x78, 0x7d, 0xf2, 0xc2, 0x45, 0xd8, 0x2b, 0x1b, 0x48, 0xfb, - 0x13, 0x98, 0x56, 0x07, 0x36, 0x8c, 0xe2, 0x5a, 0x4b, 0xd0, 0x29, 0xfa, 0xf7, 0x0c, 0x91, 0xa3, - 0xb8, 0x58, 0x59, 0xde, 0x78, 0xa5, 0x57, 0x34, 0xce, 0x9f, 0x04, 0xe1, 0x42, 0xc0, 0x49, 0x0a, - 0xbf, 0xc8, 0xb3, 0xc9, 0x6c, 0x84, 0x39, 0xf1, 0xe2, 0x8b, 0x33, 0xdd, 0x1f, 0x99, 0xdf, 0x20, - 0x2e, 0x8e, 0xe4, 0x1b, 0x6f, 0x3a, 0xf5, 0x88, 0x26, 0x5f, 0x7f, 0x7f, 0x6a, 0x06, 0x71, 0x0a, - 0x1c, 0x33, 0xce, 0x78, 0x21, 0x4e, 0xa2, 0xe8, 0x62, 0x3e, 0x93, 0x44, 0x0e, 0x3a, 0x76, 0x8e, - 0xef, 0x14, 0x28, 0xf5, 0x17, 0xb4, 0x73, 0x0e, 0x60, 0xd4, 0xce, 0xcd, 0xfc, 0x32, 0xfb, 0xed, - 0x0d, 0xbd, 0x19, 0x1c, 0x67, 0xf4, 0x8b, 0x42, 0xe3, 0xa7, 0x2c, 0x11, 0x66, 0x8b, 0xe0, 0x79, - 0x10, 0x7a, 0xf1, 0x8d, 0x1a, 0xf9, 0x1e, 0x27, 0xd9, 0x94, 0x1b, 0x7a, 0xfd, 0xa4, 0xab, 0x68, - 0x35, 0xdf, 0x24, 0xb8, 0x5a, 0x8b, 0xef, 0xef, 0x74, 0xe1, 0x71, 0x47, 0x35, 0x79, 0x41, 0x8c, - 0xe0, 0x42, 0x8d, 0xab, 0xd3, 0x88, 0x5e, 0x42, 0x61, 0x10, 0xf4, 0xdd, 0xbb, 0x69, 0x85, 0x72, - 0x27, 0x7b, 0xa1, 0x8f, 0x4c, 0xc5, 0x67, 0x69, 0x74, 0x06, 0x80, 0x4c, 0xfa, 0x04, 0x87, 0xfe, - 0x8e, 0x66, 0x21, 0xdf, 0x59, 0x7d, 0xa6, 0xaf, 0x51, 0xa7, 0xfa, 0x67, 0xba, 0xbe, 0x03, 0x26, - 0x04, 0xd4, 0x45, 0x41, 0xb1, 0xef, 0xcf, 0x5e, 0xa9, 0x17, 0x86, 0xb9, 0x48, 0xf7, 0x9f, 0x61, - 0x8e, 0x71, 0xf8, 0x9d, 0xa0, 0xf7, 0x24, 0xc9, 0x20, 0x75, 0x75, 0x7e, 0x3a, 0x5b, 0xea, 0x8b, - 0xe7, 0x9f, 0xf9, 0x97, 0x67, 0xa0, 0x70, 0x20, 0xc9, 0x37, 0x4d, 0xd3, 0x2f, 0x38, 0x55, 0xe9, - 0x9f, 0x23, 0xa8, 0x63, 0xbc, 0xa0, 0xf2, 0x07, 0xa1, 0x4a, 0x7a, 0xbe, 0x0a, 0xc2, 0xb3, 0xab, - 0xf3, 0x94, 0xcd, 0xe8, 0x1a, 0x06, 0xdb, 0xd2, 0xcf, 0xd0, 0x07, 0x79, 0x81, 0x5f, 0x67, 0x93, - 0x60, 0x1a, 0xa4, 0x19, 0x68, 0x0e, 0x42, 0x35, 0x20, 0x85, 0x20, 0xf8, 0x27, 0xa8, 0xbe, 0x38, - 0xc0, 0xbf, 0x3c, 0xaf, 0x1a, 0x21, 0xc2, 0x53, 0x53, 0xbf, 0xd1, 0xf7, 0x26, 0xbc, 0x8f, 0xac, - 0x1d, 0xe6, 0x55, 0xff, 0x0c, 0x49, 0xef, 0x74, 0xaf, 0xe9, 0x69, 0x90, 0x9e, 0xc9, 0x0d, 0x38, - 0xfa, 0x79, 0x8a, 0x23, 0xe0, 0xb3, 0x49, 0xa2, 0x1f, 0xad, 0x2e, 0xe6, 0x17, 0xca, 0x3f, 0x97, - 0xf8, 0xcc, 0x44, 0xe7, 0x47, 0xe1, 0x83, 0xe2, 0x3e, 0xbb, 0x7d, 0x07, 0x31, 0x87, 0xc2, 0x5e, - 0x84, 0x51, 0x9f, 0xb3, 0x11, 0xd4, 0x06, 0x97, 0xfb, 0x70, 0xaf, 0xe1, 0x2c, 0x51, 0x7c, 0x96, - 0xc0, 0x57, 0xbb, 0x70, 0x0a, 0x24, 0x1d, 0x1f, 0x4b, 0x0c, 0x92, 0x24, 0x9d, 0xc4, 0xcf, 0xb2, - 0x29, 0xe9, 0x74, 0x51, 0x4c, 0xe0, 0xd4, 0xfc, 0x4d, 0x02, 0xbb, 0x27, 0x16, 0x01, 0xfb, 0x4a, - 0xb0, 0x77, 0x35, 0x8a, 0xbd, 0xd0, 0x45, 0xb8, 0x0f, 0xb4, 0xf4, 0xf8, 0x6c, 0xc5, 0x0f, 0xf5, - 0x19, 0x07, 0x4a, 0x30, 0x0b, 0x4b, 0x24, 0x50, 0xf7, 0x24, 0x38, 0x9f, 0x7a, 0xb8, 0xc4, 0x21, - 0x0b, 0x26, 0x36, 0xb9, 0xa6, 0x88, 0xa6, 0x69, 0xc9, 0x19, 0x87, 0xf7, 0x2c, 0x6c, 0x37, 0xcf, - 0x99, 0x52, 0xdc, 0xe1, 0xfb, 0xfe, 0x24, 0xba, 0xe2, 0x53, 0x8f, 0x52, 0x4e, 0xeb, 0xa3, 0xef, - 0x4e, 0x18, 0x54, 0x2d, 0x53, 0x13, 0x5d, 0x0d, 0x9c, 0xa5, 0xb5, 0x5c, 0x94, 0x3f, 0xe7, 0x04, - 0x32, 0xf9, 0x17, 0x91, 0x3d, 0xce, 0xd9, 0x86, 0x5d, 0x34, 0x63, 0x9d, 0x1b, 0x6b, 0x76, 0xb5, - 0x08, 0x8e, 0xd4, 0xd6, 0xf7, 0x0a, 0x6e, 0x45, 0xfe, 0xda, 0x82, 0x4f, 0x1d, 0xa9, 0x8d, 0x24, - 0x6c, 0x35, 0x96, 0x65, 0x24, 0x31, 0x16, 0xe0, 0x80, 0xb3, 0x3d, 0x99, 0x5e, 0xb0, 0x84, 0x3c, - 0xb2, 0x53, 0x63, 0x6a, 0x23, 0x3d, 0x88, 0x8b, 0xcb, 0x85, 0x99, 0x40, 0x5b, 0xb8, 0x09, 0x50, - 0x4b, 0xc9, 0x2c, 0xc8, 0xe0, 0xea, 0x3e, 0x76, 0x21, 0xc0, 0x8d, 0x29, 0xc8, 0x86, 0xa1, 0x1f, - 0x49, 0x38, 0x13, 0x19, 0xc7, 0x55, 0xa8, 0x3e, 0x0d, 0x48, 0xe6, 0xfb, 0xfb, 0xbf, 0xfc, 0x1f, - 0xfc, 0xdb, 0xbb, 0xae, 0x6f, 0xa8, 0x35, 0xff, 0x75, 0x01, 0xa9, 0x5c, 0xab, 0x97, 0xc7, 0x9e, - 0x3e, 0xcb, 0x93, 0x74, 0x71, 0x7a, 0x2f, 0xce, 0xc4, 0x95, 0x5d, 0xbf, 0xa4, 0x4f, 0xb8, 0xe2, - 0x79, 0x98, 0xe8, 0x84, 0x39, 0x13, 0x1c, 0x74, 0x71, 0x12, 0x69, 0x90, 0x1f, 0xd3, 0xa6, 0x97, - 0x77, 0x42, 0x0e, 0xe4, 0xe4, 0x94, 0x56, 0xaf, 0x02, 0x54, 0x69, 0xaa, 0xbf, 0xe8, 0x6b, 0x9f, - 0x18, 0x48, 0x10, 0xa6, 0x2e, 0xb2, 0x47, 0xc1, 0x41, 0x0e, 0x45, 0x36, 0x71, 0x63, 0x14, 0x22, - 0xdc, 0xe9, 0xcb, 0xf9, 0xe6, 0x86, 0xe5, 0xb0, 0x1b, 0x5d, 0x24, 0x92, 0x1a, 0xca, 0x53, 0xfd, - 0x38, 0x22, 0xf2, 0xe4, 0x15, 0x64, 0x85, 0xac, 0xea, 0x63, 0x81, 0x40, 0x5f, 0x7e, 0x38, 0x24, - 0x81, 0x26, 0x90, 0xf0, 0x3f, 0xfb, 0x56, 0x14, 0x5e, 0x1b, 0x58, 0x0a, 0x59, 0xd7, 0xf4, 0xb1, - 0x1e, 0x72, 0x66, 0x48, 0xb1, 0x8d, 0x0a, 0xcc, 0x15, 0xe1, 0x61, 0x6f, 0x74, 0x24, 0xe9, 0xee, - 0x2a, 0x78, 0x5c, 0xac, 0x0a, 0xda, 0xc2, 0xdd, 0x7f, 0xb4, 0xe9, 0xad, 0xea, 0xf4, 0x9f, 0x9d, - 0x25, 0x5d, 0x78, 0x0a, 0x07, 0xc1, 0x76, 0xfb, 0x79, 0xbb, 0x78, 0xce, 0x60, 0x72, 0xe6, 0x97, - 0x6d, 0xda, 0x72, 0x54, 0x08, 0xa2, 0xcd, 0xc2, 0xa7, 0x9d, 0x2d, 0x26, 0xba, 0x2d, 0xe0, 0x0d, - 0x76, 0xce, 0xcc, 0xa0, 0x56, 0x3c, 0x5f, 0xcf, 0x6c, 0x77, 0xda, 0x6e, 0xe7, 0xe4, 0x97, 0x6a, - 0x0a, 0x21, 0x6f, 0x61, 0x0c, 0x99, 0x81, 0x5c, 0x19, 0x93, 0x66, 0x39, 0x9d, 0x05, 0xa7, 0x38, - 0x5f, 0x71, 0x2e, 0x87, 0x25, 0xf7, 0x49, 0x39, 0x7c, 0xfe, 0x96, 0x27, 0xf1, 0x29, 0x76, 0xd0, - 0x91, 0xe3, 0x1d, 0xb3, 0xf2, 0xf8, 0x6c, 0xa7, 0x80, 0x17, 0xf0, 0xe6, 0x4d, 0x2e, 0xa1, 0xd7, - 0xb0, 0xa8, 0xf4, 0x46, 0x43, 0x4a, 0x8c, 0xcd, 0x3f, 0x07, 0x58, 0xc2, 0x2a, 0xfa, 0xbc, 0x34, - 0x1d, 0x90, 0x55, 0x6d, 0x71, 0xa4, 0x92, 0x17, 0x08, 0x27, 0x2d, 0xc4, 0x46, 0xb6, 0x9c, 0x25, - 0xa6, 0x48, 0x3b, 0xce, 0x9a, 0xf0, 0x57, 0xb8, 0x9e, 0x0d, 0x3e, 0xba, 0xec, 0xf5, 0x2a, 0x19, - 0x6b, 0x68, 0x73, 0xa6, 0xe5, 0x53, 0xcc, 0xc3, 0x67, 0x65, 0xbd, 0x32, 0x99, 0x1a, 0x82, 0x30, - 0x48, 0x6b, 0xf5, 0x2c, 0x81, 0x1b, 0xbb, 0x89, 0xd1, 0x2e, 0x80, 0x76, 0xdf, 0xc7, 0x51, 0x1f, - 0xa2, 0x60, 0xae, 0xa1, 0xb3, 0x1f, 0x13, 0x87, 0xa1, 0x9b, 0xe4, 0x5e, 0x83, 0x88, 0x7d, 0x04, - 0x21, 0x9e, 0xaa, 0xa3, 0x93, 0xf7, 0x24, 0xf6, 0x20, 0x0c, 0x0a, 0x7e, 0x90, 0x7c, 0x6b, 0xdb, - 0x0c, 0x8a, 0x1b, 0x2c, 0x84, 0x80, 0xd7, 0x68, 0xa8, 0xfd, 0x6d, 0x75, 0xee, 0xa7, 0x72, 0x56, - 0x3f, 0x99, 0x70, 0x0a, 0x51, 0x39, 0x92, 0xc7, 0xc7, 0x19, 0x49, 0x1e, 0x93, 0x1b, 0x89, 0x90, - 0x18, 0x40, 0xb8, 0xbe, 0x1a, 0xfb, 0x92, 0x99, 0x8b, 0xde, 0xc4, 0xde, 0x15, 0xb5, 0x43, 0x7b, - 0x58, 0x71, 0x33, 0x61, 0x0d, 0xf3, 0xe8, 0xbb, 0x17, 0x59, 0xfa, 0xc4, 0x5a, 0x4c, 0x0c, 0x45, - 0xe7, 0x3d, 0xd2, 0x26, 0x9f, 0x9f, 0x81, 0x99, 0x95, 0x7e, 0xd5, 0x5e, 0x9f, 0xef, 0x34, 0x37, - 0xa7, 0xaf, 0xba, 0xde, 0x74, 0xf6, 0x7c, 0x75, 0xb8, 0x2d, 0x4d, 0x9d, 0x38, 0xad, 0xa1, 0xb6, - 0x54, 0xa5, 0x79, 0xf8, 0x16, 0x5d, 0x7f, 0xf7, 0xf6, 0xf5, 0x5f, 0x31, 0x3a, 0x0f, 0x2a, 0x41, - 0xc0, 0xbe, 0xd7, 0xac, 0xc4, 0x34, 0xd5, 0xb3, 0xd0, 0xe4, 0x48, 0x24, 0x5c, 0xce, 0x43, 0xa0, - 0x9d, 0x37, 0x66, 0x7b, 0x72, 0x36, 0xf4, 0xd2, 0x95, 0xad, 0x5e, 0x4d, 0xe7, 0x48, 0x34, 0xe4, - 0x7b, 0x97, 0x1c, 0xa9, 0x3f, 0xce, 0xd4, 0xdf, 0x2c, 0x75, 0x2a, 0x21, 0xcf, 0xcb, 0x76, 0x6a, - 0x9d, 0x39, 0x92, 0x5d, 0x21, 0xfa, 0x3a, 0xa7, 0x86, 0x97, 0xe0, 0x70, 0x32, 0x60, 0x76, 0x5a, - 0x2e, 0x0a, 0x51, 0x5e, 0x67, 0x00, 0x99, 0xc7, 0x23, 0x92, 0x19, 0x34, 0x23, 0xa5, 0x6d, 0x96, - 0x51, 0x57, 0x57, 0x82, 0x42, 0x73, 0x59, 0x31, 0x61, 0xe4, 0x8b, 0x2f, 0x34, 0x9a, 0xf9, 0xce, - 0x29, 0xfe, 0xd5, 0x24, 0xea, 0xc8, 0x92, 0x68, 0x18, 0x54, 0x2c, 0x78, 0x1b, 0xa2, 0x0b, 0x90, - 0x1a, 0xd9, 0x78, 0x3c, 0xf3, 0x73, 0xf1, 0x02, 0x02, 0xc5, 0x5e, 0xbb, 0x83, 0x3b, 0xfe, 0x90, - 0xfc, 0x2f, 0xe0, 0x92, 0x82, 0x27, 0xab, 0x3b, 0x3c, 0x23, 0x75, 0x3d, 0x33, 0xf9, 0xe5, 0xc9, - 0xd5, 0xdd, 0x39, 0xd3, 0x4d, 0xda, 0xbd, 0xd2, 0x17, 0x19, 0x12, 0x41, 0x52, 0xfb, 0xa0, 0xd2, - 0x30, 0xe5, 0x64, 0x80, 0x3c, 0xfc, 0xa3, 0xef, 0xf8, 0x26, 0x41, 0x3b, 0x1d, 0x9c, 0x97, 0xe6, - 0x24, 0xec, 0xea, 0x10, 0x19, 0xce, 0x55, 0xc0, 0xd5, 0x59, 0x84, 0x62, 0x3a, 0x17, 0x38, 0xd8, - 0xf5, 0xc4, 0x41, 0x45, 0xa3, 0x9f, 0xd3, 0x92, 0x20, 0xfe, 0x4f, 0x6f, 0xa7, 0xdc, 0x0a, 0x56, - 0x89, 0xdc, 0xbe, 0xa4, 0xe0, 0x69, 0x85, 0x15, 0x86, 0xf9, 0x63, 0xc1, 0x53, 0xeb, 0xcd, 0xd4, - 0x0a, 0xd6, 0x25, 0x28, 0x80, 0x43, 0x24, 0x51, 0xef, 0x8a, 0x0a, 0x4b, 0x6d, 0x23, 0x0e, 0x2a, - 0xc9, 0xee, 0x4d, 0x82, 0xde, 0x9c, 0xc4, 0xd8, 0xaa, 0xcb, 0x0d, 0x8d, 0xa8, 0xf5, 0x82, 0x24, - 0x9d, 0xf3, 0x88, 0x13, 0x01, 0x7e, 0x82, 0x6f, 0xc7, 0x20, 0xab, 0x9d, 0x2d, 0x8f, 0x7b, 0xb8, - 0x55, 0xe0, 0x7e, 0xf9, 0xcc, 0x3f, 0x02, 0x17, 0xaa, 0x6d, 0xef, 0x67, 0x4c, 0x4d, 0xdb, 0x6f, - 0xb5, 0xbb, 0x82, 0xb8, 0x24, 0xfb, 0x7c, 0x30, 0x69, 0xd2, 0xe8, 0x7d, 0x82, 0xbb, 0x04, 0x5f, - 0x97, 0x14, 0xeb, 0x3b, 0xfe, 0xb4, 0xe3, 0xbb, 0x2a, 0x78, 0x44, 0x58, 0xb6, 0x6f, 0x69, 0xcd, - 0xd4, 0xc9, 0x6e, 0x5b, 0x8a, 0xab, 0x6e, 0x5b, 0xca, 0xf3, 0xe9, 0x60, 0x2b, 0xa5, 0x69, 0xd3, - 0x31, 0xac, 0x0b, 0xa1, 0xa9, 0x0c, 0xb3, 0xe0, 0x1f, 0xae, 0x2d, 0x65, 0xd6, 0x55, 0x83, 0x2d, - 0xdc, 0x5c, 0x29, 0x4b, 0x01, 0xd6, 0x68, 0x9e, 0x47, 0xe6, 0x6a, 0xc4, 0x36, 0x8c, 0x03, 0x11, - 0xa8, 0x90, 0x97, 0x81, 0x24, 0xeb, 0x48, 0x60, 0xba, 0x90, 0xd0, 0xd4, 0x68, 0x06, 0x6f, 0x2a, - 0xea, 0x2b, 0x5c, 0x4c, 0xcd, 0xb6, 0x8b, 0xee, 0x04, 0xde, 0x79, 0x48, 0xac, 0x38, 0x18, 0x30, - 0x91, 0xd2, 0x9b, 0x98, 0x83, 0x72, 0x92, 0x31, 0x5a, 0x42, 0x20, 0x80, 0xaf, 0x33, 0x6c, 0x48, - 0xa0, 0x19, 0x75, 0x2f, 0x13, 0x97, 0xf2, 0xe9, 0x2c, 0xb9, 0xbc, 0x17, 0x0c, 0x72, 0xca, 0x0a, - 0xb3, 0xd5, 0x77, 0x85, 0xd2, 0x70, 0xb3, 0x1d, 0xcd, 0x5c, 0x99, 0x47, 0xcb, 0x03, 0x87, 0x7d, - 0xb2, 0x49, 0x60, 0x1c, 0xa9, 0xee, 0x8a, 0xb9, 0x6f, 0x3e, 0xb7, 0xe0, 0xdf, 0x6d, 0x2c, 0xa7, - 0xa5, 0xec, 0x5e, 0xa1, 0xa2, 0x84, 0xcf, 0x87, 0xfa, 0x67, 0x5a, 0x19, 0xd0, 0x08, 0x5d, 0xae, - 0x4e, 0x14, 0x4a, 0x57, 0xb6, 0x9e, 0x6b, 0x19, 0x34, 0x8b, 0x40, 0x53, 0x41, 0x79, 0x29, 0x1c, - 0x1c, 0xfc, 0x6e, 0xda, 0x03, 0x16, 0x02, 0x6f, 0xfa, 0xdf, 0x6a, 0xe7, 0x14, 0xa7, 0x9c, 0x2d, - 0x96, 0x23, 0x39, 0x08, 0x84, 0xc4, 0x6b, 0x94, 0xfd, 0x1d, 0xaa, 0xce, 0x4f, 0x3e, 0xda, 0x4e, - 0x09, 0x45, 0x27, 0x09, 0x65, 0x35, 0x96, 0x1d, 0x2d, 0x17, 0x2e, 0x38, 0xe9, 0x6e, 0xcf, 0xae, - 0x55, 0x7b, 0xd1, 0x0b, 0xc2, 0x96, 0x18, 0x75, 0x05, 0xac, 0x0c, 0x24, 0x83, 0x0a, 0x87, 0x85, - 0xab, 0xd1, 0x1b, 0xe7, 0x13, 0xa4, 0xb4, 0xe9, 0x47, 0x31, 0xcd, 0x4c, 0xa3, 0xe2, 0xea, 0xf4, - 0x5e, 0xd5, 0x75, 0xea, 0xeb, 0x8e, 0x8b, 0x33, 0x71, 0x73, 0xb6, 0x20, 0x5b, 0x2e, 0x0c, 0xab, - 0xa4, 0x82, 0x6d, 0xd8, 0x77, 0xbe, 0xaf, 0x18, 0xd6, 0x2a, 0x89, 0xd7, 0x68, 0x6a, 0x59, 0x37, - 0x46, 0xb6, 0x17, 0x48, 0xd6, 0x42, 0xe5, 0xad, 0x03, 0x45, 0x8c, 0x97, 0x1c, 0x01, 0x16, 0xfc, - 0x34, 0x8a, 0xa5, 0x3f, 0xb9, 0xbb, 0x2b, 0xb0, 0x75, 0x67, 0x9d, 0xcf, 0xfc, 0xbb, 0x89, 0xe1, - 0xa0, 0xe8, 0x75, 0x82, 0x38, 0xca, 0xe0, 0x77, 0x8e, 0xe8, 0xfb, 0x89, 0xde, 0x15, 0x57, 0x36, - 0xdd, 0x5f, 0xfa, 0x06, 0xee, 0x1f, 0x28, 0x81, 0x57, 0x05, 0x52, 0x5b, 0x2e, 0xae, 0x76, 0x42, - 0x1b, 0xe1, 0x0a, 0x0f, 0xf3, 0xab, 0xe5, 0x90, 0xf1, 0x9a, 0x1d, 0x23, 0x67, 0xbc, 0x42, 0x1f, - 0xe8, 0x47, 0x6a, 0x03, 0xc2, 0xc6, 0xc4, 0xbd, 0xa1, 0x3d, 0x4e, 0x83, 0x83, 0x36, 0xe9, 0xe4, - 0xb1, 0x2e, 0xb8, 0x71, 0xc9, 0x72, 0xaf, 0xe5, 0xc2, 0xd8, 0x5e, 0x04, 0xe4, 0x42, 0x30, 0xd2, - 0x43, 0x82, 0xe8, 0x96, 0x9f, 0xf5, 0xb1, 0xfb, 0xf6, 0x8a, 0xd3, 0x3d, 0x64, 0xe9, 0x2b, 0x05, - 0xe0, 0xe9, 0xc3, 0x27, 0x21, 0x26, 0x90, 0xf0, 0x96, 0x94, 0xd3, 0xc5, 0x56, 0x1c, 0x76, 0xf3, - 0xfe, 0x7e, 0xe2, 0x57, 0xdc, 0xdf, 0x59, 0x15, 0x22, 0x7b, 0x8f, 0x78, 0x58, 0x1d, 0x1f, 0xa4, - 0x2f, 0x5b, 0x5c, 0x1e, 0x32, 0x29, 0x61, 0x46, 0x3a, 0x40, 0xb9, 0x3a, 0x14, 0x36, 0xbe, 0x57, - 0x54, 0xf4, 0x7d, 0xa3, 0xbf, 0xa2, 0x8b, 0xa7, 0xb1, 0x1d, 0x04, 0xdd, 0x8d, 0xed, 0x58, 0x30, - 0xb5, 0x2a, 0x18, 0xec, 0x21, 0xd1, 0x60, 0xf7, 0x0e, 0x07, 0xab, 0x88, 0x07, 0xbb, 0xf2, 0x6e, - 0xfa, 0xbe, 0x37, 0x3d, 0x43, 0xde, 0x8c, 0x33, 0xe9, 0xa5, 0x09, 0xef, 0x2a, 0xc7, 0x77, 0xad, - 0x0f, 0xf0, 0x2a, 0xa4, 0x44, 0x90, 0xd9, 0xb0, 0x43, 0xbb, 0x2a, 0x23, 0xa0, 0x57, 0x04, 0x77, - 0x2d, 0x9d, 0xf0, 0x23, 0xc8, 0xe9, 0xcb, 0xe7, 0x59, 0xd4, 0xeb, 0xea, 0x50, 0x67, 0xc4, 0xa5, - 0x73, 0xc2, 0x5e, 0xfa, 0x97, 0xb4, 0x08, 0xfa, 0x17, 0x66, 0xf4, 0xe4, 0xf8, 0x21, 0xa1, 0xcf, - 0x86, 0x1a, 0xac, 0x18, 0xe6, 0xda, 0xad, 0xb9, 0xb3, 0xf4, 0xae, 0xbe, 0x24, 0x00, 0xda, 0xd6, - 0x35, 0x1f, 0x5a, 0xf7, 0x12, 0x89, 0x49, 0x90, 0x51, 0xfa, 0x61, 0xd5, 0x78, 0x68, 0xcb, 0x2b, - 0x2d, 0xc6, 0x5c, 0x2f, 0xc4, 0xf9, 0x7f, 0x62, 0x8c, 0xff, 0xfd, 0xe2, 0xfb, 0xef, 0xf2, 0x76, - 0x69, 0x3e, 0x2a, 0x42, 0xb3, 0x61, 0x7f, 0xe0, 0xa4, 0x91, 0xba, 0x19, 0x2d, 0x76, 0xe5, 0x17, - 0x48, 0x72, 0x51, 0x3b, 0xad, 0xf8, 0x81, 0xfd, 0x65, 0xfd, 0xdd, 0xa8, 0xd4, 0x40, 0x21, 0x50, - 0xb8, 0x78, 0x0d, 0x89, 0x7d, 0xfd, 0x68, 0xc1, 0x96, 0xcc, 0xce, 0x2c, 0x17, 0x56, 0xba, 0xe1, - 0x85, 0x42, 0x48, 0x67, 0xc3, 0x2e, 0xb1, 0x28, 0xfc, 0xa1, 0xfd, 0x91, 0x05, 0x19, 0x7e, 0xd0, - 0xc1, 0x95, 0x1d, 0x23, 0xb3, 0x20, 0x59, 0x71, 0x9e, 0xa6, 0xb8, 0xf6, 0xc1, 0x6b, 0xfc, 0xf2, - 0xb1, 0xde, 0x3a, 0x77, 0x6b, 0x67, 0xee, 0x80, 0x26, 0x6c, 0x40, 0x3b, 0xfb, 0xf7, 0xb4, 0xfd, - 0xc5, 0x2f, 0xbc, 0xc4, 0xaf, 0xd5, 0xcb, 0x79, 0x19, 0xb8, 0x19, 0x24, 0xa5, 0x23, 0x86, 0x5c, - 0xe8, 0x3c, 0x7f, 0x29, 0x0e, 0xe0, 0xae, 0x8c, 0x75, 0xd0, 0x7f, 0x01, 0xeb, 0xab, 0x83, 0xe0, - 0x73, 0x22, 0x2c, 0x88, 0x2e, 0x97, 0x4f, 0xfa, 0xb4, 0x89, 0x33, 0x2c, 0x89, 0x7a, 0x9f, 0xcd, - 0xce, 0x74, 0x51, 0x6c, 0xe8, 0xfd, 0xc3, 0x3c, 0x46, 0x59, 0x2b, 0x75, 0x5a, 0x48, 0xcf, 0xab, - 0x18, 0x65, 0x0f, 0x1b, 0x83, 0xd3, 0xbb, 0x5f, 0x6f, 0x74, 0x9d, 0x72, 0x6f, 0x4a, 0x9d, 0xd1, - 0xa5, 0xca, 0x1d, 0x69, 0xb5, 0xc4, 0x62, 0x24, 0xfa, 0x3d, 0xa9, 0x4c, 0xb0, 0x81, 0x44, 0x50, - 0x51, 0xd9, 0xb2, 0xc0, 0xe6, 0x0c, 0xda, 0x75, 0x93, 0x2b, 0xc4, 0x48, 0xee, 0xb5, 0x3b, 0xad, - 0xdd, 0xf6, 0x6e, 0x39, 0xf5, 0xa7, 0x6b, 0xa7, 0xba, 0xcf, 0xad, 0x17, 0x30, 0x19, 0x49, 0xd4, - 0x0c, 0x6b, 0x62, 0x6c, 0xec, 0xe1, 0x74, 0x21, 0x9c, 0xad, 0xdf, 0x83, 0x01, 0x66, 0xea, 0x61, - 0x5f, 0x95, 0xbb, 0x8d, 0xf9, 0xe8, 0x27, 0x87, 0x44, 0x5f, 0x75, 0x6c, 0x23, 0x32, 0xaa, 0xe2, - 0x6a, 0x05, 0xce, 0xab, 0xbf, 0x78, 0x29, 0x29, 0xd1, 0x19, 0x90, 0x2c, 0x89, 0x62, 0xb3, 0x3c, - 0x27, 0x5e, 0xbf, 0x97, 0xc3, 0x12, 0x9b, 0xa1, 0xc4, 0x41, 0xca, 0x10, 0x11, 0x22, 0x49, 0x6a, - 0xaa, 0x75, 0xef, 0x49, 0x66, 0x8b, 0x41, 0x53, 0x72, 0x0c, 0xa5, 0x2d, 0x32, 0x81, 0x95, 0xca, - 0x5f, 0x4c, 0x83, 0xb8, 0xbe, 0xa4, 0xc2, 0xf6, 0x57, 0x5f, 0x6e, 0xef, 0x74, 0x2c, 0x10, 0x98, - 0x8d, 0xcc, 0x4c, 0x24, 0x97, 0x37, 0x10, 0x38, 0x33, 0xf3, 0x2c, 0xe6, 0xb0, 0x29, 0xbf, 0x68, - 0x27, 0x3b, 0x27, 0x01, 0x30, 0x81, 0xd1, 0x8e, 0x93, 0xeb, 0xdb, 0x63, 0xcb, 0x2c, 0x67, 0x72, - 0xa5, 0x63, 0x76, 0x09, 0x09, 0xae, 0x1e, 0x61, 0x45, 0xbe, 0x99, 0xab, 0x63, 0x05, 0xba, 0x83, - 0xbc, 0xc5, 0x47, 0x7e, 0x76, 0x3e, 0x65, 0x02, 0x79, 0xaa, 0x4f, 0xfe, 0x80, 0xf0, 0xab, 0x28, - 0xbe, 0x48, 0x54, 0x4d, 0x5b, 0xc4, 0x48, 0xd3, 0x8f, 0xd9, 0x53, 0x4d, 0xce, 0x64, 0xea, 0x2e, - 0x5f, 0x04, 0xa3, 0x0f, 0x49, 0x98, 0x45, 0x06, 0x38, 0xcf, 0xf3, 0x6c, 0x68, 0x92, 0xee, 0x42, - 0xe1, 0xfa, 0x43, 0x1f, 0xa9, 0xab, 0x49, 0x6a, 0x46, 0x9b, 0xd9, 0xd1, 0xa0, 0xb6, 0x9d, 0x09, - 0x8d, 0x81, 0xc4, 0xe4, 0xba, 0x26, 0x63, 0x8a, 0x70, 0x6d, 0x58, 0xda, 0x93, 0x90, 0xbf, 0x79, - 0x83, 0x74, 0xee, 0x71, 0xc0, 0xab, 0x3e, 0x8a, 0x14, 0xe7, 0xda, 0xc4, 0x58, 0xbf, 0x26, 0x81, - 0x95, 0x82, 0x37, 0x67, 0x80, 0x01, 0xfb, 0xe6, 0x7d, 0xe0, 0xfb, 0xe5, 0x61, 0x75, 0x95, 0x54, - 0x40, 0xae, 0xf5, 0x1c, 0xcd, 0x9c, 0x8f, 0x15, 0x09, 0xa6, 0xfb, 0x2b, 0xe4, 0xdd, 0x60, 0x58, - 0x4c, 0x92, 0x4d, 0x88, 0xa6, 0x7d, 0xbd, 0xbf, 0x90, 0xfd, 0x90, 0x5e, 0xf1, 0x69, 0x07, 0xd6, - 0x67, 0x76, 0x07, 0xb7, 0x31, 0x8c, 0xb2, 0x6b, 0x28, 0x40, 0x8a, 0x71, 0x90, 0x73, 0x81, 0x31, - 0xa6, 0xcc, 0x02, 0xb7, 0xf3, 0xf8, 0xde, 0x2d, 0x63, 0x65, 0xb2, 0x89, 0x6b, 0x3b, 0x94, 0x7e, - 0x60, 0x33, 0x54, 0xf1, 0x11, 0xe9, 0x14, 0xca, 0xba, 0xfc, 0x8c, 0x05, 0xa1, 0x72, 0x21, 0xda, - 0x6b, 0xc2, 0x61, 0x6d, 0x76, 0x70, 0x88, 0x8c, 0x0d, 0x43, 0x22, 0x1a, 0xbb, 0x80, 0x49, 0x20, - 0x7e, 0x46, 0x9f, 0xd8, 0x5c, 0x55, 0xae, 0xad, 0x03, 0xca, 0x75, 0xe7, 0xd0, 0x02, 0xf5, 0x83, - 0xfe, 0xf0, 0xa5, 0x80, 0x49, 0xe1, 0xc1, 0x78, 0x30, 0x96, 0x63, 0x06, 0xd8, 0x2e, 0xf1, 0xc1, - 0x69, 0x74, 0x9c, 0x85, 0xd8, 0x80, 0xe9, 0x6b, 0x73, 0xe5, 0xe0, 0x2d, 0xbe, 0xeb, 0x53, 0xf6, - 0xda, 0x38, 0x38, 0x1f, 0x13, 0xad, 0xd5, 0x9d, 0xbb, 0x5e, 0x05, 0x05, 0x70, 0xa6, 0xd9, 0xac, - 0xd5, 0x8a, 0x99, 0xc6, 0x09, 0x98, 0xce, 0x00, 0x30, 0x95, 0xa8, 0xcd, 0xc2, 0xec, 0x4e, 0x27, - 0x72, 0x31, 0xca, 0x45, 0xf1, 0xad, 0x74, 0x45, 0xf6, 0xca, 0x29, 0xab, 0x8d, 0xc0, 0x47, 0xed, - 0x42, 0xdc, 0xe1, 0xa6, 0xcd, 0xab, 0x60, 0x88, 0xb3, 0x9c, 0x6b, 0xfc, 0x1e, 0xf3, 0x21, 0xfe, - 0x96, 0xf3, 0x0f, 0x78, 0x98, 0x7a, 0xd7, 0x67, 0xa3, 0x59, 0x52, 0xaf, 0xf2, 0xdf, 0x97, 0xbb, - 0x0e, 0x0b, 0x17, 0x29, 0x32, 0x7c, 0xeb, 0x6e, 0xc4, 0x8a, 0xeb, 0x13, 0x0f, 0x4c, 0x6f, 0xca, - 0x1a, 0xf7, 0xc6, 0x8a, 0xec, 0x40, 0x8b, 0xfc, 0x4c, 0xcb, 0x22, 0xfa, 0x56, 0x32, 0x4d, 0x46, - 0x4f, 0x2d, 0x29, 0x44, 0x2f, 0x5d, 0xb9, 0xad, 0xd1, 0xc0, 0x29, 0xe5, 0xd9, 0xc9, 0x33, 0x33, - 0xe1, 0xe6, 0xed, 0x98, 0x54, 0xa3, 0x5a, 0xa1, 0x84, 0x9d, 0x15, 0x68, 0xb1, 0x98, 0x49, 0xa0, - 0xe8, 0xaa, 0x4e, 0x45, 0xee, 0xa0, 0x8d, 0xd5, 0x21, 0x89, 0x15, 0xe9, 0x7d, 0x4b, 0x36, 0xc6, - 0x15, 0x7e, 0xe4, 0x26, 0x79, 0x2c, 0xfd, 0xbf, 0x48, 0xd1, 0xf4, 0x82, 0x34, 0x7a, 0x8e, 0xb2, - 0x3f, 0xc4, 0x4f, 0x28, 0xed, 0xfc, 0x03, 0x4e, 0xf9, 0x87, 0x1b, 0xff, 0x3f, 0xfc, 0x96, 0xb3, - 0x1e, 0xf8, 0x48, 0x01, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xbd, 0xdb, 0x76, 0xe3, 0x48, + 0x92, 0x2d, 0xf8, 0xae, 0xaf, 0xf0, 0x54, 0x56, 0x15, 0xc8, 0x12, 0x78, 0xd3, 0x2d, 0x22, 0xc8, + 0x90, 0xa2, 0xe3, 0x96, 0x95, 0xea, 0x8e, 0x5b, 0x4a, 0xca, 0xac, 0xae, 0x15, 0x15, 0x4b, 0x09, + 0x92, 0xa0, 0x88, 0x14, 0x09, 0x30, 0x01, 0x50, 0x97, 0x54, 0xea, 0xac, 0x7e, 0x9a, 0x0f, 0x98, + 0x39, 0x6b, 0xe6, 0x0f, 0xe6, 0xf9, 0xbc, 0xcc, 0xdb, 0x3c, 0x9d, 0xf9, 0x93, 0xfe, 0x92, 0xb1, + 0x6d, 0xe6, 0x0e, 0x38, 0x40, 0x90, 0x94, 0x22, 0x23, 0xbb, 0xfb, 0xf4, 0xea, 0xec, 0xae, 0x10, + 0x01, 0xb8, 0x9b, 0xbb, 0x9b, 0x9b, 0x9b, 0xdb, 0xcd, 0xcd, 0x9f, 0x7e, 0xf5, 0xea, 0xfd, 0xcb, + 0xd3, 0xbf, 0x7d, 0x78, 0xad, 0xc6, 0xe9, 0x74, 0x72, 0xb8, 0xb1, 0xf1, 0x14, 0x7f, 0xd5, 0xc4, + 0x0b, 0xcf, 0x0f, 0x36, 0xfd, 0x70, 0x93, 0xdf, 0xf8, 0xde, 0x10, 0x7f, 0xa7, 0x7e, 0xea, 0xa9, + 0xc1, 0xd8, 0x8b, 0x13, 0x3f, 0x3d, 0xd8, 0xfc, 0xfe, 0xf4, 0x9b, 0xc6, 0xe3, 0xcd, 0xec, 0x7d, + 0xe8, 0x4d, 0xfd, 0x83, 0xcd, 0xcb, 0xc0, 0xbf, 0x9a, 0x45, 0x71, 0xba, 0xa9, 0x06, 0x51, 0x98, + 0xfa, 0x21, 0x95, 0xbb, 0x0a, 0x86, 0xe9, 0xf8, 0x60, 0xe8, 0x5f, 0x06, 0x03, 0xbf, 0xc1, 0x0f, + 0xae, 0x0a, 0xc2, 0x20, 0x0d, 0xbc, 0x49, 0x23, 0x19, 0x78, 0x13, 0xff, 0xa0, 0xd3, 0x6c, 0x33, + 0x9c, 0x34, 0x48, 0x27, 0xfe, 0xe1, 0x95, 0x77, 0xd3, 0xf7, 0xbd, 0xe9, 0xd9, 0xa5, 0x1f, 0x0e, + 0x9e, 0xb6, 0xe4, 0x1d, 0x7d, 0x4c, 0xd2, 0x1b, 0xfe, 0xf1, 0x0f, 0xc1, 0x14, 0x0d, 0xa8, 0x79, + 0x3c, 0xa9, 0x39, 0xe3, 0x34, 0x9d, 0x25, 0xdd, 0x56, 0x6b, 0x44, 0x8d, 0x25, 0xcd, 0xf3, 0x28, + 0x3a, 0x9f, 0xf8, 0xde, 0x2c, 0x48, 0x9a, 0x83, 0x68, 0xda, 0x1a, 0x24, 0xc9, 0xf6, 0xb3, 0x91, + 0x37, 0x0d, 0x26, 0x37, 0x07, 0xff, 0xe8, 0xa7, 0x2f, 0x62, 0x2f, 0x08, 0x93, 0xad, 0xb7, 0x51, + 0x18, 0x75, 0xaf, 0xce, 0xc7, 0xe9, 0x3f, 0xec, 0xb6, 0xdb, 0xbd, 0x3d, 0xfa, 0xdf, 0x3e, 0xfd, + 0xef, 0x51, 0xbb, 0xfd, 0x27, 0x5d, 0xf4, 0xd5, 0xdb, 0xad, 0x13, 0x2f, 0x4c, 0xaa, 0xcb, 0x0c, + 0x83, 0x64, 0x36, 0xf1, 0x6e, 0x0e, 0x92, 0x2b, 0x6f, 0xe6, 0xd4, 0x7b, 0x1b, 0x1b, 0x7f, 0xbe, + 0x9d, 0x7a, 0xf1, 0x79, 0x10, 0x76, 0xdb, 0xbd, 0x99, 0x37, 0x1c, 0x06, 0xe1, 0x39, 0xfd, 0xea, + 0x47, 0xd7, 0x8d, 0x24, 0xf8, 0x05, 0x0f, 0xfd, 0x28, 0x1e, 0xfa, 0x71, 0x83, 0xde, 0xdc, 0x6d, + 0x6c, 0x74, 0xe3, 0x28, 0x4a, 0x6f, 0x37, 0x36, 0x1a, 0x8d, 0xfe, 0x79, 0xf7, 0xeb, 0xb6, 0xd7, + 0xf6, 0x3a, 0xdb, 0x3d, 0x3c, 0x6c, 0xd3, 0xd3, 0xa8, 0xd3, 0xee, 0x3c, 0xa1, 0xa7, 0x81, 0x17, + 0x0f, 0xbb, 0x5f, 0x77, 0x76, 0x3b, 0x7b, 0xdb, 0x6d, 0xfd, 0xd8, 0x18, 0x47, 0x97, 0x7e, 0x4c, + 0x2f, 0x9f, 0x74, 0xbc, 0x6d, 0xaf, 0xc7, 0x00, 0x18, 0x2e, 0xbd, 0xf2, 0xb7, 0xdb, 0x3b, 0x7b, + 0x3d, 0xf3, 0xa2, 0x31, 0x0e, 0xba, 0x5f, 0x6f, 0x7b, 0xdb, 0xc3, 0x5d, 0x29, 0x96, 0xfa, 0xd7, + 0x69, 0xf7, 0xeb, 0xc1, 0xe3, 0x81, 0x37, 0x04, 0x30, 0x3c, 0x36, 0x86, 0xc1, 0xb4, 0xfb, 0xf5, + 0x7e, 0x7f, 0xdf, 0x7f, 0xe4, 0x99, 0x57, 0xfd, 0x38, 0xa0, 0xd1, 0x76, 0xbf, 0xf6, 0xfd, 0x51, + 0x7b, 0xb4, 0xcb, 0x35, 0xbd, 0xc1, 0x80, 0xa6, 0x8f, 0x5e, 0x3d, 0xd9, 0xdd, 0xdb, 0x47, 0x5d, + 0x79, 0xd1, 0x38, 0x9f, 0x44, 0x57, 0xdd, 0xf8, 0xbc, 0xef, 0xd5, 0xb6, 0x77, 0x76, 0xdc, 0xfd, + 0x27, 0xee, 0x93, 0x7d, 0xb7, 0xd9, 0xd9, 0xab, 0x73, 0xa5, 0x49, 0x70, 0xe9, 0x53, 0xfb, 0xdb, + 0x83, 0xbd, 0x3d, 0xbf, 0x27, 0x8f, 0x18, 0x2a, 0x17, 0xdf, 0xd9, 0x75, 0x3b, 0x4f, 0x1e, 0xb9, + 0x4f, 0x76, 0xa9, 0xb8, 0x94, 0x8e, 0xfd, 0x24, 0xf5, 0x62, 0x6a, 0x63, 0xb4, 0xf7, 0xc4, 0x6f, + 0xf7, 0x7b, 0xd9, 0x9b, 0xac, 0xce, 0xf6, 0xee, 0x9e, 0xdb, 0xd9, 0x7b, 0xec, 0x76, 0x3a, 0x59, + 0xa5, 0xfe, 0x64, 0x4e, 0x4d, 0xec, 0xf4, 0x1f, 0x6f, 0x8f, 0xf6, 0x7b, 0xf2, 0x98, 0x15, 0xdf, + 0x7b, 0xe2, 0x76, 0x76, 0xda, 0xee, 0xf6, 0xee, 0xbe, 0x2e, 0x4e, 0x38, 0x07, 0x39, 0xdf, 0x82, + 0x3e, 0x30, 0x23, 0x7e, 0xb7, 0xb3, 0x33, 0xc3, 0x4c, 0xf4, 0xa3, 0xe1, 0xcd, 0x6d, 0xdf, 0x1b, + 0x5c, 0x9c, 0xc7, 0xd1, 0x3c, 0x1c, 0x76, 0x2f, 0xbd, 0xb8, 0x86, 0x89, 0xa8, 0xf7, 0x06, 0xd1, + 0x24, 0x8a, 0xf5, 0x33, 0x70, 0x53, 0xef, 0x71, 0x65, 0x21, 0x8e, 0xae, 0xf3, 0xea, 0xad, 0x02, + 0x75, 0x38, 0x6e, 0x72, 0x93, 0xa4, 0xfe, 0xb4, 0x31, 0x0f, 0xdc, 0x84, 0x9e, 0x1b, 0x89, 0x1f, + 0x07, 0xa3, 0xde, 0x34, 0x08, 0x1b, 0x63, 0x9f, 0x71, 0xd9, 0x69, 0xb7, 0x2f, 0xc7, 0x3d, 0xcc, + 0xdb, 0x88, 0x30, 0xd6, 0xb8, 0xee, 0x8e, 0x83, 0xe1, 0xd0, 0x0f, 0xa9, 0xed, 0x41, 0x34, 0xf4, + 0xdd, 0x59, 0xec, 0xbb, 0xcd, 0x29, 0xd1, 0xe2, 0x6d, 0x01, 0x7c, 0x46, 0xa7, 0x0a, 0x74, 0xea, + 0xb8, 0x28, 0x91, 0xcc, 0xbc, 0x81, 0xdf, 0xcb, 0x87, 0xd0, 0x7c, 0xbc, 0xe7, 0x4f, 0x09, 0x4e, + 0xeb, 0xcf, 0xea, 0x5f, 0xff, 0xfb, 0xbf, 0xd0, 0xff, 0xab, 0x53, 0x7f, 0xe2, 0xd3, 0x22, 0x8c, + 0x6f, 0xd4, 0x0b, 0x2f, 0x36, 0x2f, 0xff, 0xdc, 0xda, 0xd8, 0x68, 0xa6, 0x7d, 0x2f, 0xbe, 0x9d, + 0x45, 0x09, 0x2d, 0xb7, 0x28, 0xec, 0x26, 0x69, 0x30, 0xb8, 0xb8, 0xe9, 0xa5, 0xd1, 0x8c, 0x88, + 0xf4, 0x97, 0x46, 0x10, 0x0e, 0xfd, 0x6b, 0x74, 0xb4, 0x57, 0x81, 0x89, 0xed, 0x7a, 0x2f, 0xa3, + 0xdd, 0x34, 0x8d, 0xa6, 0xdd, 0xce, 0xec, 0x5a, 0x25, 0xd1, 0x24, 0x18, 0x2a, 0x5d, 0x84, 0xbf, + 0xd6, 0x73, 0xb2, 0x57, 0x9d, 0xe6, 0x76, 0xec, 0x4f, 0x7b, 0x1a, 0x01, 0xbb, 0xbb, 0xb3, 0xeb, + 0x9e, 0x5e, 0x2f, 0xdd, 0xd1, 0xc4, 0xbf, 0xee, 0x79, 0x93, 0xe0, 0x3c, 0x6c, 0x04, 0x84, 0xb6, + 0xa4, 0x0b, 0x5a, 0xf2, 0xe3, 0xde, 0xb9, 0x37, 0xeb, 0x76, 0x50, 0x09, 0x3d, 0x18, 0xc6, 0xd1, + 0xac, 0x31, 0x0a, 0x26, 0xf4, 0xa1, 0x4b, 0xf3, 0x1a, 0xd7, 0x3a, 0xdb, 0xb3, 0xeb, 0xfa, 0x9d, + 0x1e, 0x46, 0x83, 0x59, 0xc1, 0x83, 0xd0, 0x75, 0x25, 0x3d, 0xa1, 0x85, 0x6b, 0xa1, 0x8f, 0x9b, + 0x2b, 0xcf, 0xb2, 0x5e, 0x01, 0xf5, 0xde, 0xc4, 0x4f, 0xa9, 0xf9, 0x06, 0x80, 0x60, 0x50, 0x8d, + 0x66, 0x7b, 0x9b, 0x8a, 0x5f, 0x8d, 0xa9, 0xd7, 0xfc, 0xd2, 0xef, 0x86, 0xd1, 0x55, 0xec, 0xcd, + 0x8a, 0xbd, 0x52, 0xf4, 0x29, 0xbc, 0xb5, 0x81, 0xca, 0x6a, 0xa9, 0x17, 0xfa, 0x41, 0xcc, 0x24, + 0xab, 0x96, 0xf8, 0xb3, 0x5b, 0x66, 0x86, 0xc0, 0xab, 0x41, 0xd9, 0x76, 0x9b, 0x7e, 0x2f, 0xce, + 0x85, 0x20, 0x3a, 0xab, 0x0a, 0x04, 0xde, 0xde, 0x07, 0xb1, 0xcd, 0x5d, 0x0c, 0xd5, 0x26, 0x9c, + 0xca, 0xa1, 0x13, 0x3f, 0xa8, 0xaf, 0x1a, 0x21, 0xe0, 0xaa, 0xfe, 0xed, 0x92, 0x85, 0xa1, 0xc7, + 0xb6, 0x6f, 0x8d, 0x6d, 0x48, 0x4c, 0x4e, 0xc6, 0xf6, 0x28, 0x1f, 0x1b, 0x7e, 0x6a, 0x82, 0x8a, + 0xbd, 0x61, 0x30, 0x4f, 0xba, 0x7b, 0xed, 0x3f, 0xf6, 0xd0, 0xfd, 0x46, 0x32, 0x8e, 0x83, 0xf0, + 0xa2, 0x5b, 0x00, 0xd0, 0x8c, 0xc2, 0xc5, 0xf5, 0x69, 0x90, 0xca, 0xfc, 0x75, 0xec, 0x0d, 0x89, + 0x13, 0xb5, 0x55, 0x5b, 0x3d, 0x26, 0xca, 0x2c, 0x14, 0x28, 0x02, 0x1a, 0x8d, 0x16, 0x21, 0xe5, + 0x03, 0x8f, 0x30, 0xd3, 0xe9, 0x0d, 0x21, 0xab, 0x50, 0x8b, 0x59, 0xd7, 0x68, 0x96, 0x2c, 0x56, + 0xc5, 0x97, 0x85, 0x2e, 0xec, 0x53, 0x17, 0xca, 0x5c, 0x8e, 0x78, 0xa2, 0x17, 0x06, 0x53, 0x8f, + 0x97, 0xde, 0x6c, 0x3e, 0x49, 0x7c, 0x40, 0x56, 0xdb, 0x89, 0xf2, 0xbd, 0xc4, 0xa7, 0x3d, 0x70, + 0x84, 0x6d, 0xd0, 0xa7, 0x66, 0xff, 0xe1, 0xc2, 0xbf, 0x19, 0xc5, 0xb4, 0x81, 0x26, 0x2a, 0x2b, + 0x77, 0xdb, 0xfe, 0xa3, 0x4b, 0x4b, 0xf3, 0x8f, 0xb7, 0xa6, 0x83, 0x9d, 0xbb, 0x3d, 0xeb, 0xa9, + 0xb9, 0x77, 0x97, 0xf5, 0x97, 0x49, 0x57, 0xef, 0x43, 0x8d, 0x89, 0x3f, 0x4a, 0xbb, 0xde, 0x3c, + 0x8d, 0xee, 0xb5, 0xf6, 0x98, 0x24, 0x32, 0x40, 0xfd, 0xb4, 0x80, 0xf4, 0x30, 0x0a, 0x7d, 0x3d, + 0x67, 0x4b, 0x57, 0x7f, 0x35, 0x35, 0x19, 0x9e, 0x40, 0x2c, 0x40, 0x75, 0xda, 0x0b, 0x33, 0x0f, + 0xce, 0x30, 0x98, 0xc7, 0x09, 0xd5, 0x9c, 0x45, 0x01, 0x77, 0xc6, 0xa2, 0xd2, 0x47, 0x7b, 0x19, + 0xd9, 0xae, 0x5f, 0xe7, 0x69, 0x4c, 0xdc, 0x57, 0xb8, 0x9b, 0x37, 0x99, 0x28, 0xda, 0x89, 0x12, + 0x7b, 0x38, 0x5d, 0xde, 0x39, 0x6f, 0x75, 0xf3, 0xd5, 0x9d, 0x5d, 0x20, 0xec, 0x22, 0x6f, 0xf5, + 0xfa, 0x49, 0x91, 0xa5, 0xd2, 0x8b, 0xe2, 0xf2, 0xfb, 0xa2, 0xdc, 0x13, 0xb3, 0x22, 0x2b, 0xc1, + 0xeb, 0xdf, 0x9a, 0xaf, 0xcd, 0x47, 0xf4, 0xc9, 0x94, 0x28, 0x61, 0xae, 0x7a, 0x50, 0xf6, 0xda, + 0xdc, 0x2b, 0xf0, 0x3f, 0xda, 0x3e, 0x98, 0xe1, 0x16, 0xba, 0xb7, 0x9d, 0x75, 0x8f, 0x11, 0x3a, + 0xf3, 0x62, 0xa2, 0x91, 0x2a, 0xe4, 0xf6, 0xe6, 0x09, 0xd8, 0x23, 0x6d, 0x38, 0x83, 0x94, 0x09, + 0x44, 0x77, 0x55, 0x23, 0xba, 0x0a, 0x97, 0xf8, 0xdc, 0xf4, 0x06, 0x29, 0xad, 0x9b, 0x4a, 0x16, + 0x59, 0xe8, 0x49, 0xa3, 0xa2, 0x84, 0x86, 0xd1, 0xd0, 0x22, 0x65, 0x86, 0x7c, 0xa6, 0x4f, 0x83, + 0x22, 0x8d, 0x9c, 0xa9, 0x77, 0xdd, 0xd0, 0x7c, 0x95, 0x56, 0x0f, 0xd1, 0x99, 0x11, 0xcf, 0x14, + 0xd6, 0x44, 0x09, 0x92, 0xe9, 0x95, 0x01, 0xd8, 0x9f, 0x44, 0x83, 0x0b, 0x6b, 0xd1, 0x8e, 0xbc, + 0xa1, 0x7f, 0x14, 0xaa, 0xa6, 0x5e, 0xb2, 0xc5, 0x95, 0x2a, 0x1f, 0x6f, 0x47, 0x71, 0x34, 0xcd, + 0x56, 0x65, 0x5b, 0x50, 0x36, 0x8a, 0xe2, 0x69, 0x97, 0x7f, 0x4d, 0xbc, 0xd4, 0xff, 0x5b, 0x6d, + 0x17, 0xdb, 0x58, 0x1a, 0xe5, 0x4b, 0xd9, 0x2a, 0xc6, 0x38, 0x2c, 0x50, 0xdc, 0xb1, 0x3f, 0x20, + 0x8c, 0xd0, 0x98, 0x12, 0x10, 0x5f, 0x81, 0xf6, 0x62, 0x7f, 0xd0, 0x80, 0x34, 0x4e, 0x98, 0x2e, + 0x50, 0xe0, 0x4f, 0x73, 0xda, 0xda, 0x47, 0x37, 0x66, 0x5c, 0x5d, 0x5e, 0x1b, 0x8d, 0xbe, 0x9f, + 0x5e, 0xf9, 0x7e, 0x58, 0xb5, 0xf6, 0x99, 0xef, 0x82, 0xcb, 0x77, 0xf1, 0x4f, 0x71, 0x1b, 0x2e, + 0x90, 0x32, 0xc4, 0xcf, 0xfa, 0x3a, 0x26, 0x50, 0x5c, 0xdd, 0xc4, 0x0b, 0xb3, 0x59, 0x61, 0xfe, + 0xa2, 0x3a, 0x32, 0x33, 0xcc, 0x9f, 0x34, 0xc1, 0x69, 0xc6, 0xc3, 0x23, 0x82, 0xfe, 0x50, 0x1c, + 0x0f, 0xf7, 0xa7, 0x29, 0x7c, 0xa0, 0xd8, 0xd3, 0xfb, 0xed, 0x66, 0xf6, 0x88, 0xfb, 0x34, 0x73, + 0x93, 0x00, 0x84, 0x9a, 0x35, 0x56, 0xb1, 0x9b, 0x65, 0x02, 0xc0, 0xc2, 0xa6, 0x96, 0xd7, 0xe2, + 0x5f, 0x51, 0x71, 0x9f, 0xe7, 0xdd, 0x60, 0xb1, 0x10, 0xed, 0x39, 0x95, 0x3d, 0xd3, 0x25, 0x41, + 0x77, 0x51, 0x98, 0x2c, 0x0e, 0xba, 0x6a, 0xcc, 0xba, 0xce, 0x95, 0x17, 0x17, 0xb8, 0xf3, 0x82, + 0x80, 0xdc, 0x7e, 0x5c, 0x31, 0x51, 0x0b, 0xa5, 0x76, 0x8a, 0x0c, 0x4f, 0x4b, 0xdc, 0xf5, 0x0a, + 0x0e, 0x9d, 0xcd, 0x21, 0xfa, 0xa4, 0x04, 0xdd, 0x15, 0x93, 0x58, 0x9e, 0x92, 0xbb, 0x8d, 0xaf, + 0xd1, 0x5d, 0x5a, 0x66, 0x24, 0x17, 0xa5, 0xc3, 0x66, 0x38, 0x9f, 0xde, 0xf2, 0xf8, 0x79, 0x52, + 0xba, 0x8c, 0x66, 0xa9, 0x43, 0x3d, 0x08, 0x3c, 0xfa, 0x4b, 0x25, 0x48, 0x7a, 0x1e, 0x74, 0xa9, + 0xca, 0x7c, 0x42, 0x7c, 0x9b, 0x9e, 0x93, 0x32, 0x94, 0x38, 0xba, 0x22, 0x76, 0x9e, 0x2c, 0x42, + 0xaa, 0x12, 0x5c, 0x2a, 0xab, 0xaa, 0x26, 0xb6, 0xb7, 0x6c, 0x50, 0x3b, 0x3c, 0xa8, 0x47, 0xa5, + 0x01, 0x3c, 0xda, 0xb6, 0x46, 0xc9, 0x5b, 0x29, 0x17, 0xd4, 0x53, 0xe0, 0x4f, 0x67, 0xe9, 0xcd, + 0xed, 0xea, 0x2d, 0x8f, 0x69, 0xdd, 0xea, 0xa5, 0x59, 0x70, 0xd5, 0xfc, 0x97, 0x67, 0x6a, 0xe8, + 0x25, 0x63, 0x7f, 0xed, 0x9a, 0xba, 0xb3, 0xc4, 0xb1, 0xe6, 0x60, 0x42, 0x92, 0x3c, 0x06, 0x78, + 0x5b, 0xda, 0x0d, 0x2c, 0x96, 0xcd, 0xfd, 0xd4, 0x3b, 0x62, 0x55, 0xd5, 0x25, 0x2c, 0xdb, 0xac, + 0x84, 0x02, 0x4f, 0x3a, 0x21, 0xb1, 0x98, 0x39, 0xd2, 0x89, 0x2f, 0xa4, 0x5b, 0x60, 0x4b, 0x89, + 0xbc, 0xbc, 0xfd, 0x52, 0xdc, 0xa3, 0x8a, 0xca, 0x8c, 0x26, 0x95, 0xeb, 0x51, 0xa6, 0xd9, 0x4a, + 0x8e, 0x58, 0xc1, 0xf3, 0xb2, 0xa9, 0xdf, 0xcf, 0x78, 0x52, 0x09, 0x79, 0xe5, 0xbd, 0xcd, 0x5a, + 0x92, 0x16, 0x5e, 0xf3, 0x51, 0x12, 0x72, 0x93, 0xc5, 0x8e, 0x18, 0x99, 0xa3, 0x0a, 0x19, 0xa2, + 0xc9, 0xd7, 0x17, 0x2b, 0xa9, 0xf1, 0xce, 0xed, 0x02, 0x8d, 0x94, 0x78, 0xd1, 0x72, 0xad, 0x05, + 0x43, 0x26, 0x01, 0xd1, 0x82, 0x3a, 0x18, 0xfb, 0x97, 0x71, 0x89, 0x57, 0x95, 0xa4, 0x03, 0x4d, + 0xf1, 0xa5, 0xd1, 0x65, 0x3b, 0x13, 0xb6, 0x3d, 0x0b, 0x62, 0x93, 0x20, 0x4d, 0xbc, 0x59, 0x42, + 0x84, 0xba, 0xd0, 0x48, 0xbe, 0x9b, 0xc5, 0x51, 0x4a, 0x3b, 0x5e, 0xad, 0xf1, 0xa4, 0x3d, 0xf4, + 0xcf, 0xeb, 0x6b, 0xaa, 0xb3, 0x12, 0x6e, 0x6f, 0xe6, 0xf6, 0x00, 0x44, 0x43, 0x17, 0xd2, 0x80, + 0xc2, 0xba, 0x84, 0x7a, 0x0a, 0x54, 0xfa, 0x4d, 0xe0, 0x4f, 0x86, 0xea, 0x38, 0xba, 0x2a, 0x92, + 0xe7, 0x08, 0xaf, 0xb3, 0x86, 0xce, 0xe3, 0x60, 0xd8, 0xc3, 0x3f, 0x84, 0x8f, 0xe9, 0x0c, 0x1b, + 0x34, 0x64, 0x8e, 0xf9, 0x34, 0x4c, 0x48, 0xff, 0x6a, 0x43, 0x60, 0x1d, 0xc5, 0x2c, 0x2c, 0xac, + 0xa4, 0xa1, 0xbd, 0x8c, 0x86, 0xee, 0x27, 0xe7, 0x65, 0xc2, 0x76, 0xa5, 0x50, 0xa5, 0x61, 0x30, + 0xc3, 0xd9, 0xa9, 0x12, 0xc5, 0xee, 0xcc, 0x30, 0xba, 0x13, 0x2f, 0x49, 0x09, 0xf1, 0x01, 0x8d, + 0xa8, 0xd8, 0xb2, 0x41, 0x20, 0x17, 0x6b, 0x0e, 0xc6, 0x5e, 0x78, 0xee, 0x67, 0x65, 0x00, 0xb9, + 0x51, 0xcd, 0xf7, 0x57, 0xed, 0x28, 0x3b, 0xf5, 0x0c, 0x62, 0x63, 0xe2, 0xf5, 0xfd, 0xc9, 0xed, + 0xba, 0xfd, 0xb7, 0x6e, 0xd6, 0xd4, 0xd8, 0x9f, 0xcc, 0x7a, 0xf7, 0xd6, 0x52, 0x4b, 0xcd, 0xac, + 0x67, 0x4d, 0xcd, 0xbe, 0x37, 0x3c, 0xf7, 0xed, 0xee, 0x60, 0x55, 0xe7, 0x5c, 0x98, 0x90, 0xb8, + 0xb7, 0xa0, 0x77, 0x10, 0x6a, 0x17, 0xd6, 0x14, 0xc3, 0xcd, 0x09, 0x78, 0x3e, 0x9b, 0xf9, 0xf1, + 0x80, 0x44, 0x86, 0xfb, 0x2a, 0x20, 0x25, 0x83, 0x01, 0xe1, 0x4c, 0x46, 0xc3, 0xfd, 0x63, 0xf1, + 0x60, 0x51, 0x5e, 0xe8, 0x55, 0x2a, 0x95, 0x30, 0x3f, 0xe5, 0x35, 0xf5, 0x04, 0xdd, 0xae, 0x9b, + 0xb4, 0xc2, 0x17, 0x01, 0xa1, 0x21, 0x84, 0x9e, 0xae, 0xfc, 0xf5, 0x93, 0x81, 0xb7, 0xe3, 0x8d, + 0x16, 0xa6, 0xba, 0xb3, 0xb7, 0xef, 0x76, 0xf6, 0x77, 0xdc, 0xce, 0xa3, 0x3d, 0x36, 0xe1, 0xdd, + 0x99, 0x39, 0xa0, 0x9a, 0x96, 0x9e, 0x99, 0xbf, 0x25, 0x9d, 0x75, 0x36, 0x4f, 0xdd, 0xfc, 0x59, + 0x78, 0xa5, 0xf5, 0xa2, 0x99, 0x46, 0xe7, 0xe7, 0xb4, 0x2b, 0x69, 0x8e, 0xda, 0xf0, 0x2f, 0x69, + 0xa2, 0x13, 0x43, 0x9b, 0xf9, 0x4a, 0x3d, 0x02, 0xa0, 0xc2, 0x2a, 0x65, 0xd0, 0x1f, 0xd3, 0x9b, + 0x99, 0x7f, 0xb0, 0x89, 0x39, 0xd9, 0xfc, 0xe4, 0xda, 0xaf, 0x48, 0x26, 0xe8, 0xfb, 0x31, 0xbd, + 0x94, 0x26, 0x6f, 0x37, 0x36, 0x2a, 0xad, 0x77, 0x0f, 0xd4, 0x56, 0xf3, 0x6d, 0x9b, 0x88, 0x05, + 0x76, 0x84, 0x0a, 0x31, 0xa8, 0x4c, 0xf1, 0x4b, 0xcc, 0x81, 0xb9, 0x11, 0x50, 0xab, 0x1f, 0xa4, + 0xbb, 0x5b, 0xda, 0xc8, 0xf6, 0x63, 0x28, 0x23, 0xf6, 0x2e, 0x62, 0xa9, 0xa4, 0x46, 0x6d, 0xe5, + 0x01, 0x77, 0x47, 0xd1, 0x60, 0x9e, 0xe8, 0x71, 0xca, 0xc3, 0x6d, 0x34, 0x4f, 0x21, 0xc2, 0xda, + 0x1a, 0x79, 0xb5, 0xa2, 0x54, 0x85, 0xb2, 0xdb, 0xc6, 0x34, 0xfa, 0xa5, 0xe1, 0x11, 0x61, 0x7b, + 0xd4, 0x3c, 0x89, 0x49, 0x18, 0x39, 0xcf, 0x58, 0x75, 0xf9, 0x6e, 0x97, 0xd6, 0x47, 0xff, 0x22, + 0x48, 0x1b, 0xd4, 0x2c, 0x93, 0x36, 0xf6, 0xe2, 0x39, 0x31, 0x99, 0xd0, 0x5d, 0x5d, 0x3e, 0x08, + 0xc3, 0x62, 0xf9, 0x5b, 0xf3, 0xc5, 0x6a, 0x9d, 0xc7, 0x60, 0xb4, 0x32, 0x1a, 0xb4, 0x9e, 0xd0, + 0xd2, 0x56, 0xbc, 0xac, 0x62, 0xf9, 0x39, 0xa7, 0x82, 0x06, 0x69, 0x6d, 0xe7, 0x7e, 0x17, 0x7e, + 0x81, 0xcd, 0xa1, 0x97, 0x7a, 0x5d, 0x7e, 0x6e, 0x25, 0x97, 0xe7, 0x5b, 0xd7, 0xd3, 0x89, 0xfb, + 0xc7, 0x9d, 0x97, 0xf4, 0x53, 0xd1, 0xcf, 0x30, 0x39, 0x60, 0xc7, 0x41, 0xb7, 0xd5, 0xba, 0xba, + 0xba, 0x6a, 0x5e, 0xed, 0x34, 0xa3, 0xf8, 0xbc, 0x45, 0xbc, 0xbf, 0x8d, 0xc2, 0x8e, 0x12, 0x87, + 0x85, 0xd3, 0x69, 0x3b, 0x4a, 0x6c, 0x57, 0x07, 0xce, 0xbe, 0xf3, 0xc7, 0x9d, 0xd7, 0x04, 0x61, + 0xe6, 0xa5, 0x63, 0x35, 0x3c, 0x70, 0xde, 0xb6, 0x55, 0x7b, 0xb2, 0xa7, 0xf6, 0xd5, 0x5e, 0x63, + 0xff, 0x17, 0x47, 0x8d, 0x82, 0xc9, 0xe4, 0xc0, 0xf9, 0xe3, 0xf6, 0x8e, 0x58, 0xd5, 0x9d, 0x96, + 0x94, 0x06, 0x38, 0xfa, 0xb5, 0x69, 0xaf, 0x57, 0x5a, 0xa9, 0x34, 0x00, 0x88, 0x17, 0xfa, 0x97, + 0xfd, 0x2d, 0x33, 0xd4, 0x32, 0x9b, 0x63, 0xbb, 0x56, 0x71, 0xdf, 0x11, 0x53, 0x4f, 0x77, 0x7b, + 0x97, 0x8d, 0xd8, 0xb4, 0x9c, 0x4e, 0x79, 0xb9, 0xa9, 0x93, 0xab, 0x20, 0x1d, 0x8c, 0xb5, 0x7d, + 0xc2, 0xac, 0x40, 0x03, 0xcb, 0xa7, 0x3d, 0x8e, 0xd8, 0x4b, 0xc6, 0x8c, 0x83, 0x10, 0xb4, 0xd4, + 0x10, 0x65, 0x57, 0xa8, 0x73, 0x77, 0xdf, 0x32, 0x42, 0xe2, 0x77, 0xc1, 0x2e, 0xd7, 0x23, 0x5e, + 0x9c, 0x06, 0x03, 0x6f, 0xa2, 0x45, 0xda, 0x29, 0x49, 0x60, 0x13, 0xe8, 0x53, 0xd2, 0x94, 0x70, + 0x85, 0xbc, 0x41, 0xaf, 0x4f, 0x4b, 0x8f, 0x28, 0xa7, 0x97, 0x6b, 0xc5, 0xd2, 0x4a, 0xdb, 0x34, + 0xd1, 0xce, 0xea, 0x82, 0xf3, 0x0e, 0x2e, 0x4a, 0x0a, 0xf8, 0x92, 0x3e, 0x59, 0x0b, 0xfe, 0xeb, + 0x9d, 0x9d, 0x9d, 0xfd, 0xbd, 0x76, 0x69, 0xb5, 0xc2, 0xb6, 0xdf, 0x5b, 0x2e, 0x0f, 0xdb, 0x72, + 0xdb, 0x4e, 0xe2, 0xe6, 0x16, 0x3c, 0x3c, 0xda, 0x06, 0x3d, 0x62, 0xf3, 0x7e, 0xaa, 0xda, 0x0a, + 0x46, 0x91, 0x5d, 0x63, 0xd8, 0x6b, 0xbb, 0xf8, 0xbf, 0xe6, 0x5e, 0xdd, 0x6d, 0x2b, 0xb0, 0x97, + 0xb6, 0x56, 0xad, 0xf6, 0xf6, 0x5c, 0xf3, 0xbf, 0x66, 0x9b, 0x79, 0xa8, 0x3d, 0xb2, 0x6e, 0xb7, + 0xef, 0xd3, 0xbe, 0x82, 0x3d, 0x40, 0x34, 0x73, 0xc7, 0xe9, 0x15, 0x07, 0xbb, 0x88, 0x36, 0x48, + 0x3b, 0x18, 0x89, 0x91, 0x06, 0x34, 0x3e, 0xd8, 0x38, 0xbc, 0xc4, 0x50, 0xfc, 0xf5, 0x63, 0xef, + 0xf1, 0xf0, 0x89, 0x57, 0x61, 0x60, 0xad, 0x96, 0xec, 0x76, 0x12, 0x35, 0x98, 0xf7, 0x83, 0x41, + 0xa3, 0xef, 0xff, 0x12, 0xf8, 0x71, 0xad, 0xb9, 0x4b, 0x9d, 0x77, 0x9b, 0xdb, 0x6e, 0xa7, 0xee, + 0x16, 0xd1, 0x54, 0x34, 0x74, 0x56, 0x61, 0x64, 0xb7, 0x5e, 0xa2, 0x84, 0x2e, 0x89, 0x85, 0x83, + 0x0b, 0x7f, 0xb8, 0x55, 0x9c, 0xe3, 0xfb, 0x58, 0x73, 0x57, 0x61, 0x7e, 0x07, 0x98, 0x6f, 0xb3, + 0x39, 0x51, 0x95, 0xfd, 0x4f, 0x3b, 0xf7, 0x9d, 0x95, 0x55, 0x3d, 0xcc, 0xe6, 0xaa, 0xc2, 0x86, + 0xf3, 0xcf, 0x35, 0xa0, 0xbc, 0xb0, 0xf1, 0x7e, 0x3d, 0x1a, 0x8d, 0xd6, 0x63, 0x67, 0xa7, 0x28, + 0xa1, 0x3e, 0x67, 0xe1, 0x56, 0xbd, 0x60, 0xee, 0x58, 0x94, 0x52, 0x97, 0xdb, 0x04, 0x8a, 0x92, + 0x0d, 0x04, 0xcf, 0x76, 0xaf, 0xec, 0xd3, 0xd1, 0x42, 0x60, 0xa5, 0x2b, 0x27, 0x53, 0xb1, 0x56, + 0xc8, 0xd1, 0x46, 0xe7, 0x42, 0x11, 0xd1, 0x78, 0x72, 0xff, 0x10, 0x0b, 0x25, 0xb6, 0xee, 0xbc, + 0x67, 0x59, 0x23, 0xf5, 0x8e, 0x6b, 0xef, 0x4c, 0x86, 0xfc, 0x56, 0x5a, 0x79, 0x1f, 0x57, 0x29, + 0x38, 0x55, 0xb2, 0xf1, 0xba, 0xfd, 0x56, 0xf7, 0xae, 0x4b, 0x78, 0x83, 0x56, 0x3b, 0xcc, 0x45, + 0x97, 0x9d, 0x3d, 0xd3, 0x7e, 0x18, 0x41, 0x1d, 0x27, 0xed, 0xd1, 0x1f, 0xea, 0xe2, 0xd8, 0x58, + 0x26, 0x37, 0xcb, 0xac, 0xfb, 0x5a, 0x6e, 0x6a, 0xb7, 0xdb, 0x85, 0xe2, 0x22, 0x96, 0x02, 0x5a, + 0x2d, 0x6b, 0xae, 0x6e, 0xc3, 0xf8, 0xba, 0xb3, 0xef, 0xed, 0xec, 0x7a, 0xd5, 0x56, 0xc0, 0x46, + 0x47, 0x7b, 0xb3, 0x00, 0xcf, 0x88, 0x77, 0xcb, 0x24, 0xb9, 0xaa, 0x3e, 0x18, 0x7f, 0xe9, 0xda, + 0x5e, 0x0c, 0x9f, 0x3c, 0x7a, 0xd4, 0xde, 0xbf, 0x47, 0x2f, 0xa8, 0x3a, 0xb4, 0xd2, 0xdb, 0x65, + 0x3e, 0xa7, 0x4a, 0xdb, 0xb8, 0x5d, 0x73, 0x99, 0xae, 0x9b, 0x79, 0xa3, 0x4b, 0xc6, 0xf4, 0x88, + 0xb4, 0x97, 0xa2, 0x35, 0x3d, 0x62, 0x7d, 0x86, 0xe6, 0x98, 0xa4, 0x6b, 0xdf, 0xf2, 0x55, 0x8e, + 0x82, 0x6b, 0x7f, 0xc8, 0xbc, 0x70, 0x8f, 0xd6, 0x55, 0x4f, 0x36, 0xbe, 0x8e, 0x4d, 0x98, 0xb4, + 0x63, 0x17, 0x15, 0x0c, 0xde, 0xb4, 0x86, 0x41, 0x2c, 0x1a, 0x64, 0x57, 0xb4, 0xba, 0xa2, 0x8e, + 0xc1, 0xcd, 0xdd, 0x2e, 0xd7, 0xe2, 0x2c, 0xd2, 0xad, 0xd6, 0x74, 0x78, 0xd5, 0xe7, 0x16, 0x62, + 0x86, 0x07, 0x13, 0xf1, 0x8e, 0x98, 0x88, 0x5d, 0x7e, 0xf1, 0x7e, 0x9e, 0x66, 0x6f, 0xd4, 0x76, + 0xf3, 0x51, 0xa2, 0x68, 0x16, 0xae, 0x08, 0x5d, 0x89, 0x25, 0x11, 0xee, 0xec, 0xb7, 0x4b, 0xea, + 0x08, 0xec, 0xf4, 0x95, 0x9a, 0x60, 0xd6, 0xf3, 0x46, 0x74, 0xb1, 0x60, 0x02, 0xb4, 0xfd, 0xea, + 0x7b, 0xf5, 0xde, 0x32, 0x85, 0xcf, 0x26, 0xec, 0x82, 0xe9, 0xd2, 0x80, 0xf6, 0xe3, 0x78, 0xd1, + 0xbc, 0x58, 0x74, 0xf1, 0x2f, 0x83, 0x6d, 0x38, 0x79, 0xb5, 0xed, 0xde, 0xb2, 0x99, 0x6b, 0x74, + 0xdd, 0xc3, 0x68, 0xae, 0x19, 0xee, 0x3a, 0xab, 0x79, 0x19, 0x36, 0x61, 0xfe, 0xd6, 0xaa, 0xb2, + 0x12, 0x74, 0x91, 0x31, 0x7f, 0x38, 0x52, 0xc7, 0xfe, 0xc8, 0x27, 0x65, 0x7b, 0xe0, 0xc3, 0xee, + 0x4e, 0x7b, 0x45, 0x81, 0x3b, 0xcf, 0x82, 0x06, 0x30, 0x33, 0xbb, 0x2d, 0x1a, 0xa7, 0xc4, 0x4a, + 0x7d, 0x67, 0x97, 0xa8, 0x34, 0xe5, 0x54, 0xa1, 0xab, 0x64, 0xe6, 0xda, 0xaf, 0xe4, 0x88, 0xcb, + 0xd4, 0xd3, 0x05, 0xbd, 0x73, 0x3f, 0xef, 0x06, 0x9b, 0x3e, 0x6f, 0x2d, 0x3d, 0x24, 0x57, 0x19, + 0xd8, 0x06, 0xd3, 0x35, 0x3f, 0xbe, 0x98, 0xbd, 0xbf, 0x64, 0x9d, 0x5b, 0xb4, 0x09, 0x5b, 0x1d, + 0x53, 0xe9, 0xd8, 0x36, 0xe3, 0x82, 0x9a, 0x2a, 0x6d, 0xcd, 0xd5, 0x6e, 0xb5, 0xf5, 0xee, 0xae, + 0xfd, 0xa2, 0xbb, 0xeb, 0x51, 0x66, 0x90, 0xbd, 0x17, 0x1a, 0x77, 0x17, 0x7a, 0x3b, 0xbc, 0xad, + 0xec, 0xdd, 0xfa, 0x2d, 0xb5, 0x24, 0x36, 0x53, 0xd1, 0x12, 0x64, 0x6d, 0x2a, 0x44, 0x13, 0xeb, + 0xac, 0x85, 0xa8, 0x05, 0xed, 0xe3, 0xbe, 0xf1, 0x0f, 0x36, 0x9a, 0x10, 0x23, 0x53, 0xb4, 0xf9, + 0xf1, 0x08, 0xaa, 0x5d, 0xfe, 0x68, 0x68, 0xea, 0xa7, 0xe3, 0x68, 0xf8, 0x39, 0x4d, 0x09, 0x97, + 0x29, 0x63, 0xbf, 0x14, 0x8c, 0x61, 0x9a, 0x19, 0xfa, 0xc9, 0xa0, 0xda, 0x63, 0x88, 0xaf, 0xfe, + 0xb5, 0x37, 0x9d, 0x3d, 0x30, 0xe0, 0xc3, 0x6a, 0xb3, 0x9a, 0x4e, 0x2c, 0xf6, 0xcb, 0x32, 0xf4, + 0x15, 0x4d, 0x55, 0xa3, 0x1f, 0xfb, 0xde, 0x45, 0x97, 0xff, 0x85, 0x94, 0x50, 0x34, 0x54, 0x7c, + 0xb7, 0xe0, 0x84, 0x0b, 0x7e, 0xa6, 0x0d, 0x28, 0x8d, 0xa3, 0xf5, 0xb6, 0x55, 0x59, 0xfa, 0xac, + 0x6d, 0x99, 0xa8, 0xa0, 0xe6, 0x7e, 0xaf, 0xcc, 0x40, 0xb6, 0xcb, 0xe2, 0xdd, 0x97, 0x5a, 0x95, + 0x77, 0xd2, 0x59, 0x6c, 0xae, 0x71, 0x34, 0x59, 0x2a, 0x59, 0x96, 0x3c, 0x6c, 0xa5, 0xee, 0xe9, + 0xd5, 0x4b, 0x70, 0x0a, 0x22, 0xe0, 0x6e, 0x79, 0xeb, 0x5c, 0xde, 0xad, 0xea, 0xc1, 0x2c, 0x9a, + 0x62, 0x7e, 0x93, 0xf4, 0xb8, 0x57, 0x2d, 0x3d, 0xe6, 0x5d, 0x5f, 0x1e, 0x09, 0xb0, 0x7a, 0xf7, + 0xd2, 0xd5, 0x9b, 0x93, 0xc8, 0xc3, 0xc8, 0x2d, 0xc3, 0x58, 0xaf, 0xda, 0xc8, 0x85, 0x0a, 0x24, + 0xa9, 0xcd, 0x27, 0xe9, 0xed, 0x97, 0xf6, 0xa6, 0x56, 0xf8, 0x51, 0x3b, 0xc6, 0xe9, 0x3d, 0xce, + 0x62, 0x8c, 0x6c, 0x76, 0x5c, 0x08, 0x04, 0x59, 0xe8, 0x60, 0xf3, 0x32, 0x48, 0x02, 0x6c, 0x15, + 0x05, 0x95, 0xb4, 0x50, 0x44, 0xcd, 0xe2, 0x82, 0x95, 0xf5, 0xd1, 0x5e, 0xb5, 0xd5, 0xb7, 0x48, + 0xe4, 0x7b, 0x05, 0xe6, 0x42, 0x20, 0x1a, 0x86, 0xbd, 0x10, 0x60, 0x12, 0x5c, 0xfd, 0x7b, 0xac, + 0x1d, 0x71, 0xbb, 0x51, 0x79, 0x52, 0x09, 0x1b, 0xe0, 0xda, 0xcb, 0xbc, 0xa5, 0x15, 0x76, 0xe5, + 0xaa, 0x3d, 0x7a, 0xc1, 0xab, 0x5a, 0x00, 0xae, 0x8d, 0x18, 0x56, 0xf8, 0x00, 0x0c, 0x76, 0xe5, + 0x42, 0x45, 0x35, 0x68, 0xd7, 0x2c, 0x01, 0xb3, 0xd0, 0x3c, 0xea, 0xfc, 0xef, 0xeb, 0x0a, 0xdb, + 0x5f, 0xe2, 0x0a, 0xd3, 0xad, 0x3f, 0xd4, 0x13, 0x66, 0xed, 0x67, 0x5f, 0xc8, 0x15, 0x56, 0xe8, + 0xc8, 0x3d, 0x3d, 0x61, 0x85, 0x3a, 0x6a, 0xbc, 0x7b, 0xbb, 0x4e, 0x4d, 0xac, 0x0c, 0xb4, 0x63, + 0x17, 0x98, 0x6d, 0x58, 0x2c, 0xc1, 0x6d, 0xf2, 0x76, 0xb3, 0xe0, 0xeb, 0x5d, 0xb6, 0x4f, 0x30, + 0xda, 0x45, 0xeb, 0xc8, 0x44, 0x3c, 0x0d, 0xf0, 0xde, 0xbe, 0xb5, 0xfd, 0xbd, 0x75, 0xce, 0xb5, + 0x22, 0xd5, 0xd8, 0x4e, 0xb2, 0x52, 0x5b, 0xab, 0x5c, 0x6c, 0x6b, 0x81, 0x54, 0x3a, 0xda, 0xec, + 0x6f, 0xf7, 0x10, 0x66, 0x8a, 0x54, 0x2f, 0x84, 0xb8, 0xa8, 0x7d, 0x15, 0x43, 0x4a, 0xb4, 0xef, + 0x9c, 0xdb, 0x9a, 0x79, 0x24, 0xa6, 0xc3, 0x71, 0x35, 0xcb, 0x16, 0xd0, 0x8e, 0xb1, 0xb9, 0x7f, + 0x86, 0x25, 0x7f, 0x89, 0x9d, 0xfe, 0x61, 0x72, 0xc2, 0xf6, 0x4a, 0x0f, 0x56, 0x85, 0x09, 0x71, + 0x65, 0x14, 0x54, 0x61, 0x90, 0x9f, 0xb5, 0xdd, 0xf4, 0x96, 0xd8, 0xc8, 0x38, 0xe8, 0xba, 0x2e, + 0xdc, 0xd0, 0xbf, 0x9e, 0x79, 0xa4, 0xfe, 0x0e, 0xff, 0xcd, 0x36, 0x97, 0x15, 0xe1, 0x50, 0x76, + 0x7f, 0xca, 0xeb, 0x76, 0x8d, 0xd6, 0xc3, 0x51, 0x93, 0x95, 0xab, 0xbb, 0x04, 0x16, 0x0f, 0xe2, + 0x5e, 0x8a, 0xa3, 0xab, 0xfb, 0x85, 0xbd, 0xee, 0x57, 0x44, 0xaa, 0x54, 0xc7, 0xd5, 0x54, 0x37, + 0xb4, 0xe0, 0xe9, 0xac, 0xde, 0xf4, 0x34, 0xa7, 0xa0, 0x46, 0xb2, 0x80, 0xb3, 0x05, 0xcb, 0xf9, + 0xfd, 0x88, 0x72, 0x69, 0x4f, 0x64, 0x53, 0xfa, 0xb2, 0x9e, 0xae, 0xdd, 0x7b, 0x7b, 0xba, 0x64, + 0x58, 0x8f, 0xdb, 0xe5, 0xc5, 0x55, 0xe5, 0xf4, 0x5a, 0xe1, 0x63, 0x5a, 0x35, 0xb6, 0x15, 0xbe, + 0x23, 0xf7, 0x7e, 0xf5, 0x16, 0x7c, 0x54, 0xcb, 0x7c, 0x4e, 0x6b, 0x3a, 0xf2, 0x40, 0x47, 0xdb, + 0x2a, 0x58, 0x65, 0xe7, 0xfb, 0xc3, 0xfd, 0xee, 0x7b, 0x55, 0x2d, 0xd0, 0x2a, 0x8c, 0x83, 0xeb, + 0x06, 0x42, 0x17, 0x6e, 0x4b, 0xbe, 0x1c, 0x89, 0x69, 0x20, 0xba, 0xde, 0xcd, 0x45, 0x06, 0x30, + 0xf3, 0x6d, 0x0e, 0x1b, 0x5a, 0x01, 0x48, 0x8b, 0x3d, 0x32, 0xd3, 0xfb, 0xa8, 0xbd, 0x10, 0xba, + 0x54, 0x01, 0x60, 0x4d, 0xf8, 0x9a, 0x6d, 0x4a, 0x7e, 0x6c, 0x29, 0x37, 0xf2, 0x66, 0xff, 0x7e, + 0xda, 0xb3, 0x34, 0xfb, 0x39, 0xce, 0xac, 0x9d, 0xfd, 0x92, 0xa3, 0xa4, 0x14, 0x64, 0x9e, 0xc3, + 0xd5, 0xa3, 0x5f, 0xe9, 0xa7, 0xca, 0x0a, 0x37, 0x12, 0xea, 0xa3, 0x6d, 0xa1, 0xcc, 0x1c, 0x36, + 0xa5, 0xfd, 0x82, 0x9d, 0x18, 0x95, 0x96, 0xf8, 0x4a, 0x1e, 0xbc, 0x5d, 0x72, 0x0c, 0xb3, 0x64, + 0xb0, 0xd0, 0x6c, 0x95, 0x23, 0x69, 0xb1, 0x27, 0x46, 0x00, 0xdf, 0xcd, 0xbc, 0x46, 0xfc, 0x33, + 0xf3, 0x24, 0x69, 0x6e, 0xb8, 0x53, 0xb5, 0xe9, 0xe6, 0x2c, 0x6d, 0xa5, 0x17, 0xa9, 0xd4, 0xbd, + 0xb2, 0x43, 0x65, 0x01, 0x5d, 0xcb, 0xdc, 0x3e, 0x0f, 0x01, 0xb2, 0xda, 0x33, 0xd3, 0xd9, 0xaf, + 0xf0, 0xcc, 0x14, 0xa3, 0xd7, 0x06, 0xa4, 0xff, 0x4e, 0xfa, 0xc5, 0xb3, 0x31, 0x39, 0x0b, 0x49, + 0xcc, 0x67, 0xb3, 0x0e, 0x72, 0xfa, 0x11, 0x2d, 0xba, 0xa2, 0xe8, 0x32, 0xa7, 0x96, 0xc4, 0x70, + 0x54, 0x56, 0x18, 0xcf, 0xa7, 0xfd, 0x55, 0x96, 0xf2, 0xc5, 0x60, 0x95, 0x55, 0x90, 0x96, 0xc9, + 0xd6, 0x56, 0xa8, 0xa9, 0x85, 0x81, 0x37, 0xa2, 0xbd, 0x16, 0xa3, 0xf6, 0x66, 0xcc, 0x73, 0x6f, + 0x57, 0x2c, 0x25, 0xa6, 0x1e, 0x9b, 0xa8, 0xf4, 0xae, 0xb3, 0xbd, 0x5a, 0xba, 0xa0, 0x65, 0xdd, + 0x58, 0x11, 0xe9, 0x6d, 0x11, 0x56, 0x2e, 0x5c, 0xa0, 0x37, 0x24, 0x56, 0x26, 0x0a, 0x9d, 0xa0, + 0x99, 0xaa, 0x3e, 0x1e, 0x81, 0x52, 0x30, 0xf0, 0x2e, 0x88, 0xc3, 0x3b, 0xfb, 0x22, 0x0e, 0x43, + 0x10, 0xd3, 0xaa, 0x7a, 0x03, 0x08, 0xa2, 0x81, 0xad, 0x15, 0x1a, 0xca, 0xd1, 0xd3, 0x25, 0x2d, + 0x69, 0x67, 0xf9, 0xe6, 0x9f, 0x89, 0x1b, 0xd4, 0xec, 0xd3, 0x96, 0x39, 0xa2, 0xf8, 0xb4, 0x65, + 0x4e, 0x4c, 0x42, 0xb8, 0xc6, 0xdf, 0xaf, 0x1a, 0x8d, 0xd2, 0x21, 0xad, 0x46, 0x03, 0xef, 0x87, + 0xc1, 0xa5, 0x1a, 0x4c, 0xbc, 0x24, 0x39, 0xd8, 0x44, 0x80, 0x26, 0x4e, 0x41, 0x2a, 0x55, 0x7e, + 0x2b, 0x47, 0x8c, 0x36, 0xcd, 0xc1, 0xc8, 0xa7, 0x38, 0x6b, 0x74, 0xa8, 0x8f, 0x47, 0xf2, 0xef, + 0xa7, 0x2d, 0xaa, 0x51, 0x5d, 0x35, 0xf1, 0x67, 0x9b, 0xab, 0xbe, 0x03, 0x0f, 0x9b, 0x2a, 0x18, + 0xea, 0x47, 0x42, 0x58, 0x42, 0x93, 0xb1, 0x79, 0x78, 0xf9, 0xb4, 0x7f, 0xd8, 0x78, 0xda, 0xea, + 0x3f, 0xa0, 0x2e, 0x28, 0xd1, 0x0f, 0x87, 0xd4, 0xdc, 0xfa, 0xaa, 0xf7, 0xea, 0xd6, 0xe1, 0xc2, + 0x6b, 0x1c, 0x9f, 0x31, 0x07, 0x73, 0x4c, 0xfd, 0x6f, 0x3e, 0x9c, 0xa8, 0xa7, 0xfd, 0xbc, 0x1b, + 0xfc, 0xe9, 0x3e, 0x5d, 0x57, 0x59, 0x20, 0xec, 0xa6, 0x8a, 0x42, 0x7e, 0x38, 0xd8, 0x4c, 0x38, + 0x90, 0xe2, 0xd4, 0xeb, 0xd7, 0x9c, 0x38, 0x0b, 0xc3, 0x77, 0xea, 0x9b, 0x8a, 0xe7, 0xe0, 0x60, + 0xf3, 0xfd, 0xcc, 0x0f, 0xed, 0x00, 0xfd, 0xd4, 0xeb, 0x6f, 0x1e, 0x1e, 0xbf, 0x7e, 0xa9, 0x2a, + 0xfb, 0x1a, 0x8d, 0x46, 0x16, 0x82, 0x08, 0xa0, 0xe9, 0xf4, 0x8a, 0xae, 0xb1, 0xca, 0x29, 0x84, + 0x40, 0x5f, 0x45, 0xa4, 0x29, 0x14, 0xe8, 0xa7, 0xa1, 0xd5, 0x61, 0xda, 0x97, 0xa3, 0x38, 0x7d, + 0x19, 0xd1, 0x6a, 0x39, 0xaf, 0xd5, 0x37, 0x0f, 0x5f, 0xf3, 0xb3, 0xfa, 0xc7, 0x93, 0xf7, 0xef, + 0x08, 0x07, 0x5c, 0x5b, 0xda, 0xd1, 0x2d, 0x66, 0x7f, 0x99, 0x24, 0x71, 0xb6, 0x65, 0x91, 0x12, + 0xe9, 0x6d, 0x05, 0x25, 0x7a, 0x7d, 0x25, 0xc7, 0x25, 0xaa, 0xd1, 0x95, 0xe8, 0x08, 0x61, 0x42, + 0xd6, 0xa1, 0x89, 0x16, 0x5e, 0x32, 0x4c, 0xc2, 0x59, 0x25, 0x08, 0x6f, 0x16, 0xa0, 0x76, 0xc1, + 0x15, 0x63, 0x81, 0x40, 0x8f, 0x7f, 0x10, 0x83, 0x95, 0xea, 0xdf, 0xa8, 0xa1, 0x3f, 0xf2, 0x60, + 0xc3, 0x52, 0xec, 0x9a, 0x3d, 0xfa, 0xee, 0xa5, 0x37, 0xf3, 0xfa, 0xc1, 0x84, 0x36, 0xf2, 0x5a, + 0x5d, 0x8d, 0x69, 0xdb, 0x48, 0x54, 0x40, 0x53, 0x10, 0x4e, 0x6e, 0xd4, 0xd5, 0xd8, 0x0f, 0x19, + 0x9f, 0xf4, 0x5f, 0x8b, 0x5a, 0x69, 0x5d, 0x76, 0x5a, 0x03, 0x53, 0x3c, 0xc0, 0xa9, 0x2b, 0xde, + 0x49, 0x2f, 0x7d, 0x2a, 0x1b, 0xfb, 0x40, 0x60, 0xa2, 0x62, 0x08, 0x96, 0x09, 0x6d, 0x45, 0xea, + 0xe0, 0xe0, 0x40, 0x8d, 0xbc, 0x49, 0xe2, 0xf7, 0x14, 0xcb, 0x6e, 0x34, 0x32, 0x03, 0x4c, 0x0c, + 0x30, 0x6a, 0x4a, 0x8a, 0x91, 0xf2, 0x42, 0x3e, 0xd6, 0x4c, 0x45, 0x83, 0xc9, 0x3c, 0xf6, 0x15, + 0x6d, 0x4e, 0x83, 0xb1, 0x4a, 0xc7, 0x3e, 0x88, 0x04, 0xa4, 0xa0, 0x68, 0xa4, 0x63, 0x15, 0x46, + 0x8a, 0x16, 0xb2, 0xc2, 0x6a, 0x69, 0x32, 0xee, 0x2b, 0x90, 0xc3, 0x24, 0xe3, 0xf5, 0x31, 0xd5, + 0x8d, 0xe0, 0xe7, 0x6a, 0x64, 0x05, 0x3f, 0x03, 0x57, 0x47, 0x88, 0x71, 0x52, 0xdf, 0xcd, 0x3d, + 0x8c, 0x7b, 0x05, 0xba, 0x6d, 0x88, 0x39, 0x61, 0xdf, 0x83, 0xf0, 0x0f, 0x73, 0x62, 0xaf, 0x26, + 0x21, 0xf6, 0xe8, 0xbe, 0x34, 0xfe, 0xdb, 0x0a, 0x6a, 0x2a, 0x3a, 0x78, 0x75, 0x57, 0xf0, 0x32, + 0xc9, 0x59, 0x80, 0xa1, 0xc6, 0x6e, 0x1e, 0x68, 0x5e, 0x45, 0x96, 0x86, 0x43, 0x67, 0x84, 0x68, + 0x86, 0x65, 0x88, 0x6f, 0x91, 0x6c, 0x4b, 0x7b, 0x81, 0x54, 0x31, 0xc5, 0x1b, 0xfa, 0x6b, 0x91, + 0xd5, 0xe8, 0x7d, 0xd1, 0xf4, 0x2e, 0xdb, 0x3b, 0x07, 0xbc, 0xc8, 0xe6, 0x31, 0xef, 0x57, 0xcd, + 0x66, 0xb3, 0x84, 0xee, 0x02, 0x60, 0x6c, 0x4d, 0x9b, 0x8a, 0x37, 0x84, 0x83, 0x4d, 0xdb, 0xf2, + 0xb2, 0x8c, 0xed, 0x69, 0x91, 0xba, 0xd4, 0xbf, 0xec, 0x6d, 0x25, 0xa4, 0x4a, 0x1e, 0x41, 0x33, + 0xac, 0xb2, 0x80, 0x05, 0x01, 0x67, 0x3d, 0x9a, 0x78, 0x81, 0x7c, 0xe2, 0xf9, 0xc3, 0x4b, 0x56, + 0x58, 0x12, 0x30, 0x90, 0xe7, 0x78, 0x56, 0xfa, 0x45, 0x81, 0x85, 0x2c, 0x6d, 0x4a, 0xeb, 0x34, + 0x36, 0x35, 0x79, 0x97, 0xfe, 0xf3, 0x70, 0x78, 0x2c, 0x1f, 0x00, 0xf6, 0x84, 0xde, 0xa8, 0x3f, + 0x79, 0xd3, 0x59, 0x4f, 0xe9, 0xb7, 0xf7, 0x83, 0xad, 0xe3, 0x0c, 0x2c, 0xd8, 0xfa, 0x8d, 0xd5, + 0xe5, 0x57, 0xf2, 0xe6, 0x73, 0x01, 0xa2, 0xfb, 0x24, 0x5c, 0xbe, 0x12, 0x7e, 0x02, 0x88, 0x06, + 0xdd, 0x4b, 0x74, 0xec, 0x15, 0x16, 0x1c, 0xac, 0x17, 0x86, 0xa6, 0x0c, 0xb8, 0x72, 0xaf, 0xb0, + 0x63, 0x1b, 0xf8, 0x0b, 0x47, 0x36, 0xef, 0x67, 0x73, 0x90, 0x59, 0x15, 0x25, 0x93, 0x96, 0xc4, + 0x3c, 0x4c, 0x41, 0x55, 0x2c, 0x0a, 0xac, 0x62, 0xf5, 0xdd, 0x92, 0x93, 0x7b, 0xd5, 0x0a, 0xcb, + 0x97, 0x16, 0xb1, 0xcb, 0xcd, 0x52, 0xb9, 0xcc, 0xd3, 0x2d, 0xd9, 0x21, 0x76, 0x0e, 0x5f, 0xda, + 0x2b, 0x83, 0xa4, 0x9f, 0x1d, 0xce, 0xe6, 0xc0, 0x3e, 0x4e, 0xab, 0x0a, 0xbf, 0xa0, 0x9e, 0xa6, + 0x2c, 0x1d, 0x3d, 0x4d, 0x63, 0xfc, 0x3c, 0x7c, 0xcb, 0xbe, 0xc6, 0xa7, 0x2d, 0xfa, 0x89, 0xc7, + 0xd7, 0xe1, 0x90, 0xf5, 0xa8, 0xec, 0xc5, 0x2b, 0x9f, 0x04, 0xdf, 0x60, 0x26, 0x90, 0xf5, 0x3b, + 0xc2, 0xf1, 0x8c, 0x96, 0x85, 0xaf, 0x5e, 0x8b, 0x8f, 0x50, 0x3e, 0xb4, 0x00, 0xb1, 0x65, 0xa0, + 0x1b, 0xd1, 0x8b, 0x9b, 0x19, 0xda, 0xfd, 0x10, 0xef, 0xe6, 0xe6, 0xe1, 0x5f, 0x5e, 0x9f, 0x52, + 0xf1, 0x61, 0xf9, 0x33, 0xbc, 0xac, 0x9b, 0x87, 0x66, 0x9b, 0xd0, 0x12, 0x51, 0x55, 0x41, 0xd8, + 0x93, 0x79, 0xbd, 0x28, 0x5d, 0xc8, 0x55, 0x5a, 0x06, 0x52, 0x08, 0x90, 0x75, 0x19, 0xdd, 0xec, + 0x7c, 0xa3, 0x65, 0xac, 0x56, 0x00, 0xd2, 0x9e, 0xce, 0xcd, 0xc3, 0xdb, 0xcd, 0xe8, 0x62, 0x93, + 0x54, 0x9b, 0xb9, 0xef, 0x72, 0x08, 0xeb, 0x66, 0xf7, 0x16, 0xeb, 0xf3, 0xcc, 0x88, 0x65, 0xdd, + 0xcd, 0x76, 0x73, 0xa7, 0xb9, 0xbb, 0xe9, 0x6e, 0x1a, 0x61, 0xab, 0xbb, 0x89, 0xb5, 0xb4, 0xef, + 0x6f, 0xde, 0xdd, 0x09, 0x64, 0x20, 0xe1, 0xb7, 0x8f, 0x5a, 0x58, 0xdd, 0xf2, 0x41, 0x7f, 0x33, + 0x9f, 0x4c, 0x8a, 0xfc, 0x50, 0x79, 0x89, 0x16, 0x3a, 0x1e, 0x38, 0x3e, 0x81, 0x42, 0xbf, 0x88, + 0xa3, 0xde, 0x7d, 0xe1, 0x51, 0x58, 0x5b, 0xfc, 0x8a, 0xb1, 0xf0, 0xa1, 0x11, 0x9c, 0xdd, 0x43, + 0x97, 0x64, 0x93, 0x9e, 0xce, 0x53, 0x2d, 0x4b, 0x40, 0x0f, 0x89, 0x1e, 0x3c, 0x28, 0x36, 0x06, + 0x25, 0xf8, 0x75, 0x49, 0x82, 0x48, 0xd4, 0x6e, 0x42, 0x2a, 0xa5, 0xa7, 0x1c, 0x2e, 0xcd, 0x1c, + 0x24, 0x59, 0x9a, 0xb7, 0x2f, 0x3b, 0xe6, 0x69, 0x34, 0x5c, 0x35, 0xd8, 0x13, 0x3f, 0x4c, 0xa2, + 0x58, 0xa1, 0x94, 0xf2, 0xf9, 0xdc, 0x9d, 0xcc, 0x1e, 0x8f, 0x9a, 0x18, 0x21, 0xcc, 0x08, 0x4c, + 0xc9, 0x24, 0x56, 0xbb, 0x24, 0xd2, 0x0c, 0xf5, 0x56, 0xab, 0x48, 0x19, 0x62, 0xd8, 0x0f, 0x46, + 0x85, 0x18, 0xc9, 0xfd, 0xe1, 0x19, 0x41, 0xd8, 0xec, 0xb6, 0xdd, 0xfc, 0x05, 0xc0, 0x6d, 0x76, + 0xb7, 0xdd, 0x4d, 0xfa, 0x42, 0xd8, 0xf9, 0x78, 0xbb, 0x69, 0x8a, 0xf0, 0x20, 0xf8, 0x0d, 0x47, + 0x7a, 0xf1, 0x3b, 0x56, 0x48, 0xa9, 0xf8, 0xde, 0x3e, 0x3d, 0x88, 0x4a, 0xba, 0x49, 0x3a, 0xe9, + 0x2e, 0x8a, 0x7b, 0xd7, 0x67, 0x8c, 0xe0, 0x27, 0xf4, 0xc0, 0xe3, 0xec, 0x6e, 0x12, 0x35, 0x6d, + 0xde, 0x7d, 0xa2, 0xff, 0xfb, 0xa2, 0xd8, 0x3d, 0xf7, 0xd3, 0x67, 0x4f, 0x83, 0x43, 0xd2, 0x47, + 0x9f, 0xb6, 0x82, 0xc3, 0xe5, 0x68, 0xfe, 0x8b, 0x4f, 0x32, 0x8a, 0x4a, 0x68, 0x0f, 0x07, 0x0b, + 0x64, 0x0a, 0x57, 0x4c, 0x13, 0xb4, 0x83, 0x4c, 0xe6, 0xfe, 0xe7, 0xd1, 0x13, 0x8d, 0xca, 0xa2, + 0x26, 0x77, 0x93, 0x41, 0x6d, 0x76, 0xf7, 0xdb, 0x5f, 0x76, 0x8c, 0x49, 0x36, 0xc6, 0x03, 0xdd, + 0xd9, 0x55, 0x23, 0x25, 0x79, 0xad, 0x30, 0xc0, 0xa6, 0x7a, 0x03, 0x72, 0x91, 0x05, 0x20, 0xa2, + 0xb9, 0x0a, 0xa6, 0x53, 0x7f, 0x18, 0x90, 0x96, 0x3e, 0xb9, 0xe9, 0x29, 0x2d, 0x2c, 0x98, 0x12, + 0x88, 0xf7, 0x8d, 0x7d, 0x08, 0xce, 0x67, 0xa4, 0x5a, 0x41, 0xce, 0xfa, 0xad, 0xc8, 0xe9, 0x07, + 0xc4, 0x70, 0x53, 0x3f, 0x47, 0xd0, 0x2e, 0x42, 0x28, 0xbf, 0x28, 0x8a, 0x62, 0x23, 0xc1, 0x2c, + 0xc3, 0xca, 0xb1, 0x0f, 0xc9, 0x32, 0x43, 0x4c, 0x1c, 0x4d, 0x21, 0x79, 0x5d, 0xf0, 0x82, 0x92, + 0xd1, 0xb2, 0x62, 0x30, 0x02, 0x1b, 0xa5, 0xbd, 0x38, 0x82, 0x7f, 0x72, 0x16, 0xcc, 0xf8, 0x9c, + 0xf2, 0x83, 0xc7, 0x2f, 0x00, 0xe5, 0x6d, 0x61, 0x9c, 0xbf, 0x75, 0x98, 0x1e, 0x49, 0xa1, 0xe9, + 0xbc, 0x7a, 0xcd, 0xcb, 0x38, 0x65, 0xae, 0xe7, 0xf0, 0x35, 0x9a, 0xc2, 0xaa, 0x16, 0xfa, 0x3e, + 0xa6, 0x5e, 0x3f, 0x37, 0xfd, 0x50, 0x24, 0xce, 0x2d, 0xa2, 0x83, 0xb9, 0x79, 0xea, 0xa9, 0x13, + 0xec, 0x5b, 0xaf, 0x59, 0x3f, 0xab, 0x3f, 0x78, 0xc8, 0x34, 0xb3, 0xc1, 0xd0, 0xbc, 0x84, 0xb4, + 0x4c, 0x20, 0xcd, 0x23, 0xac, 0x64, 0xaf, 0x7c, 0xda, 0x51, 0xda, 0xcd, 0x3d, 0xe2, 0x2d, 0x50, + 0x6b, 0xf8, 0xb1, 0xd1, 0x6e, 0x12, 0xaf, 0xb9, 0xf1, 0xae, 0xf8, 0xa9, 0xd3, 0x7c, 0xf2, 0xbb, + 0xe0, 0x8a, 0x36, 0x9d, 0x49, 0xd0, 0x07, 0x01, 0x9e, 0x4d, 0x7c, 0x52, 0x28, 0x97, 0xe3, 0xee, + 0xdb, 0x88, 0xd8, 0x01, 0xa8, 0x60, 0xe0, 0x81, 0x0d, 0x2b, 0x2e, 0xde, 0x55, 0x24, 0x27, 0xc7, + 0xa4, 0xd3, 0x25, 0xea, 0xbf, 0x75, 0x10, 0x42, 0x1a, 0x8d, 0x14, 0x44, 0xcb, 0x89, 0x0b, 0x09, + 0xf4, 0x92, 0x5e, 0x83, 0x84, 0x66, 0x90, 0x07, 0x48, 0x81, 0xca, 0x91, 0x9c, 0xc6, 0xc1, 0xf4, + 0x58, 0x06, 0xde, 0xc2, 0xef, 0x0f, 0x7a, 0xd8, 0xaa, 0x66, 0xd6, 0x5b, 0xec, 0xff, 0x3c, 0x0f, + 0x62, 0x7f, 0xf8, 0x70, 0x64, 0x5b, 0xb0, 0x09, 0x8b, 0xdb, 0x4d, 0x30, 0x60, 0xbb, 0x0d, 0x62, + 0xca, 0xed, 0xe6, 0xee, 0x8e, 0xbb, 0xa9, 0x9b, 0x3a, 0xd6, 0x2d, 0x55, 0x50, 0x24, 0xc9, 0xa4, + 0x22, 0x98, 0xd1, 0x5f, 0xd0, 0x81, 0x2d, 0xa5, 0xae, 0x12, 0x30, 0x5f, 0xeb, 0x35, 0xf2, 0x52, + 0x42, 0x99, 0xfe, 0x73, 0x89, 0x98, 0xc4, 0xcd, 0xd7, 0x0a, 0x5c, 0x46, 0xc2, 0xa6, 0x75, 0x04, + 0x83, 0x17, 0x73, 0x36, 0xe1, 0x2b, 0x49, 0x66, 0x6b, 0x79, 0x28, 0xdb, 0xc4, 0x8e, 0xf9, 0xa5, + 0x37, 0x0f, 0x8c, 0x05, 0x72, 0xcd, 0x0a, 0x79, 0x79, 0x90, 0xce, 0xbd, 0x09, 0x9b, 0xf1, 0x32, + 0xd6, 0x87, 0x21, 0xd5, 0xa6, 0xde, 0x0d, 0x31, 0xc9, 0x11, 0x69, 0x27, 0x32, 0x30, 0x41, 0x49, + 0xfd, 0xf3, 0xc6, 0xb5, 0xf7, 0xe4, 0x0b, 0x8d, 0x0b, 0xcb, 0x86, 0xc8, 0xba, 0x15, 0x0c, 0xe3, + 0x15, 0x22, 0x64, 0x14, 0x0f, 0xc4, 0x00, 0x64, 0x76, 0x3a, 0x75, 0xf4, 0xea, 0x58, 0x19, 0xb3, + 0xf5, 0x83, 0x87, 0x40, 0x8d, 0x7d, 0xc1, 0xc5, 0x73, 0x74, 0xf2, 0x41, 0x6b, 0xde, 0x25, 0x6b, + 0xd1, 0x7f, 0xa6, 0x45, 0xe4, 0xad, 0x22, 0x39, 0x52, 0xad, 0xe1, 0xc0, 0x8c, 0x12, 0xd8, 0xe5, + 0x68, 0x7e, 0xce, 0xc3, 0x08, 0xc7, 0x66, 0x92, 0xae, 0x4a, 0xc6, 0x73, 0xc4, 0xff, 0xba, 0xea, + 0xdc, 0x0b, 0x48, 0xea, 0x9d, 0xf0, 0xb9, 0x3b, 0x5e, 0x5d, 0x2e, 0x8c, 0x7d, 0xe9, 0xc3, 0xe7, + 0xce, 0xb4, 0x73, 0x36, 0x27, 0x32, 0x7c, 0xbc, 0xb3, 0xb3, 0x83, 0x0d, 0x0a, 0x42, 0xf7, 0x19, + 0x9a, 0xa0, 0x8d, 0xa7, 0xbd, 0xbd, 0xeb, 0xb2, 0xae, 0xf3, 0x25, 0xd7, 0x9d, 0x77, 0xd5, 0x5f, + 0x3d, 0x7e, 0x25, 0x01, 0x79, 0x7d, 0x6f, 0xc2, 0x0e, 0x71, 0x25, 0xe7, 0x4e, 0x71, 0x02, 0x1e, + 0x2a, 0x00, 0xf5, 0xd7, 0x55, 0xc7, 0x7f, 0x79, 0xc1, 0x68, 0x48, 0x78, 0xe8, 0xa2, 0xa6, 0x7c, + 0x86, 0x3a, 0x47, 0x70, 0xcf, 0x00, 0x97, 0x16, 0xe1, 0x5e, 0x9b, 0xb6, 0x0a, 0x33, 0x70, 0x92, + 0xdc, 0xbf, 0xfc, 0xb8, 0x83, 0x9f, 0x97, 0x0f, 0xfb, 0xbb, 0xb9, 0x1f, 0xdf, 0x28, 0x84, 0xec, + 0x60, 0x05, 0x1c, 0x7d, 0xa7, 0x38, 0x3a, 0xc7, 0xa7, 0xe9, 0x4e, 0x44, 0xdf, 0x19, 0xcc, 0x63, + 0x9c, 0xad, 0x97, 0xf9, 0x7e, 0x28, 0x03, 0x65, 0x75, 0x85, 0xe0, 0xb1, 0x22, 0x47, 0x54, 0x13, + 0xfa, 0x89, 0x25, 0x94, 0xef, 0xb5, 0x49, 0xf5, 0xf8, 0xb2, 0x03, 0x35, 0x82, 0x39, 0xb7, 0x7a, + 0x5f, 0xd1, 0x3c, 0x53, 0x42, 0xec, 0xe1, 0x37, 0xd5, 0xab, 0x28, 0x45, 0x18, 0xa6, 0xe8, 0x7e, + 0x23, 0x22, 0x84, 0x64, 0xde, 0x6f, 0x68, 0x89, 0xbc, 0xe6, 0x37, 0xcf, 0x9b, 0x42, 0x1f, 0xec, + 0x65, 0x6b, 0xde, 0x9c, 0x45, 0xa3, 0x24, 0x3d, 0xd8, 0x6e, 0xb7, 0x1f, 0xce, 0x8c, 0x0d, 0x8a, + 0xc4, 0x0c, 0x92, 0xa4, 0xbf, 0x9f, 0xda, 0x42, 0x08, 0x12, 0x5f, 0xc8, 0x59, 0x3f, 0x58, 0x61, + 0xae, 0xd1, 0xfe, 0x11, 0xc8, 0x5d, 0xbc, 0x05, 0x81, 0x34, 0x78, 0xa1, 0x2b, 0x5a, 0x23, 0x9e, + 0xfa, 0xf0, 0xdd, 0x69, 0x14, 0x4d, 0x90, 0x2b, 0x26, 0x08, 0x49, 0xba, 0x52, 0xad, 0x74, 0x3a, + 0x6b, 0x05, 0xc9, 0xec, 0x4c, 0x60, 0xe3, 0x75, 0x53, 0xbd, 0xfc, 0x61, 0xbf, 0xd3, 0x66, 0xc9, + 0xf5, 0x33, 0xf0, 0x01, 0x25, 0x76, 0xb3, 0x02, 0x2c, 0x8c, 0x3a, 0x37, 0x29, 0xd4, 0x5e, 0x52, + 0x6a, 0x1f, 0x3d, 0xda, 0xbd, 0xaf, 0x74, 0xfa, 0xe1, 0xfd, 0xc9, 0xfd, 0xb0, 0x23, 0x79, 0x53, + 0x97, 0x63, 0xe6, 0x05, 0xfc, 0x15, 0x0d, 0x9d, 0x5d, 0xb5, 0xb8, 0x5a, 0x78, 0x3f, 0x86, 0x75, + 0x47, 0xd5, 0xa2, 0x79, 0x3a, 0x9b, 0xc3, 0xb3, 0xa5, 0x72, 0xd0, 0xf5, 0xa6, 0x2d, 0xcd, 0x3f, + 0x7c, 0xb7, 0xe3, 0x26, 0x97, 0xc8, 0x8b, 0x9f, 0x4b, 0x15, 0xf0, 0xb4, 0x12, 0x87, 0x07, 0x92, + 0x57, 0xa8, 0x69, 0xde, 0x15, 0x13, 0x80, 0x2e, 0x0c, 0x1b, 0xd6, 0x07, 0x1a, 0x2a, 0x35, 0xe0, + 0xcf, 0x93, 0x06, 0x1b, 0x69, 0xd5, 0x6c, 0x42, 0xdc, 0x4b, 0xc1, 0xf6, 0xba, 0x72, 0x60, 0x70, + 0xc7, 0x9e, 0x59, 0xbc, 0x5f, 0x81, 0xf5, 0xff, 0x7d, 0x63, 0x83, 0xdf, 0x83, 0x01, 0x2a, 0x30, + 0xfe, 0x2f, 0xb0, 0x9b, 0x67, 0xfe, 0x98, 0xff, 0x5c, 0xfb, 0xb7, 0x38, 0x9d, 0x5a, 0x6b, 0xf4, + 0xea, 0x13, 0xad, 0xca, 0x68, 0x14, 0x34, 0xd5, 0x7b, 0xee, 0x30, 0xc9, 0x93, 0x4f, 0x21, 0x49, + 0x1e, 0x3e, 0x1b, 0x06, 0xf1, 0x41, 0x0b, 0x90, 0x9f, 0xb6, 0xf8, 0x05, 0x33, 0x37, 0x4d, 0xb3, + 0x72, 0x32, 0x30, 0x8a, 0x1f, 0x4e, 0xa1, 0xe2, 0x86, 0xd1, 0xc6, 0x56, 0xf0, 0x30, 0x02, 0xa5, + 0x57, 0xf1, 0xe6, 0x97, 0xb6, 0x2c, 0x68, 0x34, 0x44, 0xb3, 0x55, 0x58, 0x88, 0x66, 0xd9, 0xe6, + 0x15, 0xe7, 0xf4, 0xf0, 0xf9, 0xa3, 0x8a, 0x7e, 0xb7, 0x71, 0x90, 0x6c, 0x91, 0xac, 0xb2, 0x93, + 0xe8, 0xce, 0x0b, 0x0f, 0x76, 0x15, 0xb3, 0x40, 0x75, 0x15, 0x07, 0x24, 0x95, 0x91, 0x3c, 0xc6, + 0xe2, 0xb3, 0x62, 0x17, 0x07, 0x09, 0x25, 0xfe, 0xf9, 0x14, 0x07, 0x2d, 0x3e, 0x6b, 0xa0, 0x97, + 0xb4, 0xe5, 0xb0, 0x13, 0xd7, 0xdd, 0x94, 0x50, 0x12, 0x36, 0x2a, 0x6a, 0x8e, 0xdb, 0xfe, 0x3d, + 0x06, 0xbf, 0x4c, 0x29, 0x33, 0x96, 0x93, 0x24, 0xd5, 0x44, 0xdb, 0xc4, 0x90, 0xf8, 0x57, 0x4b, + 0xbf, 0x18, 0xfb, 0x97, 0x83, 0x8c, 0x80, 0x83, 0x09, 0x3c, 0xd9, 0xa1, 0x2e, 0x2c, 0xb0, 0x9b, + 0x44, 0x80, 0xa6, 0x00, 0x8b, 0x32, 0xf0, 0x19, 0xb9, 0x6a, 0x9a, 0x06, 0x53, 0x1f, 0x58, 0xf3, + 0xfd, 0x56, 0x4a, 0xdb, 0xfb, 0x44, 0xf0, 0xd9, 0x54, 0xdf, 0x1f, 0xf1, 0x6e, 0xc7, 0x70, 0xb0, + 0xf5, 0x15, 0x23, 0x18, 0x94, 0xd7, 0x8f, 0x2e, 0xfd, 0xe6, 0x83, 0xf1, 0xaa, 0x57, 0xc1, 0x34, + 0x4c, 0x5b, 0xd3, 0xe9, 0xa0, 0x3f, 0xb9, 0x68, 0xcf, 0x3a, 0xb4, 0x38, 0xb8, 0xc7, 0x24, 0x20, + 0x91, 0xb0, 0xf7, 0xe9, 0xf7, 0x42, 0x6c, 0x6b, 0x18, 0x5d, 0x85, 0xb0, 0xb1, 0x3d, 0x43, 0x6b, + 0x07, 0x24, 0x16, 0x85, 0xac, 0x68, 0xad, 0x94, 0x87, 0xd2, 0xd8, 0xf7, 0xa6, 0xb4, 0xc9, 0x67, + 0x60, 0xc0, 0xf0, 0x3d, 0xec, 0xf3, 0xa9, 0x37, 0x18, 0x83, 0xb6, 0x94, 0x01, 0xbb, 0x12, 0x17, + 0x35, 0xb4, 0xa9, 0xc0, 0xf8, 0xea, 0xbf, 0xd7, 0xe8, 0xfc, 0x09, 0xed, 0xbc, 0x0f, 0x18, 0xdb, + 0x2b, 0xae, 0x50, 0x18, 0x1b, 0x6f, 0xda, 0x4b, 0x88, 0xa6, 0x09, 0x37, 0xe0, 0x3c, 0xc1, 0x52, + 0x1b, 0xfb, 0x21, 0xd3, 0x98, 0x0a, 0x12, 0x6d, 0xeb, 0x9f, 0xdc, 0xa8, 0xbe, 0x0f, 0x08, 0x52, + 0xcd, 0x1f, 0xde, 0x93, 0x30, 0xbe, 0x84, 0xae, 0xfa, 0x8a, 0x74, 0xd3, 0x86, 0x4c, 0xd4, 0x7f, + 0xae, 0xfd, 0x6d, 0x48, 0x03, 0x5b, 0xcb, 0x0e, 0x31, 0x7a, 0x24, 0xd8, 0x0f, 0x43, 0x7f, 0xa2, + 0xa4, 0xb0, 0xaa, 0xed, 0xb6, 0x77, 0x55, 0x30, 0x52, 0x24, 0xae, 0xeb, 0xf9, 0xa9, 0x7f, 0x36, + 0x03, 0x94, 0xb7, 0xc6, 0x40, 0xce, 0x86, 0x71, 0xf7, 0xf7, 0xb1, 0x03, 0xc9, 0x70, 0x49, 0x61, + 0xd1, 0x8d, 0x81, 0x8a, 0xdf, 0xad, 0x57, 0x57, 0x86, 0x36, 0x02, 0x74, 0x55, 0xf0, 0xac, 0x8b, + 0xfe, 0x8c, 0x30, 0xd1, 0x69, 0x20, 0x49, 0xcf, 0xe7, 0xa8, 0x21, 0xc6, 0x45, 0xf0, 0x6f, 0xe0, + 0x1b, 0xc8, 0x46, 0x7e, 0x1e, 0xcd, 0x3e, 0x67, 0xd4, 0x7f, 0x79, 0xff, 0x41, 0x71, 0x1c, 0x31, + 0xf5, 0x10, 0x43, 0x4f, 0x68, 0x11, 0x86, 0xc3, 0xe4, 0xb3, 0x87, 0x4c, 0xdd, 0xc8, 0x87, 0xdb, + 0x69, 0xb6, 0xf3, 0xfd, 0xef, 0x77, 0x99, 0xf3, 0x7b, 0xd8, 0xc9, 0x6c, 0xd3, 0x18, 0x69, 0x0c, + 0x85, 0xe1, 0xff, 0x1b, 0x98, 0xca, 0x16, 0xa2, 0x22, 0x0a, 0x56, 0xb1, 0x7b, 0x46, 0x45, 0x04, + 0x3f, 0x2f, 0x86, 0x1a, 0x99, 0x73, 0xc1, 0x26, 0x30, 0xe7, 0x15, 0xcb, 0x9b, 0x6c, 0xbe, 0x4f, + 0x90, 0x9e, 0x80, 0x77, 0x5e, 0x52, 0x37, 0x1c, 0xda, 0x86, 0xd1, 0x64, 0x63, 0x16, 0x47, 0xf8, + 0x04, 0x56, 0x9b, 0x2b, 0x5b, 0x4d, 0xf5, 0x03, 0x9b, 0x23, 0x94, 0x17, 0xfb, 0xc4, 0x81, 0xbd, + 0x21, 0x07, 0x15, 0x08, 0x37, 0xd7, 0x00, 0x14, 0xd1, 0xf0, 0x18, 0xc7, 0xc6, 0x09, 0x67, 0x6a, + 0x40, 0x5b, 0x97, 0x3f, 0x14, 0x5f, 0xad, 0x84, 0x84, 0x60, 0x4f, 0xbf, 0xf0, 0x95, 0x3f, 0x1a, + 0xa1, 0xf9, 0x48, 0x76, 0xfc, 0x90, 0x14, 0x18, 0x2d, 0x4e, 0x41, 0x60, 0x20, 0x91, 0xd8, 0x78, + 0xe2, 0xd0, 0x3c, 0x4a, 0x18, 0xff, 0x53, 0xd3, 0x8e, 0x21, 0xa1, 0x5f, 0xe3, 0x1d, 0x13, 0xae, + 0xb2, 0xf2, 0x78, 0x4f, 0x21, 0x1f, 0xa5, 0x7d, 0xc6, 0x07, 0xe1, 0xb1, 0x42, 0xe7, 0x1f, 0xcc, + 0x20, 0x85, 0xb5, 0x5b, 0x71, 0x53, 0xd6, 0x01, 0x03, 0x09, 0x9d, 0x32, 0x51, 0x52, 0x0b, 0x18, + 0x36, 0x47, 0x31, 0x37, 0x4d, 0xbd, 0x24, 0x00, 0x71, 0xe8, 0x5a, 0x12, 0x62, 0xc3, 0xd1, 0xe4, + 0xca, 0x4a, 0x25, 0x67, 0xca, 0xca, 0xf1, 0x2c, 0xec, 0xa6, 0x9b, 0xd0, 0xeb, 0x06, 0xfe, 0x38, + 0x9a, 0x0c, 0xfd, 0xf8, 0x60, 0x33, 0xeb, 0x19, 0x5f, 0x63, 0x92, 0x99, 0x40, 0xc4, 0x66, 0x51, + 0xbf, 0x27, 0x5c, 0x59, 0x63, 0x45, 0xc0, 0x3c, 0x97, 0xa4, 0x35, 0xc7, 0xaa, 0xe3, 0x6e, 0xbb, + 0x3b, 0xac, 0x8e, 0x78, 0x71, 0xec, 0xdd, 0x24, 0x19, 0xd4, 0x95, 0xe1, 0x5b, 0x79, 0x44, 0x95, + 0x9f, 0x1e, 0x7d, 0xc7, 0xdd, 0xac, 0x49, 0x80, 0x65, 0x1e, 0x57, 0x94, 0xcd, 0x16, 0xfd, 0x98, + 0x55, 0xcc, 0xd5, 0x3d, 0xce, 0x39, 0xda, 0x99, 0x56, 0x37, 0x0f, 0x5f, 0xa2, 0x49, 0x92, 0x25, + 0x32, 0xa2, 0x24, 0x79, 0x60, 0x12, 0x5d, 0x81, 0x84, 0x23, 0xc4, 0xbf, 0x06, 0x69, 0xa2, 0xfc, + 0x61, 0x40, 0xaa, 0x54, 0x53, 0xbd, 0x9d, 0x4f, 0xd2, 0x40, 0x4c, 0x47, 0x52, 0x9e, 0x3e, 0xf1, + 0x4c, 0x8a, 0x5c, 0x0a, 0xeb, 0x5b, 0x6e, 0x5b, 0x22, 0x11, 0x73, 0xf6, 0x9b, 0x89, 0x4a, 0x0e, + 0xad, 0x66, 0x84, 0x95, 0x4f, 0xdd, 0x4b, 0xe2, 0xec, 0xe7, 0x51, 0xcc, 0xc1, 0x1e, 0x2c, 0x3a, + 0x2c, 0xc3, 0xc7, 0xde, 0xbd, 0xf1, 0xb1, 0xbf, 0x04, 0x1f, 0x84, 0x09, 0x09, 0x63, 0x40, 0x88, + 0x29, 0xe6, 0x14, 0xe8, 0x60, 0x81, 0x92, 0x25, 0x69, 0x9a, 0xd4, 0xc3, 0x3f, 0x23, 0x04, 0x99, + 0xc6, 0x9f, 0x98, 0xa2, 0x89, 0x16, 0xc6, 0xa2, 0xd9, 0x19, 0x48, 0x48, 0x1d, 0xa8, 0xa9, 0x17, + 0x12, 0xd3, 0xd1, 0x22, 0x59, 0x0f, 0x95, 0xfe, 0x34, 0xf4, 0xcf, 0x7b, 0xeb, 0x2b, 0x22, 0x56, + 0xcc, 0x48, 0x72, 0x19, 0x4a, 0xad, 0xb5, 0x34, 0xc8, 0x30, 0x51, 0x08, 0x37, 0xfc, 0x0d, 0x48, + 0x97, 0x2c, 0x05, 0x39, 0xd6, 0xc5, 0xb6, 0x2a, 0x5e, 0x05, 0x6d, 0x52, 0x6b, 0x11, 0x23, 0x15, + 0x0b, 0x93, 0xb5, 0xb8, 0xf3, 0x85, 0x6b, 0xb2, 0x10, 0x54, 0x93, 0xbd, 0x1c, 0xb2, 0xb7, 0xe8, + 0xfd, 0x67, 0x34, 0x70, 0xf4, 0x1d, 0x88, 0x5d, 0xda, 0x7a, 0x3e, 0x99, 0xd8, 0x24, 0xbf, 0x1e, + 0x82, 0x98, 0xd6, 0x04, 0x44, 0x65, 0x54, 0x34, 0x03, 0xe1, 0xb3, 0x7e, 0x65, 0x18, 0x1a, 0x8d, + 0x62, 0x98, 0x92, 0x57, 0x1a, 0x71, 0xc5, 0xa3, 0x3e, 0x88, 0xbf, 0xcd, 0x00, 0x17, 0xf9, 0x03, + 0x44, 0xea, 0x4d, 0xe6, 0xfd, 0xb3, 0xf4, 0x60, 0xb3, 0xf9, 0x53, 0x12, 0x85, 0xd5, 0x51, 0x9c, + 0xe8, 0x30, 0xb3, 0xed, 0x03, 0x6d, 0x08, 0xa3, 0x1e, 0xa7, 0xe3, 0x00, 0xfc, 0xe1, 0x69, 0x8b, + 0x7b, 0x77, 0x58, 0xe4, 0xc7, 0x45, 0xb4, 0xca, 0x29, 0xfd, 0x22, 0x27, 0x4a, 0xcc, 0x5b, 0x13, + 0x73, 0x38, 0xa3, 0xad, 0xa4, 0x58, 0x80, 0xde, 0x00, 0x3e, 0xfd, 0x59, 0x13, 0x32, 0x68, 0x69, + 0x8a, 0xf7, 0xdb, 0x19, 0xad, 0xe8, 0xe2, 0x85, 0xfe, 0xe6, 0xe9, 0xeb, 0x0d, 0x15, 0x94, 0x3e, + 0x22, 0x0a, 0x4b, 0x7f, 0x92, 0x8f, 0x87, 0xa4, 0xb3, 0x74, 0x4d, 0x7c, 0x3f, 0x4a, 0x40, 0xe7, + 0x3c, 0xfc, 0xd3, 0x14, 0x29, 0xb3, 0x7b, 0x56, 0x90, 0xbf, 0x55, 0x03, 0xda, 0xaf, 0x5d, 0x03, + 0xcf, 0x85, 0x2a, 0x44, 0xa9, 0xd6, 0x67, 0xd6, 0x93, 0xd7, 0x80, 0x44, 0x3c, 0x52, 0xa1, 0x17, + 0x1c, 0xba, 0xb4, 0xba, 0x4e, 0x86, 0x87, 0x42, 0x45, 0x13, 0xb8, 0x6c, 0x8d, 0x19, 0x87, 0x04, + 0x96, 0x80, 0xb2, 0x7f, 0x96, 0x30, 0x65, 0x22, 0x83, 0xb3, 0x36, 0xd7, 0x46, 0x01, 0xa3, 0x16, + 0x5e, 0x95, 0x63, 0x75, 0xe9, 0xfd, 0x49, 0x16, 0xa5, 0x5b, 0xb4, 0xaf, 0x15, 0xd7, 0xca, 0xfa, + 0x90, 0xda, 0x62, 0x33, 0x24, 0x78, 0x96, 0x5a, 0x89, 0x66, 0xd2, 0x08, 0x8c, 0x5b, 0x0f, 0x83, + 0x6c, 0xc1, 0xa1, 0xf9, 0x4c, 0xc6, 0x39, 0x59, 0xd6, 0x38, 0xe6, 0x96, 0x5f, 0x96, 0x96, 0x76, + 0xb6, 0x29, 0x2e, 0xc6, 0x69, 0x9b, 0x39, 0xe4, 0x5c, 0x14, 0x85, 0xd9, 0x40, 0x96, 0xfd, 0x4d, + 0x1d, 0xd7, 0x5f, 0x12, 0x42, 0x4c, 0x45, 0x29, 0xb2, 0xa6, 0x0e, 0x2a, 0x2d, 0xd1, 0x5c, 0x73, + 0xd2, 0x13, 0x45, 0x56, 0x7a, 0x5b, 0xd4, 0x66, 0xdf, 0x89, 0xdb, 0x98, 0xd5, 0x54, 0x03, 0x21, + 0x9c, 0x43, 0x8e, 0x22, 0xa6, 0x9d, 0xe9, 0xaf, 0x6f, 0xa3, 0x61, 0x40, 0x3b, 0x6b, 0xae, 0xf5, + 0x2e, 0x2a, 0xb0, 0x1a, 0x38, 0x84, 0xe1, 0x7c, 0x45, 0xb0, 0x81, 0xe6, 0xd0, 0xc8, 0xc8, 0x8c, + 0x22, 0x23, 0x26, 0x2f, 0x52, 0x1a, 0x27, 0xbd, 0xcf, 0x3b, 0xad, 0x1f, 0xf5, 0x68, 0xdf, 0x45, + 0x39, 0xb5, 0x20, 0xcb, 0x19, 0x32, 0x41, 0xc0, 0x56, 0xd5, 0x2f, 0x96, 0x5f, 0x58, 0xb6, 0xcd, + 0x05, 0x8e, 0x23, 0xda, 0xf9, 0x61, 0xe1, 0xd8, 0x1e, 0xfb, 0x65, 0xac, 0x23, 0x6b, 0x13, 0x12, + 0x22, 0x13, 0xd2, 0x8c, 0xfc, 0x58, 0xe2, 0x21, 0x68, 0x2b, 0xbc, 0xbd, 0xeb, 0xc9, 0xfb, 0x49, + 0x34, 0xf0, 0x26, 0x8b, 0xaf, 0x0b, 0xc7, 0x3c, 0xe4, 0x3d, 0x5e, 0xeb, 0xf8, 0x59, 0xa0, 0x99, + 0xde, 0x3a, 0x4e, 0x0f, 0x27, 0x43, 0x5a, 0xca, 0x91, 0x68, 0x5a, 0x47, 0xfd, 0xaa, 0x1c, 0xda, + 0xf9, 0xe6, 0x17, 0x91, 0xa3, 0xfe, 0xf5, 0x5f, 0xfe, 0xbb, 0x48, 0xdf, 0xa5, 0x90, 0x60, 0xf8, + 0x8c, 0x61, 0xac, 0x9c, 0xf9, 0x71, 0x23, 0x62, 0xbb, 0x02, 0xcc, 0x6c, 0x22, 0x3a, 0x42, 0xd0, + 0xd6, 0x56, 0xcd, 0x3e, 0x24, 0xf0, 0xb7, 0x0c, 0xab, 0x8e, 0xbb, 0xbf, 0xc2, 0x24, 0xd5, 0x72, + 0xfa, 0xf0, 0x1b, 0x71, 0xb8, 0x1d, 0x90, 0x70, 0x7e, 0x85, 0x83, 0x0f, 0x35, 0x5c, 0x59, 0x26, + 0x25, 0x4e, 0xdf, 0xbf, 0x7f, 0x73, 0x7a, 0xf4, 0xe1, 0x04, 0x5d, 0xde, 0xd8, 0x70, 0xe4, 0xb2, + 0xb1, 0xe6, 0x95, 0xdf, 0xff, 0x40, 0x3b, 0x84, 0xd3, 0x75, 0xbe, 0x3d, 0x3d, 0xfd, 0xa0, 0x51, + 0xa1, 0xd8, 0x83, 0xa4, 0x23, 0xf6, 0x4d, 0x98, 0x4f, 0x62, 0xa4, 0xfb, 0xa6, 0x09, 0x44, 0xef, + 0xaa, 0xc7, 0x6d, 0xc7, 0xcd, 0x61, 0xe1, 0x40, 0xc4, 0x00, 0x47, 0xfd, 0xde, 0x20, 0xee, 0x88, + 0x40, 0xbe, 0xfc, 0xf0, 0xbd, 0xca, 0x5e, 0x4a, 0x34, 0x92, 0xaa, 0xb5, 0x1b, 0xdb, 0xf5, 0xa6, + 0xfa, 0x96, 0x64, 0x01, 0x6a, 0x88, 0x24, 0x16, 0x44, 0xb6, 0xd3, 0x80, 0x21, 0x6d, 0xc3, 0x8f, + 0xac, 0x68, 0xc1, 0xc9, 0x4b, 0x22, 0x36, 0xbb, 0xad, 0x8e, 0xdd, 0x14, 0x01, 0xed, 0x47, 0x89, + 0x4f, 0x6d, 0xbc, 0xe6, 0xe8, 0x2f, 0x35, 0x24, 0x36, 0x1f, 0x20, 0x26, 0x6c, 0x12, 0x9d, 0x9f, + 0xb3, 0xfe, 0x41, 0xb2, 0x4e, 0x3a, 0x24, 0xa5, 0xa4, 0xa9, 0xbe, 0x4f, 0xfc, 0xd1, 0x7c, 0xc2, + 0x42, 0xd5, 0xd0, 0xef, 0xcf, 0xf9, 0xbb, 0x05, 0x98, 0xb8, 0xa5, 0x80, 0x66, 0x9f, 0x7a, 0x93, + 0xe3, 0x43, 0x09, 0xb0, 0x8e, 0x6b, 0x1d, 0x13, 0xb3, 0xb8, 0x82, 0xe2, 0xc4, 0xef, 0x9b, 0xaa, + 0xd1, 0xd1, 0xd2, 0x12, 0x29, 0xa0, 0x29, 0x89, 0x52, 0x4d, 0xf5, 0x1e, 0xe7, 0x81, 0x04, 0xff, + 0xb0, 0xaa, 0x4c, 0x21, 0xbe, 0xce, 0x70, 0x81, 0x17, 0x03, 0x80, 0x81, 0x94, 0xd0, 0x36, 0xa1, + 0xbe, 0xd9, 0xad, 0x80, 0x55, 0xe4, 0x8d, 0xe4, 0x61, 0xb2, 0x08, 0x77, 0xe1, 0x58, 0x5a, 0xab, + 0x25, 0x55, 0x1b, 0x03, 0x5b, 0xa4, 0x36, 0x34, 0xd5, 0x87, 0x68, 0x36, 0xc7, 0x19, 0xd5, 0xa1, + 0x1a, 0xde, 0x90, 0x62, 0x81, 0x5c, 0x60, 0xd4, 0x7a, 0x81, 0x98, 0x38, 0xd4, 0x95, 0xdb, 0x22, + 0xa1, 0xa0, 0x29, 0xed, 0xbd, 0x08, 0x42, 0x6a, 0xed, 0x03, 0x72, 0x0d, 0x13, 0x3c, 0x28, 0x7c, + 0x26, 0xa8, 0x0c, 0x44, 0xd6, 0x0f, 0x42, 0x8f, 0xe4, 0xa1, 0x1a, 0x9c, 0x86, 0xd4, 0xc6, 0x6b, + 0xac, 0x2f, 0x6a, 0x7b, 0x9e, 0x60, 0x36, 0x82, 0x09, 0x4e, 0xd2, 0x9b, 0xb3, 0x51, 0x0c, 0x58, + 0x20, 0xc3, 0x05, 0xf5, 0xd6, 0x03, 0xaa, 0xe8, 0xdf, 0x60, 0x3a, 0x9f, 0xea, 0x11, 0xb3, 0xc7, + 0x5f, 0x4d, 0x82, 0x69, 0x40, 0xc8, 0x69, 0x6b, 0x38, 0x68, 0x32, 0x3b, 0x5e, 0x75, 0xec, 0x0f, + 0xe7, 0xa4, 0xa6, 0xaa, 0x30, 0x0a, 0xf8, 0xd6, 0x2a, 0x35, 0xf4, 0xe2, 0x0b, 0x95, 0x0c, 0xfc, + 0x90, 0x3b, 0x2e, 0xfd, 0x96, 0x30, 0x0a, 0x02, 0xfd, 0x7d, 0x62, 0x35, 0x91, 0xc5, 0x5c, 0xc0, + 0x2e, 0x8d, 0xaa, 0x84, 0x82, 0x38, 0xd2, 0x16, 0x0d, 0x69, 0x0e, 0x28, 0xc3, 0x09, 0xd0, 0x81, + 0xaa, 0x21, 0xf4, 0x94, 0x03, 0x25, 0x08, 0xab, 0x70, 0x29, 0x4a, 0x60, 0x93, 0x82, 0x30, 0x24, + 0x72, 0xb5, 0xc4, 0x4c, 0xb2, 0x0e, 0x4b, 0x34, 0x18, 0x44, 0x43, 0xbd, 0xda, 0x76, 0xf0, 0x1f, + 0xbc, 0xb5, 0xfb, 0x6d, 0x54, 0x05, 0xed, 0xa0, 0xc3, 0x52, 0x12, 0x97, 0xca, 0x25, 0x2e, 0x4d, + 0x1a, 0x8d, 0x02, 0xe0, 0x44, 0x2d, 0x86, 0xeb, 0x17, 0x51, 0x47, 0xa4, 0x82, 0x63, 0xf9, 0xb0, + 0x0f, 0x69, 0x72, 0xd3, 0x54, 0x2f, 0xb4, 0xcd, 0x89, 0x2f, 0xa6, 0xd4, 0x61, 0x02, 0x85, 0x1a, + 0xd9, 0x54, 0x79, 0x57, 0xfd, 0xb7, 0x42, 0x16, 0x7f, 0x45, 0x64, 0x85, 0xd2, 0x91, 0x15, 0x9a, + 0x1c, 0x98, 0x12, 0xac, 0xd1, 0xb9, 0x6a, 0x90, 0x9e, 0x89, 0xbc, 0x4f, 0xaf, 0x39, 0xb7, 0xe5, + 0x62, 0x08, 0x86, 0x0d, 0xfb, 0x25, 0x56, 0xf9, 0xcb, 0x72, 0x09, 0xe0, 0xf0, 0x9f, 0xfc, 0xc9, + 0x25, 0xfd, 0x61, 0xc3, 0x2d, 0x15, 0xe4, 0x30, 0xea, 0x83, 0x0c, 0x7a, 0x53, 0xc1, 0x46, 0xd6, + 0xe8, 0xc0, 0x4e, 0x66, 0x2d, 0x1b, 0x84, 0x62, 0x08, 0x78, 0x58, 0x1e, 0x9a, 0xd3, 0x20, 0x8e, + 0xa3, 0x98, 0x5a, 0xf8, 0x66, 0x12, 0xcc, 0xc4, 0x1a, 0xa1, 0xc6, 0xa4, 0x30, 0xfc, 0x82, 0x63, + 0x5a, 0x8c, 0x88, 0xe3, 0x12, 0x1f, 0xb1, 0x2a, 0x8f, 0xa8, 0x4e, 0xb1, 0xaa, 0x49, 0x74, 0xb7, + 0xa6, 0xa2, 0x1c, 0xd5, 0xa5, 0xaa, 0xc7, 0xfc, 0x43, 0x57, 0xae, 0xb5, 0x15, 0xd4, 0xe3, 0xc7, + 0x6d, 0x22, 0xb9, 0x73, 0x92, 0xd5, 0x30, 0xf7, 0x95, 0x40, 0x74, 0x7c, 0x6f, 0x3c, 0xd0, 0x78, + 0x3f, 0x06, 0x0c, 0xad, 0x56, 0x74, 0xd5, 0xa0, 0x1f, 0x1f, 0x30, 0xef, 0xf4, 0xc2, 0xd4, 0x98, + 0x0e, 0x5d, 0x75, 0x49, 0x6f, 0xf9, 0x9a, 0x19, 0x62, 0x3b, 0xae, 0xf2, 0xf0, 0xe8, 0x0d, 0xbd, + 0x19, 0xcf, 0x66, 0xfe, 0xfe, 0x67, 0xbc, 0xff, 0x59, 0x1b, 0x80, 0x7e, 0x78, 0x71, 0x6c, 0x37, + 0x47, 0x14, 0x45, 0x6d, 0x9d, 0x92, 0x1a, 0xe4, 0x6b, 0x03, 0x0a, 0xb3, 0x7c, 0x6d, 0x97, 0x23, + 0xbe, 0x3b, 0x21, 0x25, 0x88, 0x66, 0x93, 0x55, 0x42, 0x09, 0xae, 0x17, 0xea, 0x6f, 0x2a, 0x1c, + 0xa5, 0x0a, 0xc0, 0xe5, 0xa8, 0x35, 0x1b, 0x24, 0x14, 0x2f, 0xf4, 0x3f, 0xe3, 0x23, 0xf0, 0x43, + 0xfc, 0xf5, 0xfa, 0x5b, 0x4d, 0xce, 0x9d, 0x27, 0xdb, 0xed, 0xeb, 0x4e, 0xfb, 0x71, 0x9b, 0x10, + 0xf1, 0x9c, 0x15, 0x88, 0x44, 0x25, 0x34, 0x3b, 0xe9, 0x60, 0x9e, 0x26, 0x5d, 0xf5, 0x68, 0xbb, + 0x3d, 0x73, 0x15, 0xbe, 0xd3, 0x9f, 0xdd, 0xb7, 0x1f, 0x56, 0x63, 0x4b, 0x63, 0x22, 0x1f, 0xc2, + 0x72, 0xab, 0xaa, 0xc5, 0xe7, 0xfb, 0x9c, 0x15, 0x51, 0x69, 0x94, 0xb8, 0xc2, 0xe2, 0xfb, 0xa4, + 0xd5, 0x73, 0x14, 0xfe, 0xf2, 0x91, 0x9d, 0x47, 0xb3, 0x13, 0x19, 0xdc, 0x12, 0x33, 0xa6, 0x5e, + 0xf4, 0x93, 0x09, 0x9b, 0xca, 0x3c, 0x1a, 0xf1, 0x25, 0x94, 0x3b, 0x59, 0xaa, 0xb4, 0xce, 0x8d, + 0x5d, 0xb0, 0xbe, 0xbc, 0x8d, 0x9f, 0x67, 0xaf, 0xfc, 0x49, 0xea, 0x51, 0x1b, 0x47, 0xad, 0x0f, + 0xba, 0xe6, 0x77, 0xe0, 0x57, 0xf4, 0x52, 0xd5, 0x1a, 0x9d, 0x6d, 0x4c, 0xc5, 0x56, 0x07, 0xfb, + 0xd6, 0x3b, 0xff, 0x9c, 0xb3, 0x45, 0x50, 0x93, 0x27, 0x6f, 0x9f, 0xbf, 0x79, 0xf3, 0xfa, 0x58, + 0x1d, 0x35, 0xf4, 0x1c, 0xd6, 0x62, 0x2f, 0x80, 0x03, 0x44, 0xbf, 0x00, 0x08, 0x93, 0x5c, 0x02, + 0x00, 0x3e, 0xd4, 0x7b, 0x4a, 0xf0, 0x94, 0xa8, 0xb9, 0xd6, 0xd0, 0x68, 0xb6, 0xdf, 0xc9, 0xa9, + 0x5e, 0x3f, 0xe6, 0x23, 0x74, 0x12, 0x09, 0xb2, 0x62, 0xa2, 0xc1, 0x24, 0x4f, 0xc7, 0x90, 0x4d, + 0xa3, 0xc9, 0x10, 0x3b, 0x08, 0x5e, 0x34, 0xf4, 0xf6, 0x03, 0x3b, 0x68, 0x4a, 0x6a, 0xf6, 0x39, + 0x9b, 0xf2, 0x74, 0x21, 0x90, 0x02, 0x33, 0x7a, 0x45, 0x24, 0xd0, 0x16, 0x74, 0x51, 0x83, 0x34, + 0xe1, 0x7b, 0xf8, 0xd9, 0x69, 0xee, 0x5d, 0xe3, 0x10, 0xfc, 0x85, 0xbf, 0x7a, 0xda, 0xb9, 0x65, + 0x44, 0x18, 0x63, 0xbf, 0x04, 0x23, 0x09, 0x69, 0x02, 0xe6, 0x3c, 0x38, 0xfe, 0xd4, 0x60, 0x18, + 0x86, 0x9e, 0x4d, 0x6c, 0xb0, 0x92, 0x34, 0x0b, 0x4a, 0x07, 0x3d, 0x82, 0x5d, 0x52, 0x27, 0x2d, + 0x36, 0xb2, 0xbd, 0x66, 0x69, 0xfa, 0x09, 0x89, 0x5a, 0x38, 0x5c, 0x86, 0xbd, 0x1e, 0x2c, 0xa6, + 0x91, 0xbf, 0x42, 0x26, 0x39, 0x44, 0xfb, 0xd7, 0x78, 0xe6, 0x1b, 0x5a, 0x90, 0x57, 0x5b, 0xea, + 0xe4, 0x87, 0x97, 0x8d, 0x53, 0x02, 0x37, 0xfa, 0x10, 0x73, 0x98, 0x38, 0x91, 0x0e, 0xcd, 0xdd, + 0xfb, 0x93, 0x57, 0x8d, 0xc4, 0x1b, 0xf9, 0xbc, 0xe5, 0x23, 0xe2, 0x7e, 0x30, 0xf7, 0x5b, 0x9a, + 0x20, 0x5b, 0xc9, 0x2c, 0x26, 0x28, 0xad, 0x98, 0x93, 0x76, 0xb6, 0x48, 0x90, 0x9b, 0x73, 0x9e, + 0x17, 0x78, 0xfe, 0x89, 0x19, 0x48, 0xe5, 0x79, 0x88, 0xea, 0xaa, 0xa6, 0x83, 0xa5, 0xe1, 0xdd, + 0x03, 0x7b, 0x21, 0x52, 0x9c, 0x22, 0xbf, 0x00, 0x27, 0xde, 0xa4, 0x72, 0xb0, 0xb3, 0x7a, 0xf5, + 0x2e, 0x21, 0x9d, 0xd8, 0x17, 0x41, 0xa4, 0x99, 0xa1, 0x6d, 0xfd, 0x92, 0xf7, 0xc1, 0x42, 0xcf, + 0x9a, 0x4a, 0x3a, 0x71, 0xd0, 0x6e, 0x6e, 0xef, 0x25, 0x40, 0x0c, 0xd2, 0xdb, 0xd1, 0x32, 0x97, + 0xce, 0x1c, 0xf0, 0xb0, 0xb6, 0xda, 0x4d, 0xf9, 0x86, 0xfd, 0xcb, 0x57, 0xc7, 0xaf, 0x9f, 0xbf, + 0x7a, 0xfb, 0x9a, 0x85, 0x99, 0x2c, 0xde, 0x9f, 0x25, 0xed, 0x02, 0x1e, 0xfb, 0x51, 0x94, 0xca, + 0x4e, 0xad, 0xf1, 0xf8, 0x4b, 0x14, 0x4d, 0xff, 0x99, 0x50, 0xf8, 0x2a, 0x38, 0x0f, 0xe0, 0xc5, + 0xc5, 0xb3, 0xa2, 0x9d, 0x73, 0xa6, 0xaf, 0x03, 0x50, 0xff, 0xec, 0x32, 0x61, 0xe0, 0xe0, 0x20, + 0x1b, 0x7e, 0x21, 0x7c, 0xb0, 0xc1, 0x66, 0x39, 0x2d, 0x02, 0xc6, 0xdf, 0x56, 0xc1, 0xfc, 0x9b, + 0xc0, 0x44, 0x6c, 0x81, 0x01, 0x29, 0x66, 0xb0, 0xe5, 0x30, 0xb5, 0x98, 0x8b, 0xcd, 0x40, 0x0b, + 0xbc, 0x7c, 0xb0, 0x08, 0x12, 0x33, 0x07, 0xb6, 0x03, 0xba, 0x6d, 0x5a, 0xe6, 0xf3, 0x20, 0x01, + 0x1c, 0xd2, 0x38, 0x0e, 0x7d, 0x20, 0xf8, 0x90, 0xbd, 0x41, 0x44, 0xe5, 0x03, 0xbd, 0x27, 0xe8, + 0xf8, 0xc3, 0x5f, 0x3c, 0x39, 0x8c, 0x04, 0x40, 0x5b, 0x92, 0xc0, 0x45, 0xd5, 0xa8, 0x53, 0x63, + 0x23, 0xbf, 0x13, 0x3b, 0xd4, 0x91, 0x47, 0x97, 0x81, 0xa7, 0x7e, 0xf8, 0xf0, 0x9a, 0x8b, 0xba, + 0x5a, 0xde, 0xe6, 0x97, 0x27, 0x2f, 0xdf, 0xf0, 0xcb, 0x9e, 0x1e, 0x27, 0x36, 0x5e, 0x2e, 0x93, + 0x44, 0x73, 0x8e, 0xda, 0x85, 0x74, 0x38, 0xc8, 0x99, 0xf8, 0xd3, 0x83, 0x8c, 0xff, 0xe2, 0xf1, + 0xc2, 0xf7, 0x67, 0x8a, 0xf6, 0x80, 0x5e, 0xd6, 0x27, 0x9a, 0xb2, 0xc1, 0x58, 0xc2, 0xbf, 0x7a, + 0x8c, 0xc5, 0x7f, 0x6e, 0x31, 0x6e, 0x15, 0x0e, 0x76, 0x62, 0xb4, 0x59, 0x41, 0xd8, 0x40, 0xc3, + 0x61, 0x74, 0xd5, 0x93, 0x50, 0xb3, 0x99, 0x47, 0x34, 0x75, 0x82, 0x61, 0x4a, 0x72, 0x93, 0xba, + 0x0c, 0x1a, 0xea, 0xd8, 0x64, 0xd9, 0xc8, 0x47, 0x93, 0xc8, 0xe3, 0x75, 0x28, 0x5f, 0xb1, 0x55, + 0xa8, 0xfe, 0x04, 0x0e, 0x01, 0x39, 0x9b, 0x5a, 0x42, 0x47, 0x4f, 0x87, 0x54, 0x03, 0xcc, 0x4d, + 0xc2, 0xf8, 0xc5, 0x0a, 0x94, 0x80, 0xce, 0x97, 0x34, 0xec, 0x0f, 0x03, 0x68, 0x50, 0xb4, 0xa1, + 0x70, 0x47, 0xc7, 0xc1, 0x28, 0x6d, 0x69, 0x40, 0xfd, 0xf9, 0x90, 0xb6, 0x87, 0x25, 0x5d, 0xed, + 0x19, 0x8c, 0x0e, 0xa2, 0x29, 0x89, 0x74, 0x12, 0x48, 0x90, 0x44, 0xa3, 0x14, 0xc2, 0xf6, 0xd6, + 0xb7, 0x7f, 0x6d, 0xf4, 0x69, 0x59, 0x32, 0xd9, 0x88, 0x14, 0x02, 0x29, 0x97, 0x4f, 0x81, 0xa0, + 0x19, 0x1d, 0xe5, 0x4d, 0xc3, 0x05, 0x9e, 0x1a, 0x1d, 0x5a, 0x3e, 0xd7, 0x2d, 0x62, 0x64, 0x6d, + 0xfc, 0xfb, 0x88, 0x7e, 0x6f, 0x5f, 0xb7, 0x76, 0xae, 0x5b, 0xbb, 0xd7, 0x84, 0x84, 0x99, 0x44, + 0xe8, 0x5a, 0x24, 0x5a, 0x1e, 0x60, 0x15, 0xc6, 0x99, 0xd0, 0xd0, 0xf1, 0x1e, 0x8e, 0xd7, 0xcf, + 0x67, 0x2c, 0xbd, 0x31, 0x19, 0x8e, 0x65, 0x47, 0x63, 0x48, 0xfe, 0x14, 0x86, 0x6b, 0x8f, 0xd6, + 0x3f, 0x04, 0xfc, 0x58, 0x99, 0x8d, 0xa6, 0x92, 0xa3, 0xb1, 0xee, 0x41, 0x72, 0x6d, 0x74, 0xf5, + 0x3e, 0x19, 0xda, 0x9a, 0x0b, 0xbd, 0x66, 0xb6, 0xa1, 0x0f, 0x94, 0x1b, 0xff, 0x0a, 0xa3, 0x2d, + 0x91, 0x08, 0x83, 0x9a, 0xa6, 0x49, 0x41, 0x56, 0x00, 0x25, 0xd1, 0x93, 0x90, 0x43, 0x50, 0x28, + 0xe4, 0xcd, 0x9e, 0x8e, 0xda, 0xb0, 0x27, 0x5b, 0x61, 0xbe, 0x35, 0xfd, 0x50, 0x3f, 0x69, 0x6c, + 0xa4, 0x80, 0x11, 0x57, 0x1b, 0x83, 0x79, 0x20, 0xd9, 0x8c, 0x60, 0x73, 0x1a, 0x5d, 0xf2, 0x61, + 0x74, 0x0c, 0x59, 0xc8, 0x8b, 0x26, 0x02, 0x66, 0x68, 0x99, 0x72, 0x58, 0x20, 0x75, 0x90, 0x87, + 0xe0, 0x7d, 0xa8, 0x70, 0x27, 0xfb, 0xb2, 0x61, 0x92, 0xca, 0x75, 0x1e, 0x41, 0xc3, 0xd2, 0xe7, + 0x72, 0xf2, 0x91, 0xf2, 0x12, 0x37, 0xa1, 0x53, 0x32, 0x30, 0xd6, 0xc4, 0xfe, 0x0a, 0xb9, 0xd3, + 0x1c, 0x23, 0x77, 0xb3, 0x10, 0xfe, 0x98, 0xd8, 0x2d, 0x46, 0x19, 0x0c, 0x27, 0x2c, 0x27, 0x57, + 0x30, 0x8d, 0xac, 0x2d, 0xd1, 0x5b, 0xc1, 0x8b, 0x78, 0x93, 0x91, 0xd1, 0x7f, 0x7f, 0x6c, 0x94, + 0xe7, 0xf9, 0x10, 0x57, 0xb3, 0xd0, 0x2a, 0x6c, 0x76, 0xf6, 0x1f, 0x37, 0x3b, 0xcd, 0x4e, 0x77, + 0x6f, 0x9f, 0xc5, 0x93, 0x15, 0x10, 0xb9, 0x7f, 0x5a, 0x2e, 0x3c, 0xe5, 0x6b, 0xb3, 0x60, 0x96, + 0x25, 0xe9, 0x3e, 0x8d, 0x06, 0x90, 0x0e, 0xe3, 0x74, 0xa6, 0x6a, 0x90, 0x0d, 0x87, 0x48, 0x92, + 0xb7, 0x0e, 0x19, 0x24, 0xc1, 0x7d, 0xf0, 0x6e, 0x10, 0x07, 0xa2, 0xa5, 0x19, 0x52, 0x68, 0xd4, + 0xf1, 0xe9, 0x87, 0x16, 0x66, 0x14, 0x87, 0x79, 0x67, 0xf2, 0x55, 0x87, 0x2b, 0xd5, 0xf6, 0x1e, + 0xed, 0x37, 0x9b, 0xbb, 0x22, 0x43, 0x75, 0xe8, 0x2f, 0x84, 0x06, 0xde, 0x7c, 0x46, 0x7c, 0xd6, + 0x92, 0xf4, 0xf9, 0xd0, 0x4f, 0xaf, 0xa2, 0xf8, 0x22, 0x81, 0x50, 0x01, 0x35, 0x0a, 0x1f, 0x7e, + 0x9a, 0x4f, 0xfb, 0x91, 0x96, 0x3e, 0x88, 0x3b, 0x5e, 0x98, 0xd0, 0x5b, 0x00, 0xe2, 0x02, 0x3b, + 0x4f, 0x9e, 0xec, 0x34, 0xde, 0x9e, 0x7e, 0x4f, 0xbd, 0xf5, 0x26, 0xa9, 0x7f, 0xb1, 0x12, 0x05, + 0x24, 0x5e, 0x85, 0x7c, 0xae, 0xf2, 0xfb, 0x21, 0xa4, 0x73, 0x52, 0xa3, 0x55, 0xf6, 0x4a, 0x7d, + 0xff, 0xea, 0x03, 0x51, 0x09, 0x2d, 0x21, 0xf1, 0x56, 0xe0, 0x22, 0x84, 0x98, 0x58, 0x5b, 0x0c, + 0x12, 0x03, 0x21, 0xc3, 0x54, 0x64, 0x2b, 0xd9, 0xe1, 0x3a, 0x0c, 0xf1, 0x65, 0x0a, 0xdf, 0x87, + 0xc1, 0xb5, 0x3e, 0x99, 0x73, 0x02, 0xb5, 0x81, 0x05, 0x0d, 0x42, 0x50, 0x1a, 0xe8, 0xb3, 0xb3, + 0xbc, 0x1b, 0xa0, 0xc1, 0x39, 0x95, 0xa4, 0x39, 0xd5, 0xe4, 0xa4, 0x89, 0x48, 0x93, 0x1c, 0x89, + 0xe5, 0xb2, 0x11, 0x40, 0x7a, 0xc7, 0x89, 0x54, 0x12, 0x3b, 0xfd, 0x39, 0x89, 0x9b, 0xb0, 0x43, + 0x14, 0x38, 0x08, 0x81, 0x49, 0x83, 0x89, 0xac, 0x78, 0x53, 0x16, 0x96, 0xee, 0xa9, 0x2f, 0x7a, + 0x3b, 0x9c, 0xa5, 0xd1, 0x88, 0x35, 0xbe, 0x99, 0xf1, 0x6a, 0xc6, 0xfe, 0xd4, 0x83, 0x31, 0x20, + 0xc6, 0x97, 0x4c, 0x7f, 0x2c, 0x1a, 0x14, 0xd6, 0x0e, 0x76, 0x3e, 0x0c, 0x22, 0x6d, 0x78, 0x79, + 0x8e, 0xdf, 0x8c, 0x4f, 0x31, 0xbb, 0x1c, 0x62, 0xcf, 0xa4, 0x55, 0x16, 0x0c, 0x58, 0xcf, 0x97, + 0xc5, 0x8d, 0x77, 0xc9, 0x18, 0x76, 0x08, 0x59, 0x45, 0x82, 0xfa, 0x9e, 0x7a, 0xda, 0xd6, 0x53, + 0xdc, 0xe8, 0xd4, 0xb1, 0x63, 0xb3, 0xe5, 0xac, 0xc1, 0x29, 0x4a, 0x6a, 0x03, 0xd2, 0x4a, 0x88, + 0xf9, 0x6d, 0xc9, 0x4b, 0x97, 0x28, 0x06, 0x02, 0x8a, 0x10, 0xb6, 0x0f, 0x92, 0xcd, 0x75, 0xb9, + 0xfd, 0x76, 0x67, 0x5d, 0x97, 0x13, 0x6a, 0x77, 0xe0, 0xc5, 0xba, 0xd3, 0xa6, 0xbb, 0x12, 0xea, + 0x2d, 0x9f, 0xb2, 0x13, 0xcf, 0x45, 0xc8, 0xcb, 0x24, 0x3c, 0x58, 0x62, 0x41, 0x29, 0x37, 0x16, + 0xa7, 0x78, 0x1e, 0x86, 0xd1, 0x1c, 0x92, 0x1d, 0xab, 0xe8, 0x66, 0x92, 0x24, 0xa6, 0x6a, 0xfa, + 0xea, 0xdd, 0x09, 0x1b, 0xa8, 0x02, 0xfa, 0x5e, 0x3b, 0xd3, 0xb9, 0x8b, 0x1a, 0x08, 0x87, 0x6d, + 0x9e, 0xa5, 0x83, 0x59, 0x1d, 0x5c, 0x4b, 0x12, 0x57, 0xb5, 0x9e, 0x87, 0x34, 0x65, 0x01, 0x7c, + 0xfe, 0x01, 0xe2, 0xfb, 0x94, 0x69, 0x0b, 0x5c, 0xcd, 0xca, 0x99, 0xc2, 0x00, 0xc6, 0xf3, 0xfe, + 0x7a, 0x42, 0xb5, 0x7a, 0xab, 0xbb, 0x70, 0x7a, 0x33, 0xc3, 0x3a, 0x2e, 0xf4, 0x8a, 0x9d, 0x69, + 0xde, 0x90, 0x95, 0xd7, 0x44, 0xe4, 0x79, 0x10, 0xc8, 0x9b, 0xe7, 0xef, 0xac, 0x16, 0x16, 0x7b, + 0xce, 0xfb, 0xca, 0xc4, 0x47, 0x3e, 0x0b, 0x2f, 0x69, 0xb0, 0x7a, 0x30, 0x81, 0x83, 0xff, 0x26, + 0x9a, 0xab, 0x8b, 0x90, 0xd8, 0xf1, 0xd5, 0xf8, 0x66, 0x5d, 0xaf, 0xe0, 0x65, 0x36, 0xdd, 0x61, + 0x8b, 0x13, 0xb0, 0x28, 0xae, 0xa8, 0x9a, 0x10, 0x29, 0x61, 0x62, 0x48, 0x64, 0xc1, 0xee, 0x68, + 0xec, 0x42, 0x21, 0x84, 0x11, 0x8d, 0x20, 0xcb, 0xea, 0x43, 0x08, 0xe7, 0x23, 0x98, 0x26, 0x3a, + 0x40, 0x2c, 0x6e, 0xa4, 0xcb, 0x27, 0x69, 0xc8, 0x74, 0xbe, 0xba, 0x1f, 0x7d, 0xa2, 0xd1, 0xe7, + 0x93, 0xc0, 0x83, 0x8a, 0xfb, 0x1c, 0x1e, 0x47, 0x12, 0x84, 0x02, 0x81, 0x84, 0x4f, 0x06, 0xeb, + 0x4d, 0x36, 0xae, 0x66, 0x50, 0x55, 0x4d, 0x8e, 0x4f, 0x44, 0xe1, 0x68, 0x12, 0x0c, 0x52, 0xcb, + 0x20, 0x56, 0x97, 0x78, 0xdb, 0xd0, 0x67, 0x27, 0xbb, 0x0e, 0x7d, 0xb8, 0x0f, 0x63, 0xe1, 0x25, + 0xd6, 0x9c, 0xce, 0x59, 0x53, 0x7d, 0x3b, 0x47, 0x28, 0x1b, 0x2f, 0x34, 0xbd, 0x2a, 0x8a, 0x8c, + 0x0f, 0x6a, 0x58, 0x83, 0xb6, 0xbf, 0x60, 0xa4, 0x4b, 0xe5, 0xb1, 0x51, 0x0c, 0x8c, 0xc4, 0xf7, + 0x26, 0x11, 0xd4, 0xeb, 0xf2, 0x96, 0x76, 0xfc, 0x9e, 0xb6, 0x98, 0x63, 0xff, 0x9c, 0x37, 0xdb, + 0x91, 0x3a, 0x62, 0x71, 0x30, 0x49, 0xeb, 0xea, 0xef, 0xf3, 0xed, 0x76, 0x67, 0x17, 0x6a, 0x69, + 0x84, 0x65, 0xac, 0xd5, 0x5d, 0x48, 0x0b, 0x40, 0xba, 0x88, 0xc7, 0x54, 0x41, 0xb3, 0x8e, 0x05, + 0x1e, 0xac, 0xdb, 0xfb, 0x0e, 0x7c, 0x17, 0x6d, 0x90, 0x2a, 0xe9, 0x0d, 0x91, 0x54, 0x8c, 0x43, + 0x0a, 0x6b, 0xa4, 0x5f, 0xb3, 0x4a, 0xba, 0xdd, 0x2e, 0xaa, 0xa4, 0x5a, 0x36, 0x31, 0x76, 0x07, + 0xda, 0xb5, 0xa5, 0x29, 0x51, 0xfa, 0xcc, 0x16, 0xbb, 0xbc, 0xbd, 0x93, 0xd4, 0x67, 0xdb, 0xc4, + 0x3b, 0xbe, 0x87, 0x0d, 0x1d, 0xcc, 0x4d, 0x38, 0x3c, 0x56, 0x28, 0xec, 0xac, 0xe0, 0xef, 0x52, + 0xc3, 0x6f, 0x31, 0xa6, 0x04, 0x55, 0xc0, 0x9c, 0xa6, 0xa4, 0x72, 0xa0, 0xf1, 0x73, 0xe4, 0x62, + 0xc3, 0x4d, 0xd8, 0x4b, 0x5b, 0x79, 0xc9, 0x7d, 0x02, 0x6b, 0x17, 0x3c, 0xc4, 0x82, 0xbf, 0x51, + 0x2c, 0x1e, 0x28, 0x55, 0x6b, 0x37, 0x3b, 0x8d, 0x76, 0xf3, 0x09, 0x2c, 0x76, 0x5a, 0xb0, 0x22, + 0x25, 0x02, 0xba, 0x08, 0xfd, 0xd2, 0xb8, 0xe3, 0xdc, 0x9a, 0x4b, 0x9a, 0x60, 0xb3, 0xa2, 0xb1, + 0x41, 0xef, 0xbc, 0xd2, 0x66, 0x46, 0x36, 0xd7, 0x31, 0xfc, 0xcc, 0x10, 0xfd, 0x68, 0xc1, 0x10, + 0xfd, 0xee, 0x38, 0xd3, 0x8f, 0xab, 0x09, 0x9d, 0x6d, 0x69, 0xfe, 0xeb, 0xf0, 0x9c, 0x74, 0x0f, + 0x50, 0xf8, 0x6b, 0x62, 0x52, 0xf8, 0xdd, 0x55, 0xc9, 0x90, 0x34, 0x09, 0x6d, 0xe2, 0xac, 0x53, + 0x1b, 0x34, 0xd5, 0x30, 0x7a, 0x8e, 0x82, 0x78, 0xca, 0xf6, 0x63, 0x12, 0x67, 0xd4, 0xf3, 0xd7, + 0x4d, 0x45, 0xfd, 0x26, 0x0d, 0x48, 0xa4, 0x1b, 0xe4, 0xfc, 0xe5, 0x74, 0xad, 0x78, 0xbb, 0xe3, + 0x31, 0x1f, 0xb0, 0xce, 0x3d, 0xf4, 0x72, 0x43, 0xbf, 0xa9, 0x16, 0xa0, 0x37, 0x29, 0x6b, 0xd6, + 0x90, 0x8d, 0x83, 0xf3, 0x30, 0xc2, 0xef, 0x1a, 0x80, 0x0c, 0x55, 0x28, 0x84, 0xb0, 0xf3, 0x9c, + 0x43, 0x2f, 0x27, 0x57, 0x10, 0xdf, 0x70, 0x94, 0xba, 0xbe, 0x6a, 0x30, 0xdf, 0xf0, 0x94, 0xd3, + 0x48, 0xa6, 0x51, 0x88, 0x08, 0x0c, 0x8e, 0xd3, 0xd4, 0xf6, 0x9c, 0x6f, 0x7f, 0x31, 0x07, 0x31, + 0xba, 0xa6, 0x07, 0x54, 0x90, 0x56, 0xee, 0x40, 0x8a, 0x88, 0xc9, 0x50, 0xe3, 0xe3, 0x40, 0x4a, + 0x34, 0x75, 0x97, 0xbb, 0xb4, 0x6d, 0x72, 0x84, 0x30, 0x73, 0x91, 0xf9, 0x0c, 0x3c, 0x32, 0x89, + 0xe2, 0x1b, 0x31, 0x0d, 0x27, 0x6c, 0xa0, 0xa0, 0xed, 0xb5, 0xe6, 0x85, 0x37, 0x19, 0x08, 0x7b, + 0x53, 0xea, 0xec, 0x2d, 0xef, 0x35, 0x74, 0xa8, 0xe7, 0xc9, 0x8c, 0x44, 0x11, 0xea, 0x3a, 0x62, + 0xb5, 0x68, 0xce, 0x84, 0x32, 0x1a, 0x99, 0x8a, 0xa8, 0x6d, 0x67, 0x3a, 0x4a, 0x4a, 0x6b, 0x31, + 0x1e, 0x57, 0xd2, 0xf6, 0x90, 0x1a, 0xdb, 0x0f, 0x62, 0xf4, 0xf1, 0xdc, 0x8f, 0x38, 0x93, 0x5e, + 0xbd, 0x27, 0x89, 0xb9, 0x40, 0xd1, 0xb4, 0x51, 0xa6, 0x83, 0x71, 0x8b, 0x95, 0xa9, 0x4c, 0xd7, + 0xd6, 0x50, 0xa1, 0xe2, 0x9b, 0x81, 0xb6, 0x8e, 0xf6, 0x5f, 0x2a, 0xff, 0x1a, 0x66, 0x35, 0xa4, + 0x1d, 0xcc, 0x4e, 0x48, 0x35, 0xbc, 0x6b, 0x48, 0x6d, 0x24, 0x7b, 0xf8, 0xbf, 0x20, 0x62, 0x07, + 0xda, 0xea, 0x35, 0x4f, 0x0c, 0x06, 0x4e, 0xb2, 0x0c, 0x8e, 0xc7, 0x18, 0xa9, 0x42, 0xe4, 0x98, + 0xba, 0x62, 0x5f, 0x81, 0xe0, 0x0c, 0x60, 0x49, 0xd7, 0x84, 0x5e, 0x89, 0xc0, 0x2c, 0x04, 0x5e, + 0xf9, 0x59, 0x47, 0x31, 0xc3, 0xd6, 0x88, 0xa1, 0x6a, 0xd2, 0x3a, 0x22, 0x51, 0x74, 0xc2, 0xfc, + 0x71, 0x19, 0xe2, 0xb4, 0x59, 0xfd, 0x78, 0x3e, 0xf1, 0x3b, 0x8f, 0xdb, 0x84, 0x3c, 0xfa, 0xf7, + 0x7f, 0xfe, 0x0f, 0x73, 0x68, 0x91, 0xa8, 0x72, 0x42, 0xa4, 0x8c, 0xbc, 0x89, 0xb9, 0xa1, 0x3d, + 0xa2, 0xdf, 0xb4, 0x32, 0x69, 0xeb, 0xe8, 0xb4, 0x6a, 0xdb, 0xff, 0xdf, 0xff, 0xc5, 0x06, 0x71, + 0x50, 0xaa, 0x57, 0x38, 0x04, 0x69, 0x40, 0x50, 0xbf, 0x20, 0x66, 0x41, 0x0a, 0x63, 0x47, 0x00, + 0xc9, 0xe3, 0x84, 0x36, 0xe1, 0x5e, 0x58, 0xb1, 0xb0, 0xa9, 0x43, 0xfd, 0xd5, 0xfa, 0x62, 0x56, + 0x49, 0x2c, 0xd8, 0x34, 0xca, 0x4e, 0xab, 0x43, 0xec, 0x8d, 0xb8, 0x0c, 0xce, 0xbb, 0xa8, 0xff, + 0xf9, 0xff, 0x88, 0xf9, 0x1d, 0xb4, 0x3d, 0x8f, 0x11, 0xd6, 0x47, 0x64, 0x32, 0xf5, 0x88, 0x58, + 0xc5, 0x75, 0x31, 0x99, 0xc7, 0xd5, 0xa3, 0x15, 0xfe, 0xbf, 0xa0, 0x84, 0x14, 0x36, 0x01, 0x5e, + 0x43, 0x96, 0x26, 0xb2, 0x1c, 0x4e, 0xc2, 0x01, 0x83, 0xc7, 0x62, 0xf7, 0x14, 0x89, 0x4d, 0x5e, + 0x59, 0x4b, 0x85, 0x7a, 0x8c, 0xf0, 0x57, 0xd5, 0xd9, 0xe7, 0x3f, 0xbb, 0x8f, 0x45, 0x7c, 0xcf, + 0x08, 0x9a, 0x5f, 0xac, 0x6a, 0x44, 0x47, 0x2c, 0x26, 0x59, 0x13, 0xe6, 0x05, 0x71, 0xdc, 0x03, + 0xa4, 0x76, 0x76, 0xd5, 0xf6, 0x41, 0x82, 0x2d, 0x26, 0x2a, 0x2c, 0x94, 0x95, 0x30, 0x89, 0xea, + 0x07, 0x39, 0x40, 0x3c, 0xd1, 0x04, 0x0f, 0xa6, 0x34, 0x3b, 0x8f, 0x3a, 0x1d, 0x4f, 0xfe, 0xcc, + 0x5d, 0x18, 0xcc, 0xa3, 0xd9, 0xbc, 0xb0, 0xb3, 0xf2, 0xe3, 0x72, 0xc8, 0x97, 0xb8, 0x0c, 0x2b, + 0x47, 0x87, 0x41, 0xa9, 0xbc, 0x06, 0x7b, 0xed, 0x14, 0x87, 0xff, 0x78, 0xc9, 0xd8, 0xad, 0x1c, + 0x0e, 0xf9, 0x34, 0xbd, 0x78, 0x7b, 0xb4, 0xfd, 0xa8, 0xad, 0x8e, 0xde, 0x7e, 0x0f, 0xeb, 0x1e, + 0xe4, 0x29, 0x9a, 0xfa, 0xa9, 0xef, 0x81, 0xd4, 0x78, 0x0f, 0x24, 0xf9, 0x1f, 0xfe, 0xb0, 0x57, + 0x26, 0xfb, 0x58, 0x9e, 0xbe, 0xaf, 0xa7, 0x67, 0x46, 0xa4, 0x3e, 0x0f, 0xe1, 0xe6, 0x46, 0xa0, + 0xf2, 0x72, 0x29, 0x3f, 0x80, 0x2b, 0x06, 0xac, 0x33, 0x08, 0x97, 0x77, 0x2b, 0xd8, 0x1e, 0xbc, + 0xf2, 0x21, 0xd9, 0xc1, 0x34, 0xbc, 0xfd, 0x52, 0xf5, 0xe7, 0x04, 0x94, 0x5f, 0x28, 0xbe, 0xb7, + 0x13, 0x74, 0x49, 0x5d, 0xb4, 0x06, 0xd9, 0xa2, 0xcf, 0x2d, 0xaa, 0xd6, 0xe8, 0xac, 0x84, 0xfa, + 0x7c, 0x38, 0xc4, 0x06, 0x88, 0xe1, 0x01, 0xae, 0x47, 0x8f, 0xe8, 0x5f, 0x6d, 0xec, 0x5f, 0xdb, + 0x28, 0x6b, 0x5f, 0xef, 0x3f, 0x56, 0x35, 0xc1, 0x45, 0x7d, 0x39, 0xc0, 0x9c, 0x38, 0xbf, 0xfd, + 0x45, 0x43, 0xe5, 0x57, 0x65, 0x4e, 0x9e, 0x1b, 0x5d, 0xdb, 0x2b, 0xe6, 0xe2, 0xfc, 0x26, 0x8e, + 0x8e, 0x61, 0xb4, 0x7c, 0xc5, 0x1b, 0xc3, 0x5f, 0xe8, 0x91, 0x84, 0xbb, 0x99, 0xf0, 0xbf, 0x86, + 0x18, 0x42, 0x62, 0xf1, 0x76, 0x86, 0xc6, 0xc1, 0xd2, 0x4a, 0xfc, 0x81, 0x4d, 0x91, 0xed, 0x55, + 0x0d, 0x10, 0x84, 0x6f, 0x82, 0x89, 0x6f, 0x3b, 0x24, 0xa9, 0xc7, 0xb6, 0x43, 0x12, 0xe1, 0x04, + 0x36, 0x52, 0x89, 0x0f, 0xb7, 0x74, 0xcd, 0x95, 0x60, 0x4f, 0x64, 0xe2, 0x0b, 0x12, 0x8c, 0x21, + 0x06, 0xcc, 0x15, 0x86, 0x46, 0x52, 0x18, 0xe9, 0x13, 0x76, 0x6b, 0x5e, 0x2a, 0x59, 0x18, 0xe7, + 0x33, 0x7b, 0xb1, 0x2e, 0x5d, 0xaa, 0xa5, 0x2c, 0x24, 0xa0, 0x59, 0xda, 0xcf, 0x14, 0x92, 0x84, + 0xb4, 0x38, 0x37, 0x48, 0xeb, 0xc6, 0xbb, 0xca, 0x8e, 0xc5, 0xc0, 0xa9, 0xae, 0xd5, 0xa3, 0xe7, + 0xa7, 0xa7, 0x47, 0xa7, 0xdf, 0xbf, 0x7a, 0x0d, 0xdb, 0x4b, 0x00, 0xa9, 0x46, 0xe7, 0x35, 0x59, + 0x9a, 0xc4, 0x64, 0x4d, 0x07, 0xb0, 0x99, 0x7c, 0x73, 0x35, 0xcc, 0xdd, 0xc8, 0xbc, 0xbb, 0x70, + 0x20, 0x19, 0x66, 0x3e, 0x92, 0x43, 0x95, 0x6c, 0x4a, 0xa2, 0xef, 0x5d, 0xb5, 0x75, 0xed, 0xaa, + 0x06, 0xfd, 0x6f, 0xeb, 0x86, 0xfe, 0xd2, 0xff, 0xb6, 0x7e, 0xa1, 0xbf, 0x44, 0x16, 0x2f, 0x4d, + 0x7e, 0x91, 0xae, 0x54, 0xce, 0xaa, 0x80, 0x35, 0x7a, 0x7c, 0x7e, 0x1d, 0x87, 0x58, 0x32, 0x23, + 0x2c, 0x37, 0x43, 0x62, 0xde, 0x25, 0x64, 0xcc, 0x09, 0x4b, 0x84, 0x84, 0x45, 0x6c, 0x6c, 0xd2, + 0x21, 0x0b, 0x8b, 0x5b, 0xd7, 0xf7, 0x18, 0xc3, 0x2b, 0x02, 0xbe, 0x6c, 0x10, 0xdc, 0x30, 0x4b, + 0x19, 0x56, 0x5e, 0x13, 0x6c, 0x31, 0x90, 0xe1, 0x0a, 0x5d, 0x1f, 0x57, 0x25, 0x3f, 0xb9, 0x5f, + 0x9f, 0xd1, 0x01, 0xc4, 0x9d, 0x26, 0x69, 0x21, 0x5d, 0x44, 0xc5, 0x70, 0x7e, 0x59, 0x33, 0x1c, + 0x2b, 0xb1, 0x09, 0x8d, 0xe8, 0x45, 0x04, 0x5f, 0x05, 0xf0, 0x87, 0xf7, 0x5d, 0x21, 0x88, 0xf7, + 0x6f, 0xde, 0x88, 0x40, 0x42, 0x1b, 0x23, 0x49, 0x00, 0xec, 0xfd, 0xf7, 0x86, 0x38, 0x36, 0x13, + 0x4c, 0xfc, 0xd2, 0x28, 0xc7, 0x88, 0x81, 0xd5, 0xe2, 0xaa, 0x37, 0xc2, 0x46, 0xa9, 0xfb, 0xd4, + 0x32, 0xdd, 0xe6, 0x98, 0xee, 0xc4, 0x07, 0x2b, 0x7c, 0x19, 0xc5, 0x31, 0xc7, 0x76, 0x7a, 0xaa, + 0x1f, 0x11, 0xdb, 0x23, 0x91, 0x79, 0x92, 0x32, 0x83, 0x03, 0x01, 0x32, 0xe4, 0x71, 0x34, 0x4f, + 0x8a, 0xc1, 0x0f, 0xed, 0x7b, 0x0c, 0xc8, 0x64, 0x65, 0x59, 0x32, 0xa2, 0x0f, 0x47, 0xa7, 0x2f, + 0xbf, 0xfd, 0x8c, 0x21, 0x91, 0xca, 0x09, 0xc3, 0x85, 0x14, 0xdd, 0x42, 0xc2, 0x17, 0x99, 0x68, + 0x3d, 0x71, 0xff, 0xdb, 0xff, 0xce, 0x99, 0x9c, 0xf0, 0xfe, 0x01, 0xfd, 0x9d, 0xe2, 0x60, 0x9f, + 0xf4, 0xf5, 0x0d, 0x89, 0x43, 0x83, 0x1b, 0x2d, 0x58, 0x35, 0x18, 0x07, 0xb1, 0x39, 0xa0, 0xee, + 0xf5, 0xb1, 0x3a, 0xac, 0x9e, 0x31, 0x7d, 0xd4, 0xda, 0xad, 0x27, 0xed, 0x16, 0x49, 0x44, 0x2d, + 0xe1, 0xb7, 0x1f, 0x62, 0x64, 0x36, 0x5c, 0xc0, 0x79, 0x4f, 0xeb, 0xea, 0x6d, 0x95, 0xcf, 0x89, + 0xcd, 0x50, 0xd6, 0x74, 0x31, 0x08, 0x61, 0x1f, 0x00, 0x95, 0x18, 0x97, 0x37, 0x58, 0x07, 0x71, + 0x89, 0xf3, 0x50, 0x03, 0xe4, 0x41, 0xe4, 0x9d, 0xad, 0xc1, 0x71, 0x14, 0xc8, 0x4a, 0x7e, 0xfe, + 0xed, 0x11, 0xcf, 0xab, 0x88, 0x4f, 0x57, 0x71, 0x44, 0x6b, 0x84, 0xc4, 0xfc, 0xfa, 0xbd, 0xda, + 0xe4, 0x89, 0x34, 0x8d, 0x32, 0xab, 0x5a, 0xde, 0xea, 0x12, 0x3d, 0x5f, 0x62, 0x5e, 0x72, 0xd6, + 0x77, 0x3c, 0x97, 0x95, 0xf9, 0x0e, 0xa1, 0x3e, 0xfd, 0x9f, 0x20, 0x5b, 0x4b, 0x19, 0x22, 0x82, + 0x5a, 0x91, 0x97, 0xbd, 0x93, 0x24, 0x4e, 0xf9, 0xf7, 0xd9, 0x64, 0x7e, 0x8e, 0x0c, 0xdd, 0x24, + 0xde, 0x0e, 0xfd, 0xd9, 0x24, 0xba, 0xc9, 0x2d, 0x26, 0xb2, 0xc9, 0x62, 0x4d, 0xa6, 0x62, 0xfb, + 0x27, 0xf1, 0x7a, 0x42, 0xb4, 0x7b, 0x29, 0x67, 0x0d, 0x54, 0xd1, 0x5b, 0x74, 0xc0, 0x9e, 0x1e, + 0x31, 0xeb, 0x8b, 0xb9, 0xc1, 0x58, 0xc5, 0x3b, 0x25, 0x03, 0x67, 0xc6, 0x0f, 0xb2, 0x4e, 0xf0, + 0xd0, 0x12, 0x3e, 0x1e, 0x9b, 0x64, 0xe7, 0x18, 0xd8, 0xcd, 0x1c, 0xcf, 0x67, 0xd9, 0x49, 0x06, + 0x91, 0x11, 0x2d, 0x0c, 0x48, 0xdf, 0xad, 0x2d, 0xac, 0x00, 0x34, 0x1f, 0x59, 0x53, 0x9d, 0xc2, + 0x5b, 0x25, 0xcf, 0x44, 0x3b, 0xc6, 0xe2, 0x3e, 0x24, 0x12, 0x8f, 0x61, 0x7c, 0x9c, 0x8a, 0x10, + 0x4a, 0x3b, 0x04, 0xbd, 0xeb, 0xc1, 0x3e, 0x15, 0x24, 0x39, 0x3a, 0x12, 0x1f, 0xd1, 0xb5, 0x48, + 0x73, 0x26, 0x2c, 0xc9, 0x58, 0x4f, 0x56, 0x4d, 0x0e, 0x03, 0x47, 0xb7, 0xb4, 0xf1, 0x94, 0xc3, + 0xa2, 0xa4, 0xc5, 0x66, 0x30, 0x3d, 0x57, 0x63, 0xb9, 0x75, 0x41, 0xf7, 0x59, 0xba, 0x96, 0x9b, + 0x7f, 0x74, 0x57, 0xb3, 0x58, 0x1d, 0x1b, 0x7b, 0xdd, 0x12, 0xea, 0xae, 0xbc, 0x59, 0x76, 0x0a, + 0x05, 0x01, 0x67, 0xd2, 0x88, 0x41, 0xa2, 0x97, 0x3b, 0xe9, 0xa8, 0x93, 0x33, 0xef, 0x2a, 0xd4, + 0x9a, 0x8c, 0xb6, 0x61, 0xb6, 0x8d, 0x73, 0x83, 0x0d, 0x5e, 0x19, 0xca, 0xa1, 0xcd, 0x86, 0xb4, + 0xf0, 0x33, 0x45, 0x67, 0x0a, 0xbe, 0xdc, 0xf7, 0x73, 0x9f, 0xb9, 0xac, 0x4c, 0x44, 0x9d, 0x9e, + 0xe3, 0xcc, 0x24, 0xe1, 0x9f, 0xc7, 0x25, 0xc7, 0x5a, 0xc5, 0x1a, 0x4a, 0x64, 0x74, 0xf2, 0xaa, + 0x2e, 0xe2, 0xbd, 0x5c, 0x64, 0x6e, 0xac, 0x7e, 0x26, 0x88, 0xad, 0x8c, 0xb0, 0x23, 0x50, 0xf3, + 0x4b, 0xc4, 0x28, 0xea, 0xab, 0x14, 0x25, 0x52, 0x5e, 0x28, 0x84, 0x3d, 0x79, 0xd1, 0xe2, 0x8e, + 0xfe, 0xea, 0xf5, 0xe9, 0xeb, 0x97, 0xa7, 0xf9, 0x7e, 0x0e, 0xd3, 0xc1, 0x0f, 0xc4, 0x24, 0x62, + 0xd8, 0xab, 0x3a, 0x50, 0x05, 0x10, 0x27, 0xf0, 0xfc, 0x98, 0xd3, 0x6b, 0x45, 0xa1, 0x84, 0x20, + 0x61, 0x8e, 0xd3, 0xe8, 0xdc, 0x67, 0x6b, 0x89, 0xe4, 0x86, 0x34, 0x33, 0x06, 0xfc, 0x18, 0x09, + 0x35, 0xd1, 0xd6, 0xbb, 0x02, 0x72, 0xff, 0xee, 0x24, 0x34, 0xe2, 0x6b, 0x38, 0x0c, 0x85, 0xdb, + 0x23, 0x3e, 0xa6, 0x60, 0xc8, 0xb2, 0xc6, 0x05, 0x6b, 0x9a, 0x84, 0x0a, 0xb0, 0x63, 0x44, 0xcf, + 0x1a, 0xbb, 0x1f, 0xf3, 0xe0, 0x80, 0x8f, 0x6d, 0xb7, 0x53, 0x17, 0xfb, 0x72, 0x71, 0xea, 0x61, + 0x86, 0xd9, 0x2d, 0xfb, 0x48, 0x6c, 0xf0, 0xe1, 0x34, 0x39, 0x8a, 0xe6, 0x90, 0xb5, 0xde, 0x9e, + 0xa8, 0xa3, 0xe8, 0xfb, 0x7b, 0x03, 0xdd, 0x5b, 0x05, 0xd4, 0x4f, 0xff, 0x8a, 0x80, 0x10, 0x02, + 0x9b, 0xad, 0x61, 0x95, 0x7a, 0x33, 0xb5, 0xa5, 0xa9, 0x4b, 0x22, 0xe2, 0x75, 0xd0, 0x08, 0x1a, + 0xd8, 0xdf, 0x6d, 0xeb, 0xbd, 0x7b, 0x9a, 0xa5, 0xc7, 0x1e, 0x18, 0xb2, 0x67, 0xc2, 0x00, 0x15, + 0xf4, 0x71, 0x92, 0x35, 0x0b, 0xcd, 0x23, 0xb1, 0x68, 0x67, 0x5b, 0xd5, 0x0e, 0x0f, 0xf6, 0x77, + 0x2b, 0x38, 0xa7, 0x18, 0x4c, 0x4d, 0xf3, 0x62, 0x72, 0x19, 0x10, 0xa5, 0xa6, 0x20, 0xbd, 0x62, + 0x5f, 0xbf, 0xe5, 0xac, 0x91, 0x6b, 0x3a, 0x2b, 0xa9, 0x25, 0xa5, 0xb7, 0x3b, 0x7b, 0xdb, 0xff, + 0x4e, 0xbd, 0x35, 0x86, 0x28, 0xcd, 0x19, 0xc0, 0xb0, 0x33, 0xdb, 0xd4, 0x7d, 0x58, 0x42, 0xeb, + 0xe4, 0xd5, 0x3f, 0xd9, 0x21, 0x7c, 0x4b, 0xf9, 0x4f, 0x10, 0xd2, 0xa6, 0x79, 0xa4, 0x03, 0x75, + 0xf4, 0x16, 0xc1, 0xef, 0x38, 0x64, 0x83, 0x56, 0x51, 0x07, 0x23, 0x92, 0x28, 0x9d, 0x77, 0x46, + 0x6d, 0x1c, 0xea, 0xc0, 0x91, 0x26, 0x2f, 0x19, 0x2b, 0x84, 0x67, 0xbd, 0x9e, 0xab, 0x9b, 0x8d, + 0xd8, 0xa9, 0xfa, 0x2a, 0x26, 0xd9, 0x5b, 0xde, 0xb0, 0x79, 0x80, 0xd7, 0x4a, 0xb6, 0xa9, 0x18, + 0x4f, 0xab, 0x16, 0xbc, 0x0b, 0x1e, 0x59, 0xd6, 0xbb, 0x74, 0xbd, 0xcc, 0x78, 0xa6, 0x39, 0xd4, + 0xfa, 0xa5, 0xbf, 0xce, 0xf6, 0xa2, 0xcf, 0x4b, 0x2f, 0xe8, 0xb9, 0xf9, 0xe1, 0xea, 0x28, 0xcc, + 0xb5, 0x90, 0x15, 0x10, 0x86, 0x41, 0xcc, 0x81, 0x5e, 0x59, 0xb5, 0x52, 0x26, 0x0a, 0x5b, 0x6d, + 0x4a, 0xa7, 0xab, 0x61, 0x71, 0xcc, 0x6d, 0x5a, 0x00, 0x97, 0x65, 0x55, 0x57, 0xf2, 0x91, 0x58, + 0x3e, 0xf1, 0xd4, 0xb7, 0x1f, 0x5e, 0xff, 0xa5, 0x71, 0x7a, 0x52, 0x87, 0x95, 0x00, 0x99, 0x04, + 0x10, 0xea, 0x74, 0x65, 0x2b, 0xaa, 0xe9, 0xea, 0x61, 0xeb, 0x68, 0xd7, 0xbc, 0x19, 0x39, 0xfe, + 0xc0, 0x51, 0x48, 0x12, 0x38, 0xa8, 0x6a, 0xa4, 0x62, 0x22, 0x8c, 0xb6, 0x5d, 0x77, 0xe5, 0xf8, + 0x66, 0xcd, 0xec, 0x7d, 0xf4, 0xb2, 0xa3, 0x5f, 0x36, 0x8c, 0x3b, 0x9c, 0x5e, 0x49, 0x78, 0x1c, + 0xdc, 0xbe, 0xf5, 0xd5, 0x6d, 0x7b, 0xd7, 0x27, 0x12, 0x29, 0xc6, 0xa6, 0x8a, 0x34, 0x6a, 0x48, + 0xd0, 0xa0, 0x7d, 0x66, 0x9f, 0xe5, 0x9f, 0x77, 0xc5, 0x88, 0x32, 0xec, 0x15, 0x99, 0x2c, 0x94, + 0x0d, 0x74, 0x87, 0x83, 0x1e, 0x2d, 0xd8, 0x6f, 0x5f, 0xac, 0x05, 0x3b, 0x25, 0xda, 0xd0, 0x59, + 0x13, 0x96, 0x03, 0xde, 0x2b, 0x00, 0xce, 0x63, 0xec, 0x0a, 0x07, 0xb8, 0x31, 0xee, 0x7a, 0x39, + 0xde, 0x4e, 0xa0, 0x0a, 0x3b, 0x41, 0x18, 0x89, 0xfe, 0xcc, 0x71, 0xcf, 0x1c, 0x3a, 0xcf, 0xa7, + 0x68, 0x6d, 0xf4, 0x99, 0x08, 0xe1, 0x8c, 0x0e, 0x58, 0xd1, 0xaf, 0x68, 0x49, 0x3c, 0xc9, 0x02, + 0x2d, 0x6f, 0x44, 0x9b, 0x40, 0xd9, 0x25, 0x7f, 0xef, 0x36, 0xf2, 0x38, 0xbe, 0x8a, 0x76, 0x56, + 0x86, 0xf6, 0x65, 0x23, 0x7b, 0x40, 0x6b, 0x79, 0x3c, 0x80, 0x55, 0x68, 0x78, 0xff, 0xd8, 0x00, + 0xc8, 0x8d, 0x1c, 0xd7, 0x3d, 0xb7, 0x5a, 0xb4, 0x1b, 0x73, 0x36, 0xee, 0xb2, 0xc8, 0xfa, 0xd7, + 0xef, 0xbe, 0x7f, 0x6b, 0xc2, 0xea, 0x4b, 0x11, 0xa5, 0x1f, 0x9d, 0x41, 0x3f, 0x76, 0x5c, 0xe7, + 0x92, 0xff, 0xf5, 0xe4, 0x0f, 0x62, 0x43, 0x9d, 0x4f, 0x6e, 0x65, 0x8c, 0xdb, 0x47, 0x87, 0xc3, + 0xd1, 0x1d, 0x09, 0x0c, 0x43, 0x61, 0xf1, 0xe5, 0xd0, 0x2f, 0x09, 0x0a, 0xc3, 0x37, 0x8e, 0x51, + 0xe3, 0x1f, 0x24, 0x1a, 0xd3, 0xdf, 0x2c, 0x5a, 0x8d, 0x7e, 0x4b, 0xbc, 0x1a, 0x7f, 0x24, 0x59, + 0x89, 0xfe, 0x8e, 0x66, 0x97, 0x76, 0x63, 0x59, 0x80, 0x95, 0x69, 0x09, 0xb2, 0xb3, 0xfe, 0xc3, + 0x71, 0x43, 0xf4, 0x3b, 0x0f, 0xaa, 0xc9, 0x1f, 0xf6, 0xda, 0xd6, 0xc3, 0xa3, 0xfc, 0xcb, 0x76, + 0xf6, 0x6b, 0x27, 0xfb, 0xb5, 0x7b, 0xcd, 0x2d, 0x16, 0x7d, 0x25, 0x1f, 0x9d, 0x64, 0x78, 0x41, + 0x25, 0xc4, 0x49, 0x90, 0x17, 0x30, 0x41, 0xcf, 0x1f, 0x1d, 0xd8, 0x93, 0x51, 0xc0, 0x04, 0x1e, + 0x73, 0x99, 0x82, 0x15, 0x93, 0xfa, 0x3c, 0x9b, 0x27, 0x18, 0xe5, 0x80, 0x84, 0x71, 0x87, 0x2d, + 0x98, 0xfa, 0xef, 0x9c, 0x4b, 0x97, 0x18, 0xdb, 0x47, 0x07, 0x01, 0xeb, 0x0e, 0x58, 0x96, 0xfd, + 0x79, 0xaa, 0x1b, 0x14, 0x04, 0xe8, 0xc8, 0x65, 0xd7, 0xc1, 0x1c, 0xeb, 0x3f, 0x7a, 0xaa, 0xb9, + 0x52, 0x65, 0x48, 0xc8, 0x47, 0x27, 0x4e, 0x67, 0xce, 0x27, 0x8b, 0x0a, 0x88, 0x08, 0x5e, 0xbc, + 0x3e, 0x3e, 0x7b, 0x7e, 0x7a, 0x7a, 0x5c, 0x22, 0x86, 0x72, 0xcc, 0xe6, 0x2d, 0x4d, 0x40, 0xd7, + 0xa1, 0xe5, 0x4e, 0xec, 0xa3, 0xeb, 0xc0, 0x56, 0xe6, 0xb8, 0x70, 0xa3, 0xd1, 0x6f, 0xe7, 0xce, + 0x5d, 0x12, 0x70, 0x29, 0x95, 0x3a, 0xba, 0xd2, 0xf6, 0xde, 0x5e, 0x65, 0x1d, 0x1d, 0xe6, 0x57, + 0x6a, 0xc1, 0x14, 0x6d, 0x37, 0xdb, 0x0b, 0xa5, 0xff, 0xb6, 0xa6, 0xb4, 0x35, 0xc2, 0x57, 0xef, + 0xbf, 0x7f, 0xf1, 0xe6, 0xf5, 0xd9, 0x37, 0x47, 0xaf, 0xdf, 0xbc, 0x3a, 0xb1, 0xce, 0x98, 0x7c, + 0x5c, 0x8c, 0xd6, 0x75, 0xcb, 0xce, 0xbe, 0x45, 0x46, 0x50, 0xee, 0x74, 0xb9, 0x5b, 0x1b, 0x9f, + 0xf2, 0xb3, 0x2b, 0x27, 0xb4, 0xd5, 0x1e, 0xbd, 0x7f, 0x87, 0x46, 0xa9, 0xb1, 0xdb, 0x60, 0xd8, + 0xd5, 0x07, 0x41, 0x1c, 0x97, 0x6f, 0xd1, 0xe9, 0x3a, 0x27, 0xfa, 0xf1, 0xc2, 0xbf, 0x49, 0x40, + 0x6a, 0xc5, 0xd3, 0x2d, 0xee, 0x92, 0x23, 0x2a, 0x6e, 0xf9, 0x3c, 0xc9, 0x27, 0xc2, 0x8e, 0x86, + 0xcf, 0x4c, 0x2e, 0x87, 0xaf, 0x1f, 0x0d, 0x7c, 0xfb, 0xac, 0x88, 0x5b, 0x38, 0xd4, 0x91, 0x83, + 0x20, 0xf2, 0xce, 0xea, 0xe3, 0x90, 0xbe, 0xa9, 0x5c, 0x3c, 0x96, 0xe1, 0x16, 0x0e, 0x53, 0xb8, + 0x8b, 0x87, 0x1f, 0xdc, 0xc2, 0x3a, 0x71, 0xad, 0x70, 0x7e, 0xb7, 0xb8, 0xc4, 0x5c, 0xcb, 0xa1, + 0xe7, 0x96, 0xdd, 0x64, 0x6e, 0x95, 0xfb, 0x07, 0x7d, 0x95, 0xae, 0x22, 0x16, 0x30, 0xef, 0xac, + 0x3c, 0x99, 0xee, 0xda, 0xf1, 0xfd, 0xae, 0x1d, 0xb1, 0xef, 0x16, 0xa3, 0xf0, 0x33, 0x68, 0x32, + 0x8f, 0x19, 0xb8, 0x1f, 0xf0, 0x98, 0x81, 0x2b, 0x72, 0x48, 0xd7, 0x0e, 0x8a, 0x77, 0x0b, 0xe1, + 0xec, 0x6e, 0x39, 0xe0, 0xdc, 0x5d, 0xa0, 0xb2, 0x72, 0x00, 0xb7, 0xbb, 0x64, 0xc9, 0xb9, 0x95, + 0x6b, 0xca, 0xad, 0x60, 0xc0, 0x6e, 0x89, 0x28, 0x8b, 0x34, 0xe9, 0x96, 0xb9, 0x68, 0x36, 0x64, + 0xc3, 0x24, 0xb2, 0x41, 0xbf, 0xcf, 0x5e, 0xe8, 0x71, 0x2f, 0xc4, 0xc5, 0xb9, 0x0b, 0xe1, 0x6b, + 0x6e, 0x25, 0xaf, 0x71, 0x97, 0x46, 0x91, 0xb9, 0x4b, 0x62, 0xb5, 0xdc, 0x75, 0x51, 0x55, 0x6e, + 0x55, 0x24, 0x92, 0x5b, 0x1d, 0xeb, 0x93, 0x0d, 0x31, 0x8b, 0xf1, 0xc8, 0xc6, 0xf8, 0x2a, 0x7f, + 0xa3, 0x07, 0xb9, 0x18, 0xd3, 0xe3, 0x2e, 0x89, 0x9c, 0x71, 0xcb, 0xb1, 0x2b, 0x6e, 0x65, 0x10, + 0x49, 0xd6, 0x3a, 0xf7, 0x33, 0x6b, 0xf9, 0xb9, 0x3c, 0xe9, 0x56, 0x8b, 0xae, 0x3e, 0xb7, 0xb0, + 0x67, 0xb8, 0x8b, 0x0e, 0x3c, 0xb7, 0xec, 0x6e, 0x73, 0x8b, 0x1e, 0x2d, 0xd7, 0x8e, 0x1d, 0xc9, + 0x3a, 0x80, 0x7d, 0xd4, 0x34, 0xff, 0xcd, 0x87, 0x1f, 0xb2, 0xc6, 0x4b, 0xa1, 0x21, 0xae, 0x15, + 0xbb, 0xe1, 0x16, 0xe3, 0x2a, 0xdc, 0x32, 0x4f, 0x2c, 0x47, 0x2b, 0x58, 0xcb, 0x71, 0x9e, 0x2f, + 0xc6, 0xb7, 0xdf, 0x5b, 0x4b, 0x71, 0x6e, 0x0d, 0xb3, 0xe8, 0xa1, 0x72, 0x0b, 0xbe, 0x25, 0x77, + 0xd1, 0x31, 0xe4, 0x2e, 0x7a, 0x77, 0xdc, 0x82, 0x3f, 0xc6, 0x2d, 0xbb, 0x51, 0x72, 0xe4, 0x6b, + 0x3b, 0x62, 0x8e, 0xff, 0xec, 0x85, 0x99, 0x82, 0xb2, 0x57, 0xc4, 0x5d, 0xf4, 0x53, 0xb8, 0x15, + 0x66, 0x7f, 0xb7, 0xda, 0x76, 0xee, 0x2e, 0xb1, 0x40, 0xbb, 0x15, 0x96, 0x5e, 0xb7, 0xd2, 0xb4, + 0xea, 0x56, 0x1b, 0x3f, 0x73, 0x6a, 0x66, 0x5d, 0x2f, 0x27, 0x65, 0xa3, 0xfa, 0xe5, 0xa4, 0x5c, + 0x34, 0x75, 0xba, 0x25, 0xcb, 0x9f, 0xbb, 0x68, 0x6e, 0x73, 0xcb, 0x06, 0x25, 0xb7, 0xc2, 0x12, + 0xe3, 0x96, 0xcc, 0x27, 0xee, 0x82, 0xe5, 0xc3, 0x5d, 0xb4, 0x2f, 0xb8, 0x95, 0x4a, 0xbc, 0x5b, + 0xad, 0x71, 0xbb, 0xb6, 0x46, 0x9c, 0x8d, 0x57, 0x76, 0xdf, 0x6c, 0xbc, 0x99, 0x2a, 0x96, 0x8d, + 0xb7, 0xa4, 0xa1, 0xba, 0x05, 0x61, 0xc9, 0x2d, 0x49, 0x56, 0xae, 0xad, 0x8e, 0xba, 0x15, 0xaa, + 0x96, 0x5b, 0x54, 0x91, 0xdc, 0xb2, 0x62, 0xe3, 0xda, 0xba, 0x87, 0xbb, 0x20, 0x1b, 0x94, 0xe4, + 0xf8, 0x4f, 0x77, 0x1b, 0x9f, 0x7a, 0xf6, 0x39, 0x5e, 0xdc, 0x83, 0x33, 0xf6, 0x27, 0x30, 0xab, + 0xd9, 0xa7, 0x79, 0xbd, 0xe4, 0x26, 0x1c, 0xa8, 0xd1, 0x3c, 0x14, 0xed, 0xdf, 0x9b, 0x05, 0x35, + 0xf8, 0x69, 0xeb, 0xb7, 0x38, 0x85, 0x2c, 0xa2, 0x04, 0x42, 0x7d, 0xbc, 0x2b, 0x0f, 0x49, 0x36, + 0x10, 0xdd, 0x21, 0xdf, 0x7b, 0xf8, 0x1e, 0xfb, 0xe9, 0x3c, 0x0e, 0x55, 0xcc, 0x99, 0x15, 0xf8, + 0xe0, 0xec, 0xdd, 0xc6, 0x46, 0x06, 0x8b, 0xef, 0x17, 0xab, 0x4d, 0x93, 0x73, 0x57, 0x45, 0x17, + 0x07, 0x08, 0x39, 0xb1, 0xa1, 0xfa, 0x08, 0xb7, 0x1f, 0x46, 0x83, 0x39, 0x7c, 0xd3, 0x4d, 0x31, + 0xbf, 0xbc, 0x9e, 0xb0, 0xa7, 0xba, 0x46, 0x7c, 0xed, 0xd2, 0x91, 0x26, 0xfc, 0x49, 0x93, 0x8f, + 0x41, 0x9b, 0x43, 0xc2, 0x0c, 0x54, 0x39, 0x6a, 0x4b, 0xd5, 0xa2, 0x0b, 0xf5, 0x4c, 0xbf, 0x68, + 0x44, 0x17, 0x8e, 0xea, 0x9a, 0x07, 0x3f, 0x8e, 0xf3, 0xda, 0x48, 0xa4, 0xf1, 0x52, 0xdf, 0x58, + 0x46, 0x9a, 0x51, 0x72, 0xce, 0x1f, 0xb2, 0x86, 0xcf, 0xfd, 0x54, 0xb7, 0xfa, 0xe2, 0xe6, 0x68, + 0x58, 0x13, 0x08, 0x89, 0x53, 0x6f, 0xe2, 0xe2, 0xe2, 0x70, 0xf8, 0x72, 0x1c, 0x4c, 0x86, 0x35, + 0x7f, 0x22, 0xe0, 0x12, 0x3f, 0x3d, 0x0d, 0xa6, 0x3e, 0x31, 0xfd, 0x5a, 0xad, 0xae, 0x0e, 0x0e, + 0x01, 0x3f, 0xf6, 0xa7, 0xc4, 0x81, 0x6b, 0xa4, 0x6e, 0xef, 0x20, 0x78, 0x41, 0x70, 0x90, 0xa3, + 0x9d, 0x6f, 0xf7, 0xb3, 0xf0, 0x9d, 0x61, 0x27, 0xbf, 0xeb, 0x2d, 0x18, 0x0a, 0x5e, 0xb2, 0x3e, + 0x71, 0xda, 0x8d, 0x13, 0x6d, 0x4c, 0x7d, 0x3e, 0x99, 0xd4, 0x9c, 0x26, 0x34, 0x8e, 0x3a, 0x48, + 0xe9, 0xb5, 0x47, 0x33, 0x50, 0x4b, 0xdd, 0x80, 0xdb, 0xbf, 0x95, 0xdc, 0x12, 0x82, 0xd1, 0x80, + 0x8f, 0x31, 0x7f, 0xcc, 0x2f, 0x01, 0x74, 0xf9, 0x32, 0x3f, 0x17, 0xb7, 0xd4, 0xb9, 0xf6, 0x85, + 0x72, 0x9f, 0x7a, 0x52, 0x2d, 0x15, 0xd4, 0x22, 0x0b, 0x62, 0x53, 0x8e, 0x18, 0xd4, 0x1c, 0x13, + 0xc1, 0x07, 0x68, 0x1f, 0x83, 0x4f, 0x7c, 0xef, 0x1e, 0x75, 0x90, 0x6b, 0xdc, 0xd5, 0x7b, 0xf7, + 0xe8, 0xa7, 0xc9, 0x46, 0x61, 0xf5, 0x77, 0x80, 0xbe, 0x0e, 0xac, 0xd6, 0x34, 0xd2, 0x4c, 0x6b, + 0xf5, 0xfa, 0x9a, 0x49, 0x21, 0xa8, 0xce, 0x16, 0x75, 0xc3, 0x02, 0xe1, 0x0d, 0x87, 0x79, 0x7d, + 0xae, 0x4e, 0x48, 0x87, 0xe7, 0x80, 0xb3, 0xe6, 0x4a, 0x64, 0x38, 0x9c, 0x95, 0x79, 0x86, 0x61, + 0xb8, 0xcd, 0xd8, 0x9e, 0xce, 0x64, 0x2c, 0xf7, 0x12, 0x2a, 0x6a, 0x23, 0xbe, 0x29, 0xe4, 0x72, + 0xf2, 0x52, 0x49, 0x87, 0x30, 0x83, 0xad, 0x1c, 0x60, 0x5c, 0x7d, 0x63, 0x88, 0x1c, 0x95, 0xa2, + 0x6a, 0xbe, 0x07, 0x33, 0x24, 0xfc, 0x10, 0x04, 0x6c, 0x46, 0x1f, 0x02, 0xc4, 0x1f, 0x0d, 0x68, + 0x6b, 0x8c, 0x52, 0x75, 0x1e, 0x71, 0x40, 0x12, 0xa9, 0xff, 0x34, 0xdd, 0x4a, 0x05, 0x23, 0x9a, + 0x5f, 0xc6, 0x22, 0x5f, 0x16, 0x48, 0x60, 0x10, 0x07, 0x8d, 0x8b, 0x12, 0x4d, 0x76, 0x98, 0x1a, + 0x8d, 0x0a, 0xfa, 0x7a, 0x8d, 0xe8, 0x5b, 0x32, 0x05, 0xc8, 0xc2, 0x71, 0x68, 0x20, 0x3c, 0x8a, + 0x11, 0x1f, 0xd3, 0xee, 0x32, 0xd1, 0x13, 0x13, 0xf7, 0x93, 0x84, 0x7a, 0xe6, 0x4a, 0xd0, 0x95, + 0xc6, 0x1c, 0xb5, 0x22, 0xc7, 0x10, 0x9a, 0x67, 0x34, 0xcf, 0x1f, 0x88, 0x9b, 0xd7, 0x6f, 0xd5, + 0x60, 0xe2, 0x7b, 0x19, 0x8f, 0x5b, 0xf8, 0xde, 0x53, 0xa5, 0x37, 0x50, 0x4f, 0xe6, 0x93, 0x49, + 0x4f, 0xdd, 0x15, 0xbb, 0x6d, 0xdf, 0x44, 0x78, 0xcb, 0xfd, 0xab, 0x48, 0xff, 0xd0, 0xe3, 0x0f, + 0x34, 0x03, 0x6f, 0xd8, 0xd5, 0x39, 0x23, 0x78, 0x5d, 0xb9, 0xf6, 0x51, 0x32, 0xe8, 0x6d, 0x4d, + 0x68, 0xce, 0xdc, 0xec, 0x2e, 0x16, 0x4c, 0x80, 0xdc, 0x7f, 0xe7, 0xcb, 0x39, 0x4e, 0x5e, 0x0c, + 0x1a, 0x65, 0xaa, 0xa2, 0x67, 0xc8, 0xbc, 0x64, 0x46, 0x22, 0x4b, 0x0f, 0x4d, 0x64, 0x3d, 0x38, + 0xe1, 0x46, 0xb0, 0x08, 0xb7, 0x65, 0x11, 0x12, 0xb1, 0x96, 0x16, 0xa2, 0x95, 0x43, 0x85, 0x16, + 0x5d, 0xe5, 0x92, 0xa4, 0xe6, 0xbe, 0x99, 0x12, 0xc9, 0xa5, 0x34, 0x29, 0x21, 0x8f, 0x95, 0xd0, + 0x10, 0x12, 0x16, 0x18, 0x31, 0xea, 0xd7, 0x5f, 0x55, 0xa8, 0x9e, 0xaa, 0x76, 0xdd, 0xf0, 0x3d, + 0x47, 0x42, 0x56, 0x9d, 0x5e, 0xc6, 0xd4, 0xe6, 0xbc, 0x00, 0xc1, 0xbc, 0xff, 0x09, 0xff, 0x30, + 0x1b, 0xff, 0x0b, 0xfe, 0x39, 0x7d, 0x81, 0x55, 0xa7, 0x10, 0xe4, 0xa8, 0x02, 0x2a, 0xd4, 0xc6, + 0x03, 0x3b, 0x7b, 0xa9, 0x81, 0xc3, 0x03, 0xce, 0x4b, 0xac, 0xfe, 0xf4, 0x27, 0xfa, 0xf6, 0x54, + 0xcd, 0x9b, 0x13, 0x3f, 0x3c, 0x4f, 0xc7, 0xaa, 0xa1, 0x3a, 0x34, 0x8d, 0xa1, 0x6a, 0xc9, 0xf7, + 0x9e, 0x0a, 0xb6, 0xb6, 0x64, 0x7a, 0x74, 0x07, 0x6a, 0x01, 0x4f, 0x51, 0x9b, 0xf8, 0x60, 0x48, + 0x2b, 0xf8, 0x1b, 0xc4, 0x83, 0xd5, 0xa8, 0x7f, 0x5d, 0xeb, 0xb1, 0x53, 0xaf, 0x13, 0xdd, 0x38, + 0x4c, 0x3d, 0x73, 0x5a, 0xd1, 0xbd, 0x02, 0x8f, 0xa6, 0x21, 0xbf, 0xf0, 0x48, 0xb3, 0x22, 0xee, + 0x5a, 0x9b, 0xf1, 0x90, 0x35, 0x2f, 0xa1, 0x3e, 0xd6, 0x66, 0x18, 0xb2, 0x43, 0xeb, 0x98, 0x16, + 0x1d, 0xa1, 0x9f, 0x14, 0xb7, 0xf7, 0xa3, 0x9a, 0xd3, 0x72, 0x18, 0xbf, 0xba, 0x0b, 0x01, 0x7a, + 0x8f, 0x0e, 0x90, 0xa6, 0x34, 0x21, 0xa1, 0x8a, 0xba, 0xb4, 0x45, 0xdd, 0xa6, 0x2e, 0x64, 0xd5, + 0xb9, 0xc5, 0xd2, 0x3e, 0x53, 0x41, 0x42, 0x68, 0x9c, 0xd6, 0xe2, 0xad, 0xc5, 0xd1, 0x3e, 0x0a, + 0xd5, 0x08, 0x09, 0x11, 0xf5, 0x8c, 0xce, 0x3f, 0x65, 0x7b, 0x11, 0x72, 0x44, 0x93, 0x18, 0x08, + 0x71, 0x9d, 0xd4, 0x69, 0x49, 0x60, 0x82, 0xdd, 0xcb, 0x59, 0xcc, 0xe4, 0xe9, 0x98, 0x15, 0x26, + 0x94, 0x83, 0xc9, 0xac, 0xbb, 0xcb, 0xab, 0xe8, 0x0c, 0x91, 0xf7, 0xae, 0x25, 0x44, 0x5d, 0x55, + 0x9c, 0x4b, 0x7f, 0xd2, 0x8b, 0x43, 0x6f, 0xa6, 0xfe, 0xe0, 0xe5, 0x08, 0xc9, 0x31, 0x6a, 0x34, + 0x1a, 0xcc, 0x38, 0xfd, 0x69, 0xd2, 0x4e, 0xa6, 0x7f, 0xf1, 0xed, 0x67, 0xd6, 0xef, 0xa6, 0x5e, + 0x31, 0x8b, 0xaf, 0x9a, 0xd2, 0xd9, 0x3a, 0x90, 0x8c, 0x84, 0x1a, 0x79, 0x13, 0x7c, 0xe0, 0xe3, + 0x40, 0xb7, 0xc4, 0xc2, 0x08, 0x4f, 0x84, 0x45, 0xac, 0xa6, 0x24, 0x81, 0xd4, 0x42, 0x38, 0x95, + 0xff, 0xea, 0x2b, 0x5d, 0xc3, 0x04, 0xd6, 0x70, 0xc1, 0xa5, 0x3c, 0xd9, 0x64, 0x6f, 0xa1, 0x71, + 0x97, 0xb6, 0x58, 0x78, 0x65, 0xad, 0x46, 0xc2, 0x48, 0x5f, 0x18, 0x83, 0x80, 0xd3, 0xbc, 0x41, + 0x1a, 0x91, 0x74, 0x14, 0x3c, 0xc6, 0x36, 0x20, 0xd9, 0x75, 0xfb, 0x69, 0x28, 0xd9, 0x70, 0x0e, + 0x56, 0x77, 0x24, 0x4b, 0xa9, 0xe3, 0xd4, 0x17, 0xaa, 0x47, 0xb3, 0xfb, 0xd5, 0x8e, 0x66, 0xc5, + 0xca, 0xc8, 0x4a, 0xb3, 0xae, 0x66, 0x96, 0xbe, 0xc6, 0x54, 0x05, 0xc3, 0x30, 0xe3, 0xd5, 0xdc, + 0x52, 0x65, 0xa3, 0x68, 0x66, 0x17, 0x7f, 0x1e, 0x28, 0x88, 0x43, 0x3d, 0xfb, 0x7b, 0x34, 0x5b, + 0xf6, 0x19, 0xf0, 0x4b, 0x38, 0xb6, 0x25, 0xcd, 0x03, 0xdb, 0xd0, 0xaa, 0xaf, 0x90, 0xb3, 0xe5, + 0x52, 0x96, 0xbc, 0xba, 0x70, 0x09, 0xf0, 0x89, 0x28, 0x00, 0x48, 0x4d, 0xc2, 0x18, 0x2d, 0x2d, + 0xca, 0x39, 0xdc, 0xe3, 0xd3, 0x0f, 0x2e, 0x47, 0xf1, 0xeb, 0xcc, 0xcf, 0x28, 0x86, 0x0b, 0xb3, + 0x9a, 0x4a, 0x12, 0x9d, 0x60, 0x08, 0xec, 0xf5, 0x07, 0x1c, 0x13, 0x46, 0x8d, 0xad, 0x31, 0x8c, + 0xb4, 0x27, 0x19, 0x51, 0x42, 0x24, 0x64, 0xc6, 0x7e, 0xd3, 0x29, 0x74, 0x5e, 0xdf, 0xd0, 0x6b, + 0x6e, 0xf0, 0xe5, 0x4f, 0x77, 0x24, 0x3c, 0x25, 0xbe, 0x5a, 0x85, 0x23, 0xab, 0x74, 0x25, 0x92, + 0x0a, 0xdf, 0x8b, 0x0d, 0xe5, 0xf8, 0xbb, 0x33, 0xf3, 0x02, 0x5e, 0x02, 0xaa, 0xc3, 0x5f, 0x5a, + 0x71, 0xd9, 0xec, 0xc8, 0x6c, 0x03, 0x1e, 0x7f, 0xc1, 0x12, 0x33, 0x30, 0x57, 0xce, 0x3d, 0xe4, + 0xf8, 0x32, 0xed, 0xb3, 0x74, 0xbf, 0xb8, 0xda, 0xd6, 0x40, 0x42, 0x72, 0xac, 0x05, 0x50, 0xf6, + 0x66, 0x44, 0x32, 0x3f, 0x15, 0x39, 0x63, 0x8f, 0x48, 0xfd, 0x5e, 0x20, 0x39, 0xa1, 0xd6, 0x1a, + 0x98, 0x5c, 0xa6, 0x04, 0x54, 0x90, 0x81, 0x5c, 0x4a, 0xeb, 0x48, 0x1f, 0x65, 0x9c, 0xac, 0x1e, + 0xe1, 0x97, 0x00, 0xc6, 0xc4, 0xde, 0xd9, 0x8b, 0x6a, 0x70, 0xab, 0x18, 0x54, 0x99, 0x78, 0x4f, + 0xc6, 0xd1, 0x15, 0xbc, 0x3d, 0xa1, 0x7f, 0xe5, 0x6b, 0x61, 0x9e, 0x46, 0x08, 0x0a, 0x32, 0x3b, + 0x1f, 0x36, 0x2c, 0x21, 0x29, 0x7d, 0x2a, 0x84, 0x33, 0x39, 0xda, 0x59, 0x8e, 0xf4, 0x4c, 0xe3, + 0xc4, 0x96, 0xda, 0x43, 0x9e, 0x81, 0x0c, 0xd5, 0xba, 0xcd, 0x2a, 0x9a, 0x5b, 0xa0, 0xba, 0x72, + 0x59, 0x7b, 0xd9, 0xdd, 0x15, 0x50, 0x92, 0xf6, 0xd7, 0x21, 0x84, 0xfb, 0xeb, 0x94, 0x30, 0xe9, + 0x9b, 0x23, 0x42, 0xab, 0x6a, 0x72, 0xa1, 0xbc, 0x66, 0xda, 0x6f, 0xf2, 0xdd, 0xc7, 0xdf, 0x9e, + 0xbe, 0x7d, 0x23, 0x79, 0x91, 0x72, 0x24, 0x7f, 0x55, 0x44, 0x94, 0x85, 0xe8, 0xf5, 0x2d, 0x3c, + 0x8c, 0x62, 0x95, 0xf4, 0xfd, 0xbe, 0x78, 0x2c, 0x15, 0xb6, 0x11, 0xa9, 0xb2, 0xd9, 0x4d, 0xa2, + 0x98, 0x34, 0x27, 0xcf, 0xed, 0xf3, 0x16, 0xd9, 0x6f, 0x72, 0xaa, 0x74, 0x12, 0x73, 0x3c, 0xf9, + 0x55, 0xcf, 0x6b, 0x90, 0xe6, 0x50, 0x13, 0x0c, 0x8e, 0xf8, 0x34, 0xa1, 0x00, 0xb0, 0x86, 0x9b, + 0xcd, 0x4b, 0xbc, 0x42, 0x8d, 0x4c, 0x63, 0xc7, 0x82, 0x09, 0xf1, 0xc2, 0xc6, 0xac, 0xf5, 0x41, + 0x29, 0xa7, 0x32, 0xab, 0x2e, 0x67, 0xb3, 0x25, 0xfa, 0x5c, 0x5a, 0x94, 0xd3, 0x81, 0x2d, 0x2d, + 0xb5, 0xbe, 0x7e, 0x1c, 0x5d, 0x11, 0x63, 0x43, 0x1e, 0xb0, 0x95, 0xb9, 0xd7, 0xd4, 0x70, 0xb2, + 0x79, 0xf8, 0x2a, 0x4b, 0x8b, 0xae, 0x33, 0xac, 0x2d, 0x02, 0x5e, 0x0d, 0xc4, 0xba, 0x0d, 0xbb, + 0xf2, 0xd6, 0x64, 0xc9, 0x5f, 0x9e, 0x81, 0x97, 0xce, 0x97, 0xf0, 0x37, 0x80, 0x42, 0x4c, 0x4a, + 0xcc, 0xc7, 0xf6, 0xa7, 0x12, 0x25, 0x8d, 0xd8, 0x28, 0xb9, 0xac, 0x78, 0xe7, 0xd3, 0x0a, 0x5e, + 0x34, 0x62, 0xf3, 0x75, 0x7d, 0x59, 0xdd, 0xed, 0xc5, 0xa6, 0x84, 0x72, 0x9e, 0xb1, 0x43, 0xe5, + 0x15, 0x4d, 0x79, 0xcd, 0xbc, 0xfa, 0x33, 0x47, 0x52, 0x13, 0x95, 0x47, 0x6f, 0x70, 0x5c, 0xce, + 0x3f, 0x49, 0x71, 0x3a, 0xa7, 0x06, 0x81, 0x74, 0x91, 0xc2, 0xb9, 0x99, 0x82, 0x16, 0x4b, 0x2a, + 0xec, 0x10, 0x7c, 0x53, 0xa7, 0xba, 0x83, 0x9c, 0xa6, 0x15, 0x6d, 0x1b, 0xd1, 0x5a, 0x3f, 0xe1, + 0x83, 0x6a, 0xf0, 0x49, 0x8f, 0x49, 0x9c, 0xc5, 0x4a, 0x5d, 0x9b, 0x22, 0x9f, 0x55, 0x38, 0x36, + 0x2b, 0x7f, 0x7f, 0x7c, 0x84, 0x48, 0xb3, 0x28, 0x04, 0xa1, 0x0a, 0xea, 0x0a, 0xe3, 0xbf, 0x5b, + 0xd3, 0xcb, 0x78, 0x5a, 0xd1, 0x4b, 0x6a, 0x57, 0xe6, 0xb0, 0x0a, 0x22, 0xb1, 0x15, 0xdb, 0xa6, + 0x91, 0xc6, 0xd6, 0xd7, 0xbb, 0x02, 0xcf, 0x2b, 0x2d, 0xee, 0xfb, 0x70, 0xbd, 0x25, 0x1c, 0x4b, + 0x0b, 0xa4, 0x09, 0x0b, 0xbc, 0x85, 0x0d, 0xd8, 0xe7, 0x10, 0x86, 0xc2, 0x93, 0x51, 0x6d, 0x59, + 0xa4, 0x75, 0x44, 0xeb, 0x85, 0x0c, 0xc2, 0xf5, 0x2c, 0x69, 0x3e, 0xe3, 0x93, 0xb9, 0x7d, 0x49, + 0x74, 0x61, 0x7b, 0xc3, 0xaf, 0x32, 0x32, 0x55, 0xf5, 0x3f, 0xb7, 0x20, 0x68, 0x0e, 0xab, 0x33, + 0xbe, 0x53, 0xcf, 0xe4, 0x97, 0x16, 0xce, 0xf5, 0x03, 0xa4, 0x83, 0x8c, 0x0b, 0x65, 0xa5, 0x45, + 0x2e, 0xd7, 0x89, 0xe1, 0x73, 0x52, 0xd1, 0x72, 0xa4, 0x58, 0xae, 0x6c, 0x4d, 0xcb, 0xae, 0xa5, + 0xad, 0x69, 0xc5, 0x3a, 0x92, 0x7d, 0x80, 0x74, 0xc9, 0x4f, 0xf9, 0x17, 0x6a, 0x0d, 0x87, 0x65, + 0x11, 0x9f, 0x6f, 0x55, 0xd7, 0xc9, 0x63, 0x58, 0x8a, 0x0e, 0x39, 0x82, 0xdf, 0xa9, 0x4b, 0xf5, + 0xe6, 0x6c, 0x9e, 0x8c, 0x6b, 0x15, 0x65, 0x79, 0x73, 0xe5, 0x9f, 0x36, 0x77, 0xac, 0x06, 0x2f, + 0x67, 0xeb, 0x97, 0x42, 0xb7, 0x17, 0xf1, 0x42, 0xb5, 0xfa, 0x5a, 0xe8, 0xe6, 0x32, 0x91, 0x42, + 0x03, 0x25, 0x6c, 0xe7, 0x85, 0x0e, 0xa1, 0x57, 0x5a, 0x8d, 0x3b, 0xf4, 0x85, 0x85, 0x87, 0xaa, + 0xd2, 0x0b, 0x28, 0x45, 0xb2, 0x3b, 0x3e, 0xa2, 0x86, 0xfa, 0x5a, 0xcc, 0x78, 0x46, 0xd5, 0x55, + 0xcd, 0x80, 0x48, 0x9a, 0x3f, 0x45, 0x41, 0x58, 0x73, 0x5c, 0xe5, 0xb0, 0xca, 0x5c, 0x67, 0x93, + 0xa2, 0xbd, 0x21, 0x96, 0xad, 0x89, 0x35, 0x9e, 0x5b, 0x82, 0x72, 0x93, 0x4b, 0x2a, 0x80, 0xc6, + 0xaf, 0xbb, 0xfc, 0x9a, 0x41, 0xa1, 0xed, 0x02, 0x98, 0x82, 0x49, 0x93, 0xf3, 0x8f, 0x86, 0xce, + 0xd2, 0xad, 0xd5, 0x28, 0x8e, 0x5e, 0x12, 0x85, 0x7a, 0x04, 0xd9, 0x68, 0x49, 0x22, 0x3e, 0x93, + 0x2f, 0x2b, 0xba, 0xa9, 0xab, 0x12, 0x5e, 0xf5, 0xaf, 0xaf, 0x18, 0xdd, 0xc4, 0x7b, 0x9c, 0xf2, + 0x4b, 0x1d, 0x46, 0x80, 0x31, 0x91, 0x54, 0xcf, 0xa8, 0xd1, 0x9f, 0x33, 0x84, 0x84, 0x91, 0xb3, + 0x66, 0x2c, 0xa3, 0x91, 0xd3, 0x5b, 0xc5, 0x50, 0x16, 0x3a, 0x58, 0xe6, 0xcc, 0xab, 0xa1, 0x02, + 0xe6, 0x9d, 0xd2, 0x36, 0x33, 0xbd, 0xdc, 0xb4, 0xc9, 0x2c, 0xe7, 0x12, 0x4b, 0xcc, 0x65, 0x62, + 0x19, 0x12, 0xc3, 0x10, 0x9b, 0xaa, 0xae, 0x7c, 0xcb, 0x60, 0xc5, 0x9c, 0xc6, 0xd0, 0x93, 0x98, + 0xaf, 0x48, 0x9d, 0x53, 0x45, 0x45, 0x1f, 0x66, 0x9b, 0xc1, 0x98, 0xb8, 0x8a, 0x9f, 0x84, 0x4e, + 0xba, 0x41, 0x3b, 0x8e, 0x4e, 0x25, 0xe5, 0xa5, 0x59, 0x7c, 0x72, 0x1e, 0xd0, 0xab, 0xa3, 0xab, + 0xea, 0x4d, 0x85, 0x93, 0x17, 0xe0, 0x68, 0x12, 0xa9, 0xb7, 0xad, 0xac, 0x60, 0x7f, 0x00, 0x29, + 0xdd, 0x06, 0x43, 0x2a, 0xd6, 0x65, 0x90, 0x04, 0x1c, 0x56, 0x1b, 0xe9, 0xe5, 0xda, 0x92, 0xd5, + 0x98, 0x82, 0xe5, 0xcb, 0x11, 0xec, 0x3f, 0xb7, 0xca, 0x86, 0x95, 0x4a, 0xb3, 0xd8, 0x3a, 0xd3, + 0xca, 0xbf, 0xb3, 0x55, 0xa5, 0x60, 0x26, 0xf9, 0x1d, 0x34, 0xb5, 0xff, 0x30, 0xfa, 0xd5, 0x7f, + 0x6d, 0x4d, 0xff, 0xb5, 0x35, 0xfd, 0xd7, 0xd6, 0xf4, 0x1f, 0x6b, 0x6b, 0x2a, 0x6e, 0x26, 0x77, + 0x95, 0xb6, 0x6a, 0x93, 0x9b, 0x3b, 0xb7, 0x8f, 0xff, 0x94, 0x71, 0xcc, 0x25, 0xac, 0x0e, 0xa6, + 0x48, 0xcb, 0xaf, 0xa3, 0x6a, 0xb7, 0x2a, 0xba, 0xd0, 0x97, 0x9f, 0x29, 0x16, 0x77, 0xbb, 0xb7, + 0x4a, 0x6f, 0x4e, 0xdd, 0x6c, 0x9b, 0x52, 0x77, 0x77, 0x42, 0x9a, 0x44, 0x94, 0x3f, 0x31, 0xeb, + 0x5b, 0xd8, 0xd9, 0xc4, 0x0e, 0xe7, 0x0f, 0x69, 0x81, 0xd8, 0xfe, 0xc8, 0x05, 0x83, 0xba, 0x8b, + 0xf8, 0xd8, 0xba, 0xb8, 0x0b, 0x78, 0xd6, 0x04, 0x10, 0x81, 0xcd, 0x44, 0xef, 0x9f, 0xaa, 0xe4, + 0x6e, 0x89, 0x90, 0x17, 0xe9, 0xdb, 0xc9, 0xb7, 0xcd, 0x25, 0x68, 0x41, 0x32, 0xf1, 0xfb, 0x63, + 0x05, 0x26, 0xd6, 0xdf, 0x0b, 0x29, 0x7c, 0xa0, 0xff, 0xf7, 0x43, 0x4a, 0x34, 0xbb, 0x27, 0x4e, + 0xb4, 0x02, 0xc6, 0xea, 0x97, 0x76, 0x21, 0x7d, 0xc5, 0x82, 0x43, 0x3c, 0xad, 0x39, 0xfa, 0x86, + 0xb0, 0x6c, 0x21, 0x12, 0xe5, 0x3e, 0x73, 0xea, 0xc6, 0xa1, 0xd4, 0xbb, 0x1f, 0x22, 0x17, 0x2e, + 0x27, 0x5b, 0xa2, 0x55, 0x72, 0x17, 0xbe, 0x28, 0xbe, 0xa5, 0xd1, 0x61, 0xd6, 0x7f, 0xa4, 0xe7, + 0xac, 0xf0, 0x05, 0x3e, 0x18, 0xbd, 0x02, 0xb7, 0x12, 0xc1, 0xb9, 0x03, 0xef, 0x9b, 0x89, 0xc7, + 0x56, 0xe9, 0x90, 0x24, 0x2a, 0x4e, 0xdc, 0xcb, 0xc2, 0x58, 0x10, 0xc2, 0x4a, 0x1d, 0xb1, 0xb9, + 0x5e, 0xe2, 0x94, 0xab, 0x3c, 0x7b, 0x23, 0xa9, 0x2b, 0x99, 0xc9, 0x6b, 0x51, 0xff, 0x27, 0x57, + 0xfc, 0xb6, 0xd7, 0x07, 0x8e, 0x63, 0x07, 0x25, 0x40, 0x66, 0xd3, 0x79, 0xcb, 0x6d, 0x1b, 0xd4, + 0xc7, 0x0b, 0xf7, 0xf2, 0x13, 0xec, 0x50, 0xef, 0xf9, 0xbc, 0x5e, 0x13, 0x4e, 0x63, 0x78, 0x6e, + 0x09, 0x50, 0xbd, 0x5e, 0xf0, 0xc1, 0x5f, 0xf8, 0x7c, 0xfc, 0x83, 0x61, 0xc3, 0x29, 0xc6, 0x3f, + 0xb6, 0x9c, 0xa6, 0xb3, 0x75, 0x41, 0x0c, 0xea, 0x42, 0x3b, 0xde, 0x09, 0xb1, 0x97, 0x40, 0x86, + 0xde, 0x77, 0x2e, 0x65, 0x93, 0x91, 0xc3, 0x80, 0xcc, 0xf7, 0xbe, 0x7a, 0x8e, 0xeb, 0x69, 0x9a, + 0x41, 0xc2, 0x7f, 0x6b, 0x97, 0x59, 0x2b, 0xca, 0x74, 0x81, 0x18, 0x5b, 0x70, 0x1e, 0xe2, 0x26, + 0x58, 0xb7, 0x34, 0xba, 0x4b, 0x17, 0xbd, 0xd0, 0x8e, 0x61, 0x8b, 0x67, 0xeb, 0xfa, 0x54, 0xe3, + 0x23, 0x7d, 0x87, 0xc8, 0x77, 0x69, 0x8a, 0x6c, 0x6c, 0xe8, 0x7f, 0xb4, 0x53, 0x8f, 0xca, 0x94, + 0xe3, 0x18, 0x10, 0xed, 0x13, 0x4f, 0x71, 0x32, 0x4d, 0xae, 0x99, 0xe1, 0xbc, 0x4d, 0x95, 0xa8, + 0xc6, 0x67, 0xc4, 0xab, 0xd5, 0xa8, 0x15, 0x17, 0xd7, 0x3a, 0x4b, 0xdf, 0x69, 0xcc, 0x8c, 0x1c, + 0x8c, 0xd4, 0x8e, 0x59, 0xcc, 0xbd, 0xa9, 0xfc, 0x68, 0xdc, 0xd9, 0x1c, 0x21, 0xce, 0x1d, 0xcd, + 0x0b, 0xf8, 0xb4, 0x0d, 0x67, 0x05, 0x0a, 0xa1, 0xb5, 0xcd, 0xb1, 0x97, 0xd4, 0x78, 0xd4, 0x59, + 0xe1, 0x61, 0x34, 0x27, 0xe1, 0x39, 0x2b, 0x6e, 0x50, 0x8d, 0xd4, 0xcf, 0xe8, 0x42, 0x3f, 0x8a, + 0x26, 0xbe, 0x17, 0x5a, 0xcd, 0xe3, 0xcd, 0xd2, 0xe2, 0x46, 0xc2, 0xb8, 0xcd, 0x26, 0x50, 0x8e, + 0xcb, 0xd3, 0x14, 0xc1, 0x2f, 0x7d, 0xee, 0xc7, 0x35, 0x8c, 0x34, 0x87, 0x86, 0xb8, 0x73, 0x8d, + 0xde, 0xaa, 0x1e, 0xd9, 0xd8, 0x26, 0xee, 0x02, 0x1b, 0x95, 0x53, 0x0a, 0x9f, 0xe1, 0x93, 0x50, + 0xcf, 0xd3, 0x34, 0x96, 0x91, 0x59, 0x54, 0xea, 0xe1, 0x25, 0xcd, 0x9f, 0x1d, 0x3f, 0x2d, 0x73, + 0xaa, 0x7d, 0x81, 0x39, 0xec, 0x12, 0xc1, 0x72, 0x4d, 0x91, 0xb7, 0x9b, 0x53, 0x6f, 0x56, 0xab, + 0x7d, 0xc4, 0x32, 0x76, 0xe5, 0xf2, 0xed, 0x4f, 0x2c, 0x91, 0xff, 0xa8, 0xfe, 0x70, 0x8b, 0x97, + 0x77, 0x07, 0x9b, 0x7f, 0xb8, 0xe5, 0xf7, 0x77, 0x9b, 0x3f, 0xea, 0x2a, 0x22, 0x84, 0x38, 0x0b, + 0x41, 0x2e, 0xc7, 0x1c, 0xd4, 0xa0, 0x4c, 0xe0, 0x09, 0x1f, 0x84, 0x59, 0xe2, 0x61, 0x47, 0x41, + 0x9d, 0x54, 0x9c, 0x15, 0x93, 0x6c, 0x50, 0x5c, 0x67, 0x85, 0x44, 0x6c, 0x80, 0xf3, 0x25, 0x53, + 0x3a, 0xe2, 0x03, 0x3f, 0x17, 0x2c, 0x4f, 0x85, 0x95, 0x9b, 0xf8, 0x03, 0xac, 0x5b, 0x13, 0x0d, + 0x5d, 0x5c, 0xac, 0xb8, 0x63, 0xe1, 0x3e, 0x31, 0x48, 0x0a, 0x25, 0x8b, 0xc2, 0x44, 0xa2, 0x4f, + 0x4b, 0x0d, 0x48, 0xdd, 0xf2, 0x66, 0x09, 0x71, 0x2d, 0xab, 0xa4, 0xdd, 0xa3, 0x1f, 0xed, 0x9b, + 0x1c, 0x74, 0x2d, 0x73, 0xfd, 0x4a, 0x7e, 0xa1, 0x06, 0x72, 0xb7, 0x91, 0xb8, 0x8d, 0xbb, 0x64, + 0x75, 0xfb, 0x15, 0xa1, 0x39, 0x79, 0x5b, 0x75, 0x73, 0xa9, 0x0c, 0xdf, 0x27, 0x74, 0xf8, 0x87, + 0x5b, 0xe4, 0x92, 0xe0, 0x30, 0xb5, 0x3b, 0xbe, 0xf8, 0xe7, 0x69, 0x82, 0xa4, 0x9c, 0xa5, 0x46, + 0x07, 0x63, 0xff, 0x32, 0x8e, 0xc2, 0xcd, 0x43, 0x92, 0x06, 0xf7, 0x5e, 0xbc, 0x7c, 0xda, 0x42, + 0x21, 0x7d, 0x53, 0x46, 0x55, 0x27, 0x71, 0x2d, 0x85, 0xb9, 0xb9, 0xe8, 0xc7, 0x9e, 0x8d, 0x37, + 0xbe, 0xc7, 0xe2, 0x80, 0x87, 0x5a, 0x36, 0x4b, 0xda, 0x95, 0x33, 0xec, 0x41, 0x19, 0xa1, 0x0e, + 0x9a, 0x80, 0x92, 0x2c, 0x34, 0xb2, 0xa4, 0xd8, 0x4d, 0x24, 0x23, 0xd7, 0x9a, 0xf9, 0x90, 0x1a, + 0xac, 0xfe, 0x16, 0x66, 0x84, 0xf9, 0x8e, 0x53, 0xf8, 0xbe, 0x74, 0x1e, 0xb8, 0x6c, 0x83, 0x0f, + 0x8b, 0x6e, 0x1e, 0x72, 0xb3, 0xa6, 0x4f, 0xaa, 0x80, 0xba, 0xbe, 0x37, 0xc4, 0x79, 0x59, 0xfc, + 0xdb, 0x40, 0xb1, 0xcd, 0xc3, 0x37, 0x47, 0x3f, 0xbc, 0x2e, 0x60, 0x2e, 0x13, 0x37, 0x19, 0x7e, + 0xe9, 0x6e, 0xa1, 0xd1, 0xc4, 0xbf, 0xee, 0x9d, 0x7b, 0x33, 0xb9, 0xd3, 0xab, 0xe7, 0x4d, 0x88, + 0x65, 0x37, 0x82, 0xd4, 0x9f, 0x26, 0x5d, 0x49, 0x44, 0xb4, 0x79, 0x68, 0x19, 0x68, 0xa5, 0x69, + 0x5c, 0xd9, 0x41, 0xbd, 0x91, 0xf6, 0x0a, 0x57, 0x45, 0x8d, 0xbc, 0x69, 0x30, 0xb9, 0xe9, 0x22, + 0xab, 0x0d, 0x67, 0xc0, 0xb2, 0xee, 0xf2, 0xe0, 0x0e, 0xd9, 0xa0, 0x56, 0x5e, 0x44, 0xa3, 0x81, + 0xea, 0x6b, 0xb6, 0x90, 0xbf, 0xb8, 0x8b, 0x83, 0x24, 0x16, 0x3d, 0x9a, 0xa3, 0xf9, 0x12, 0x65, + 0x7b, 0x1a, 0x07, 0x53, 0x5c, 0xf1, 0xa2, 0x98, 0xc4, 0x0e, 0x36, 0xbf, 0xad, 0xca, 0x1b, 0xc1, + 0x69, 0x53, 0xd1, 0x22, 0x01, 0xe8, 0x2a, 0x24, 0xea, 0x53, 0xde, 0x25, 0x7d, 0xc5, 0x55, 0x78, + 0xff, 0xad, 0xd3, 0xdc, 0x49, 0xb0, 0x0e, 0xe1, 0x6a, 0x98, 0x20, 0x06, 0x6b, 0xc2, 0x59, 0xae, + 0xf2, 0xf0, 0xd5, 0x96, 0x1d, 0xb3, 0x6a, 0xb2, 0x27, 0xb9, 0x4a, 0xa7, 0x8d, 0xe6, 0x23, 0xe0, + 0x53, 0x1d, 0x86, 0x25, 0xc7, 0xcf, 0x9b, 0x9b, 0x87, 0x2f, 0x75, 0xfa, 0x1c, 0xc9, 0x7e, 0x00, + 0x00, 0x49, 0xf9, 0x46, 0x1b, 0x73, 0xef, 0xcc, 0x8f, 0x99, 0x17, 0x99, 0xe8, 0xb2, 0x60, 0x06, + 0x07, 0x9a, 0x33, 0xed, 0x7c, 0xa3, 0xe8, 0x7a, 0xc2, 0x7e, 0x05, 0xb5, 0x90, 0x68, 0x17, 0x11, + 0x9f, 0xf9, 0x1e, 0x0c, 0x99, 0x8e, 0x77, 0x33, 0xdc, 0xda, 0x90, 0x5f, 0x79, 0x42, 0xec, 0x1f, + 0xb1, 0x6f, 0x41, 0x08, 0xdf, 0x57, 0x81, 0xb4, 0x79, 0x1f, 0xb1, 0x8b, 0x32, 0xbb, 0x2e, 0x15, + 0x9a, 0xb2, 0xf0, 0x61, 0xdf, 0x95, 0xc2, 0xa5, 0x9e, 0x21, 0xaa, 0xda, 0xd3, 0xc9, 0x3c, 0x21, + 0x2d, 0x69, 0x14, 0x9c, 0x99, 0x84, 0xe1, 0x4e, 0x09, 0xce, 0x88, 0x5d, 0x24, 0x8b, 0xdb, 0x70, + 0xa9, 0x58, 0x1c, 0x5d, 0xdd, 0x93, 0xfb, 0x29, 0x94, 0xad, 0x5e, 0x6d, 0xd6, 0x77, 0x2c, 0x6f, + 0xfd, 0xa1, 0x41, 0xe2, 0x8e, 0x7f, 0x53, 0x6a, 0x4f, 0xce, 0x66, 0x1f, 0xa8, 0x4c, 0x0a, 0x58, + 0x13, 0x71, 0x9f, 0x4d, 0x21, 0x29, 0x7c, 0xcf, 0x51, 0x42, 0x7d, 0xff, 0xee, 0xe8, 0x9f, 0xb3, + 0x0c, 0x97, 0x49, 0xb1, 0x50, 0x17, 0x70, 0x9b, 0xb4, 0xec, 0x02, 0xea, 0x7c, 0x93, 0xd4, 0x8c, + 0x19, 0x54, 0x93, 0x66, 0xec, 0xf3, 0x4d, 0x80, 0xb5, 0xd6, 0x59, 0xeb, 0xdc, 0x75, 0x94, 0x53, + 0x46, 0x02, 0xaf, 0x6d, 0x3e, 0xc3, 0x8e, 0xc8, 0x15, 0x4c, 0x00, 0x7a, 0xc6, 0xb9, 0xf1, 0xd0, + 0x6e, 0xbe, 0xf4, 0x59, 0xbf, 0x94, 0x47, 0x73, 0x60, 0xb2, 0x0a, 0xd4, 0x29, 0x6e, 0x78, 0xac, + 0x82, 0x04, 0xc6, 0xc1, 0x30, 0x8e, 0x5f, 0x9f, 0x9c, 0x3e, 0x3f, 0x3e, 0xcd, 0x6b, 0x73, 0x48, + 0x18, 0x9f, 0x7a, 0xce, 0xf6, 0x2f, 0x4d, 0x63, 0xa3, 0x34, 0x97, 0x55, 0x9c, 0x9c, 0xfa, 0x54, + 0x56, 0xfc, 0xc7, 0xe2, 0xcd, 0x69, 0xb2, 0x51, 0x10, 0xcf, 0xb6, 0xef, 0x40, 0x23, 0xb6, 0x3f, + 0xb8, 0xe8, 0x47, 0xd7, 0x9b, 0x0a, 0x6a, 0x79, 0x83, 0xb0, 0x84, 0x8d, 0x9d, 0xfe, 0xdc, 0x6d, + 0x2a, 0xde, 0xe0, 0x9f, 0x39, 0x5c, 0x84, 0x8f, 0xd8, 0x3a, 0x77, 0xd6, 0x4d, 0x68, 0x3c, 0x95, + 0x72, 0xa3, 0x0d, 0xed, 0xbf, 0x52, 0xc7, 0x71, 0x79, 0xab, 0xd2, 0x35, 0x70, 0x3d, 0x9a, 0xcd, + 0x2f, 0xa5, 0x03, 0x0d, 0x4e, 0x94, 0x8c, 0xad, 0x43, 0xf3, 0x49, 0xb9, 0x40, 0xed, 0xc7, 0x6c, + 0x68, 0x5a, 0x24, 0xb5, 0x46, 0xc8, 0x92, 0x9d, 0x3d, 0x42, 0x8b, 0x64, 0x30, 0x33, 0x20, 0x62, + 0x2a, 0x58, 0x38, 0x35, 0x04, 0x39, 0xd9, 0x04, 0x0a, 0xe2, 0xc5, 0x1b, 0x2e, 0x5c, 0x27, 0x64, + 0x2f, 0xbe, 0x45, 0x44, 0x1c, 0x62, 0x1b, 0x4b, 0xf0, 0xa3, 0x19, 0x9b, 0xb2, 0x72, 0x59, 0x93, + 0x85, 0xa2, 0xa8, 0xec, 0xf0, 0xd3, 0x9d, 0xe9, 0xf3, 0x1a, 0x66, 0x78, 0xcf, 0xe4, 0xcf, 0xc7, + 0xe8, 0xd3, 0xaf, 0xbf, 0x46, 0xdd, 0xc8, 0x76, 0xb3, 0x69, 0xc1, 0xeb, 0xc7, 0xa7, 0xfa, 0x3a, + 0x22, 0x16, 0xa1, 0x80, 0xf2, 0x88, 0x11, 0x1e, 0xd1, 0x30, 0xb4, 0x4f, 0x12, 0x6b, 0xf2, 0x99, + 0x23, 0x49, 0x13, 0x34, 0xf6, 0x69, 0x2b, 0xa7, 0x66, 0x68, 0x13, 0x97, 0xca, 0x39, 0xdf, 0x42, + 0xf0, 0xad, 0x25, 0x7e, 0x15, 0x7b, 0x36, 0x88, 0x7c, 0x24, 0x51, 0x3f, 0x50, 0x4b, 0xa4, 0x56, + 0xd0, 0x1f, 0x09, 0x17, 0x89, 0x4f, 0xa2, 0x2a, 0x5f, 0x6b, 0xd7, 0xe4, 0x4e, 0x89, 0xcd, 0x24, + 0x7f, 0xce, 0x69, 0xcf, 0xa6, 0x30, 0x7d, 0xc5, 0xe2, 0x22, 0xf1, 0xac, 0x23, 0x94, 0x3f, 0xdc, + 0x4a, 0xbf, 0xee, 0x88, 0x4a, 0x68, 0xdc, 0x84, 0x6a, 0x1a, 0x97, 0x40, 0x5b, 0x49, 0x0b, 0x5a, + 0x4c, 0x5e, 0xa4, 0x06, 0x23, 0xf6, 0x96, 0x04, 0x63, 0xe6, 0x89, 0x9c, 0x54, 0x93, 0x36, 0xce, + 0xf0, 0x66, 0xd3, 0x32, 0x01, 0xe5, 0xa3, 0xb0, 0x57, 0x84, 0x60, 0x85, 0xc6, 0xc1, 0x00, 0xef, + 0x2a, 0x86, 0x96, 0xcd, 0x19, 0xfd, 0xb8, 0xc7, 0x48, 0x19, 0xb7, 0xdf, 0x20, 0x49, 0xbc, 0x8d, + 0x5d, 0x1a, 0xf6, 0xaa, 0x61, 0x42, 0x41, 0xa8, 0x5e, 0xd3, 0x95, 0x7d, 0x2d, 0x0d, 0xfa, 0x4b, + 0xf5, 0xba, 0x44, 0x11, 0x55, 0x7d, 0x5e, 0xdb, 0x47, 0xb9, 0x85, 0xf5, 0x37, 0xf7, 0xc7, 0xea, + 0x46, 0xa1, 0x17, 0xe6, 0x47, 0xab, 0xa5, 0xfe, 0x12, 0xfb, 0x9c, 0x9d, 0x48, 0xd5, 0x86, 0x92, + 0x6f, 0x76, 0x4c, 0x8a, 0x24, 0x72, 0x96, 0xdc, 0x18, 0xad, 0x94, 0x73, 0xe6, 0x72, 0x96, 0x7a, + 0x5a, 0x88, 0xc8, 0xee, 0x80, 0x44, 0x29, 0xc9, 0x7c, 0x86, 0x9f, 0xfe, 0x10, 0xb9, 0x6c, 0x72, + 0x68, 0x7c, 0x96, 0x59, 0x1f, 0x0d, 0xfc, 0x66, 0x96, 0xe4, 0x99, 0x43, 0x5d, 0xed, 0xe2, 0x21, + 0xa5, 0x92, 0x53, 0xd9, 0x67, 0x29, 0x47, 0x9f, 0xff, 0xf5, 0x05, 0x6d, 0xe2, 0xd1, 0xac, 0xa9, + 0xfe, 0xc9, 0xf7, 0x25, 0x1f, 0x63, 0x0e, 0x4e, 0x5f, 0x82, 0x93, 0xb9, 0x6d, 0xe4, 0xea, 0x55, + 0x4e, 0x0b, 0x39, 0xf1, 0x42, 0xe4, 0x78, 0xba, 0x51, 0x29, 0x71, 0xf2, 0x14, 0x37, 0xf6, 0xe0, + 0xca, 0xe0, 0x04, 0x29, 0x2b, 0xbe, 0xfd, 0xab, 0xe4, 0xc5, 0xc3, 0x0d, 0x55, 0x71, 0x0e, 0x0c, + 0x7b, 0x0c, 0x12, 0x47, 0xe9, 0x2c, 0x9a, 0xa2, 0x3e, 0xf1, 0xb1, 0xe6, 0x66, 0x61, 0xd3, 0xb1, + 0x07, 0x57, 0x21, 0x3b, 0x70, 0xdc, 0x68, 0xf9, 0x65, 0xd3, 0xaa, 0x72, 0x90, 0xc5, 0xf5, 0xe4, + 0xdb, 0x8e, 0x05, 0xb3, 0x7e, 0x9b, 0xcd, 0x39, 0xff, 0xcd, 0xf7, 0xd3, 0xa7, 0x35, 0x7e, 0xf1, + 0xab, 0x2c, 0xe8, 0xfa, 0xdf, 0xfb, 0x2d, 0x57, 0x39, 0x4f, 0xff, 0xd0, 0xc9, 0x52, 0xe6, 0x3a, + 0x6c, 0x07, 0xb2, 0xf6, 0x38, 0x8c, 0x9b, 0x38, 0xb9, 0xb9, 0x54, 0x8d, 0xbb, 0xf2, 0xeb, 0xaf, + 0x8e, 0xb5, 0x25, 0x97, 0xda, 0xd6, 0x35, 0x1c, 0x5c, 0xf7, 0x22, 0xc9, 0x30, 0x39, 0xff, 0x03, + 0x67, 0x96, 0x08, 0x12, 0x33, 0xcf, 0x4d, 0xb6, 0x46, 0x51, 0xd1, 0xa5, 0x60, 0x8a, 0xc2, 0xcb, + 0xd6, 0x01, 0xc7, 0x96, 0x41, 0x4a, 0x09, 0xbd, 0x92, 0x04, 0x73, 0x1f, 0x7d, 0xc1, 0x08, 0xc1, + 0x7f, 0xb8, 0xa5, 0x36, 0x73, 0x7c, 0x6c, 0x42, 0xbe, 0xf8, 0xd3, 0xcf, 0xf3, 0x28, 0xed, 0x39, + 0xf5, 0x3b, 0x70, 0x3c, 0x2e, 0x7e, 0x57, 0xa5, 0x50, 0xfc, 0xe1, 0x36, 0x17, 0x3b, 0xb8, 0x68, + 0x26, 0x3a, 0xdc, 0xe9, 0x3d, 0xf3, 0x0f, 0xb7, 0xd6, 0x08, 0x9e, 0x39, 0xcb, 0xb5, 0x92, 0xd0, + 0xdb, 0x3c, 0x7c, 0xd7, 0x7a, 0xae, 0xab, 0xf1, 0x1e, 0x92, 0x6b, 0x74, 0x87, 0x9a, 0x6d, 0xdc, + 0x15, 0x95, 0xb8, 0x0a, 0x29, 0x98, 0x46, 0x5f, 0xb7, 0x8d, 0x41, 0x5a, 0xb5, 0xb6, 0x8b, 0x10, + 0x84, 0x7a, 0x6e, 0xba, 0x20, 0x12, 0x7d, 0x85, 0x05, 0xcf, 0xf9, 0x6a, 0x43, 0x22, 0xe1, 0x24, + 0xe9, 0x6a, 0xed, 0x9e, 0x97, 0x63, 0x46, 0x74, 0xf9, 0xca, 0xf4, 0x70, 0x0f, 0x60, 0x0c, 0x33, + 0x84, 0xfa, 0x71, 0x1e, 0xfc, 0x98, 0xa5, 0x3e, 0x17, 0x68, 0xb8, 0xc3, 0x4e, 0xaf, 0x37, 0x78, + 0x11, 0x82, 0x41, 0x7e, 0x82, 0x19, 0x82, 0xaa, 0x24, 0x1e, 0xd0, 0x76, 0xa3, 0xec, 0x62, 0x0c, + 0x78, 0x55, 0xff, 0x12, 0x47, 0xf3, 0x19, 0x67, 0xb3, 0x14, 0x40, 0xf3, 0xa0, 0x89, 0x8c, 0xe6, + 0x33, 0xb1, 0x0c, 0x6a, 0x9d, 0x59, 0xfc, 0xa8, 0x3a, 0x53, 0x09, 0x55, 0x3a, 0x1d, 0xfb, 0x89, + 0xb6, 0x64, 0x25, 0x6a, 0xea, 0xdd, 0x20, 0x7d, 0x8c, 0xf6, 0xdd, 0x4a, 0x26, 0x78, 0x52, 0x35, + 0x04, 0x9c, 0xd7, 0xe7, 0x88, 0xd9, 0xc2, 0x75, 0x71, 0x62, 0x7a, 0xcc, 0x53, 0x33, 0xf1, 0xf5, + 0xd2, 0x1c, 0x5b, 0x3b, 0x19, 0x35, 0x74, 0xbe, 0x17, 0x24, 0x97, 0xcd, 0x0f, 0x95, 0x6c, 0xe8, + 0x45, 0x8d, 0xd3, 0x1c, 0x80, 0x64, 0x69, 0x02, 0xd4, 0x9b, 0xe7, 0x43, 0x49, 0x7e, 0x61, 0x92, + 0x16, 0xcd, 0x27, 0xc6, 0xca, 0x26, 0x49, 0x57, 0x08, 0x27, 0xd0, 0xf3, 0x24, 0x45, 0x1d, 0x2e, + 0x39, 0x06, 0x0f, 0xb8, 0x2d, 0x04, 0x95, 0x03, 0xf1, 0xcc, 0x02, 0xac, 0x5b, 0x0c, 0x8b, 0xca, + 0x4c, 0x52, 0xb0, 0x83, 0xd8, 0x5a, 0x0e, 0xeb, 0x38, 0xa2, 0xe1, 0x64, 0x90, 0xf8, 0x78, 0xcd, + 0x45, 0x21, 0x1e, 0x9a, 0xb1, 0x6a, 0xae, 0x6f, 0x2c, 0xc2, 0xfe, 0xc8, 0x3a, 0x06, 0xcd, 0x79, + 0x95, 0x91, 0xd4, 0xe6, 0x3f, 0x75, 0xdb, 0x41, 0xf9, 0x15, 0x62, 0x37, 0x69, 0xf3, 0xc6, 0xdf, + 0xe6, 0x3c, 0xb0, 0x95, 0xa7, 0xac, 0x0c, 0x84, 0xfa, 0x80, 0xb4, 0x52, 0x52, 0xcd, 0x93, 0x9a, + 0x73, 0xe6, 0xd8, 0x2a, 0x96, 0x1d, 0x91, 0x45, 0xd8, 0x4d, 0x2e, 0x88, 0x5d, 0x24, 0xa1, 0x77, + 0xe1, 0x9f, 0x31, 0x6f, 0x1d, 0x12, 0x0d, 0x50, 0xf5, 0x1c, 0x56, 0x36, 0xb6, 0xdc, 0x58, 0xb8, + 0x0c, 0x96, 0xc9, 0x37, 0x1c, 0xe0, 0xaa, 0x17, 0x4d, 0x8f, 0x9a, 0x7c, 0x72, 0x1e, 0xfd, 0xee, + 0xfd, 0xe9, 0xeb, 0x6e, 0x81, 0x03, 0x6b, 0x82, 0x42, 0x7e, 0x20, 0xfa, 0xc8, 0x3d, 0x02, 0x69, + 0x22, 0x22, 0x5a, 0x12, 0xd6, 0xe3, 0xba, 0x27, 0x73, 0xbb, 0x08, 0x81, 0xc4, 0xb2, 0xc9, 0xe1, + 0x65, 0xd7, 0xeb, 0xdd, 0x98, 0x95, 0x74, 0x4e, 0xfb, 0x9d, 0x3f, 0x6c, 0xc8, 0x8e, 0xa7, 0xf9, + 0x6a, 0x7d, 0xd5, 0xc6, 0xe2, 0x96, 0x76, 0x37, 0xb4, 0x75, 0x52, 0xb8, 0xdf, 0x44, 0xd6, 0x46, + 0x9e, 0x24, 0x1b, 0xf1, 0x0d, 0xa4, 0x9a, 0xc8, 0x45, 0x0f, 0xb4, 0x9e, 0xb0, 0xc5, 0xba, 0xd9, + 0xde, 0x5a, 0xdc, 0x6c, 0xce, 0x65, 0x8b, 0x69, 0x66, 0x4b, 0x0c, 0x92, 0xd7, 0x5b, 0xa6, 0xd7, + 0x4c, 0xe8, 0xaa, 0x09, 0x99, 0x7c, 0xe4, 0x93, 0x1a, 0xf9, 0x6f, 0x2a, 0xf9, 0xf1, 0x53, 0x5d, + 0x9c, 0xa3, 0x39, 0xb5, 0x14, 0xdc, 0xe2, 0x16, 0x39, 0x71, 0x3d, 0x57, 0x69, 0x0a, 0xaa, 0x22, + 0x2a, 0x81, 0x9c, 0x93, 0x13, 0x0d, 0xf8, 0x68, 0x94, 0xaf, 0xfd, 0x90, 0xbd, 0xc9, 0x8c, 0xa3, + 0x40, 0xae, 0xd0, 0x32, 0x06, 0x3b, 0x61, 0x24, 0x9b, 0x47, 0x27, 0x1f, 0x36, 0x5d, 0xb5, 0xc9, + 0xe7, 0xec, 0x37, 0xeb, 0xae, 0x12, 0x4e, 0x97, 0x03, 0x63, 0xe6, 0xc1, 0x3c, 0x0b, 0x17, 0x59, + 0x70, 0x4a, 0x4d, 0xeb, 0x72, 0x0b, 0x4e, 0xcd, 0x66, 0x96, 0xac, 0x17, 0x37, 0x88, 0xd4, 0x26, + 0x7c, 0xf7, 0x04, 0xe7, 0x9b, 0xee, 0xfb, 0x9c, 0x39, 0x51, 0x96, 0xa9, 0x86, 0xf7, 0xc6, 0xe7, + 0x2c, 0x93, 0x85, 0xc5, 0xcd, 0xd1, 0xf2, 0x81, 0xdc, 0xe4, 0x6e, 0x52, 0x35, 0x8f, 0x23, 0x44, + 0x8f, 0x70, 0x5c, 0x88, 0x64, 0x81, 0x46, 0x3e, 0x02, 0xbe, 0x7a, 0x28, 0xb5, 0x28, 0x45, 0x2e, + 0xc8, 0x2a, 0x08, 0x13, 0xd6, 0x05, 0xab, 0xf6, 0x61, 0x36, 0x4e, 0x61, 0x49, 0x6c, 0x43, 0x2e, + 0xa1, 0xe1, 0x0d, 0x54, 0xdf, 0xe3, 0xd8, 0xb4, 0xb6, 0x66, 0x31, 0x84, 0x42, 0x43, 0x72, 0x8d, + 0x71, 0xcf, 0x56, 0x97, 0xf2, 0x99, 0x19, 0x73, 0x06, 0x7e, 0x6c, 0x0d, 0x15, 0x67, 0xff, 0x0c, + 0x8a, 0x0f, 0x55, 0xb3, 0x68, 0xe8, 0xa4, 0x37, 0xe3, 0x1d, 0xa7, 0x6e, 0x85, 0x1f, 0xd0, 0x6a, + 0x1c, 0x17, 0x3d, 0xc1, 0x07, 0x9a, 0x5a, 0x0a, 0x21, 0xbe, 0xd2, 0xaf, 0x31, 0xed, 0xde, 0xb8, + 0xee, 0x28, 0xcd, 0xdb, 0x28, 0x86, 0xf5, 0x3e, 0xc0, 0x1e, 0x69, 0x55, 0xa2, 0x15, 0x7e, 0xb1, + 0x2c, 0x02, 0x52, 0xf8, 0x13, 0x2a, 0xd9, 0x11, 0xd6, 0xf7, 0x31, 0x17, 0x5b, 0x85, 0xd7, 0x5b, + 0x8c, 0xed, 0xc2, 0xff, 0x16, 0x46, 0x63, 0x31, 0x16, 0x33, 0x9e, 0xef, 0x63, 0x28, 0xfe, 0xd7, + 0xff, 0xf3, 0xff, 0x7d, 0xa8, 0x95, 0xf8, 0xb3, 0xa7, 0xe4, 0x6e, 0x81, 0xd6, 0x8a, 0x9b, 0x8a, + 0x5e, 0xf8, 0x0b, 0x21, 0x2c, 0xf3, 0x20, 0x63, 0x4a, 0x0b, 0x6a, 0x71, 0x1a, 0x43, 0x63, 0x27, + 0xa6, 0x60, 0x44, 0x73, 0xf0, 0x2b, 0x50, 0x9d, 0x85, 0x7a, 0x90, 0xbf, 0x58, 0xe7, 0xaa, 0x0c, + 0x7a, 0xa4, 0x39, 0x97, 0x8d, 0x76, 0x16, 0x09, 0x75, 0x55, 0x4d, 0xda, 0x38, 0xe0, 0x83, 0xc9, + 0x40, 0x38, 0x74, 0x6d, 0xc9, 0x86, 0x5f, 0xf8, 0x98, 0x2b, 0xe2, 0x35, 0xea, 0xce, 0x34, 0x08, + 0x7f, 0xfd, 0x95, 0x8f, 0xe9, 0x39, 0x4e, 0x29, 0x12, 0x65, 0x89, 0x59, 0xb1, 0xdc, 0x09, 0x38, + 0xef, 0xbc, 0x49, 0x4f, 0xf6, 0x3d, 0x1f, 0x3b, 0x4f, 0xc4, 0xee, 0x17, 0x5c, 0x55, 0x76, 0x55, + 0x42, 0x43, 0x66, 0x56, 0x2c, 0xdb, 0x11, 0xd9, 0x36, 0xd5, 0xab, 0x32, 0xb9, 0x08, 0xd6, 0xe4, + 0x27, 0x95, 0xbc, 0xaf, 0x65, 0xad, 0x08, 0xe9, 0xb7, 0x99, 0xd6, 0x2a, 0x60, 0xb1, 0x6d, 0xed, + 0xbe, 0xc6, 0x35, 0x7b, 0x7e, 0x6d, 0xeb, 0x9a, 0x85, 0xeb, 0x85, 0xb9, 0x2b, 0xf0, 0x9e, 0xff, + 0x55, 0x6d, 0x6c, 0x19, 0x43, 0xcb, 0x2c, 0x0e, 0xf9, 0x38, 0x45, 0x59, 0x73, 0x2a, 0x8e, 0x51, + 0x68, 0x4b, 0x18, 0xa8, 0x53, 0x4c, 0x4f, 0xc9, 0xaf, 0xbf, 0x62, 0xc3, 0x66, 0x7b, 0xd8, 0xc1, + 0xe1, 0x67, 0x5b, 0xb3, 0x22, 0xcb, 0x96, 0x55, 0x65, 0xc0, 0xfa, 0x22, 0x96, 0xa6, 0x82, 0xe5, + 0xa0, 0xc2, 0xd4, 0xb4, 0x0a, 0x25, 0xb9, 0x63, 0xb7, 0x8c, 0x12, 0x0f, 0x9d, 0x52, 0xb4, 0x56, + 0xd1, 0x11, 0x59, 0xb5, 0xd4, 0x97, 0xa9, 0x77, 0x6d, 0x9e, 0xbd, 0xeb, 0xbb, 0x4d, 0x6d, 0x77, + 0xe2, 0x17, 0xf8, 0x49, 0x0a, 0x2d, 0xa9, 0x3f, 0xce, 0xdd, 0xe6, 0x8f, 0xd5, 0x63, 0xac, 0xb6, + 0x43, 0xfd, 0xce, 0x36, 0xa8, 0xd2, 0xf8, 0x6f, 0xd7, 0xf6, 0xec, 0x77, 0xb2, 0xe8, 0x94, 0xf7, + 0xda, 0x55, 0x36, 0x1d, 0x2d, 0x4a, 0xdf, 0xdf, 0xa0, 0xc3, 0xc0, 0x24, 0xe5, 0x52, 0x52, 0x96, + 0xb1, 0xb5, 0x68, 0x5d, 0x5b, 0x23, 0x13, 0xdb, 0x90, 0x2a, 0x2d, 0x41, 0xb6, 0xa0, 0x8c, 0x54, + 0x03, 0xe2, 0x05, 0x49, 0x94, 0xdc, 0x0c, 0x25, 0xd2, 0x98, 0xd1, 0x71, 0x73, 0xdb, 0x90, 0xe8, + 0xb7, 0x32, 0x88, 0x06, 0x52, 0x4b, 0x05, 0x23, 0xea, 0x97, 0x0e, 0x8d, 0x53, 0x57, 0x7c, 0x27, + 0x2b, 0xa4, 0x4f, 0xa2, 0xb8, 0x73, 0x9f, 0x84, 0x00, 0x74, 0x5a, 0x02, 0x48, 0xb6, 0x20, 0xc2, + 0x92, 0x7a, 0x2f, 0xfc, 0xaf, 0x59, 0xde, 0xfa, 0xca, 0xb6, 0x9f, 0x6a, 0xc3, 0x8e, 0xc5, 0xf1, + 0xbe, 0xa4, 0x65, 0xc7, 0x66, 0xb0, 0xda, 0xb4, 0x43, 0x6b, 0x40, 0x63, 0x41, 0xdb, 0x75, 0x96, + 0x34, 0xfd, 0x60, 0xc3, 0x4e, 0x76, 0x84, 0x85, 0xeb, 0x2d, 0xb7, 0xbb, 0x94, 0xb7, 0x8d, 0x7b, + 0xb9, 0xb8, 0x32, 0xc3, 0x7d, 0xc9, 0xc7, 0x65, 0xa3, 0xf7, 0x99, 0x76, 0x6c, 0xe5, 0x86, 0x23, + 0xec, 0x36, 0x45, 0x97, 0xf3, 0x52, 0x2f, 0x58, 0xe1, 0xf3, 0x83, 0x4d, 0x4c, 0xff, 0x61, 0x6d, + 0x49, 0xb6, 0xa8, 0x57, 0x61, 0x4c, 0x2a, 0x2e, 0xf5, 0xd6, 0x9f, 0x25, 0x39, 0xa4, 0x94, 0x33, + 0xd7, 0x13, 0xe0, 0xda, 0x02, 0x2c, 0x4f, 0x9d, 0x7c, 0x57, 0xdf, 0x41, 0xc4, 0xe2, 0x21, 0x22, + 0xcb, 0x1a, 0x52, 0x9a, 0x15, 0xad, 0x6c, 0x71, 0xfe, 0x39, 0xd7, 0xe9, 0xa0, 0x6c, 0x5d, 0x45, + 0x73, 0x9a, 0x96, 0x1b, 0x2f, 0xbc, 0x90, 0x24, 0xd1, 0xc2, 0x31, 0xf8, 0xca, 0xdc, 0xec, 0xb2, + 0x41, 0xe8, 0x2b, 0x26, 0xb5, 0x84, 0x1c, 0x55, 0x25, 0xb1, 0xb4, 0x20, 0x38, 0x73, 0x84, 0x29, + 0xca, 0xd5, 0x97, 0x19, 0xbe, 0xb2, 0x58, 0xd1, 0x95, 0x89, 0x4a, 0xb2, 0x20, 0x15, 0x1c, 0xf9, + 0x42, 0x4c, 0x4f, 0xbd, 0xc9, 0xce, 0xf6, 0xa6, 0x8e, 0x08, 0x50, 0x26, 0xb8, 0x35, 0x0f, 0x5f, + 0x59, 0xf8, 0xce, 0x0c, 0xc6, 0xe9, 0xdd, 0xaf, 0x1d, 0xb9, 0xff, 0x2b, 0xa9, 0x6a, 0x07, 0xc1, + 0x07, 0xe5, 0x98, 0xa2, 0x02, 0x9f, 0x2e, 0xc6, 0x67, 0x2d, 0x11, 0x31, 0xad, 0x34, 0x40, 0xc5, + 0xc5, 0x54, 0xee, 0x92, 0x45, 0xf2, 0x75, 0xab, 0x56, 0x72, 0xc9, 0xd9, 0x3b, 0x70, 0xca, 0xbc, + 0xec, 0xf9, 0xa6, 0x89, 0xb0, 0x64, 0x07, 0x9e, 0x02, 0xfd, 0x9c, 0xe4, 0x01, 0x6f, 0x3a, 0x81, + 0xf9, 0x37, 0xbc, 0x1d, 0x88, 0x55, 0xca, 0x34, 0xc0, 0x2b, 0xea, 0x59, 0x39, 0x25, 0x8c, 0xae, + 0xa0, 0xcd, 0xca, 0x45, 0x1f, 0x46, 0x11, 0x98, 0x44, 0x1d, 0xae, 0x80, 0x67, 0xb2, 0xd4, 0x94, + 0x40, 0xe2, 0x9f, 0xf9, 0x8c, 0x76, 0x47, 0xff, 0x05, 0x07, 0x1b, 0x24, 0x0b, 0x99, 0x8f, 0x4a, + 0x5f, 0xad, 0x28, 0x27, 0x44, 0x49, 0x17, 0x7b, 0x81, 0xa8, 0xb7, 0xd5, 0x93, 0x9d, 0x45, 0x6e, + 0xd0, 0x2c, 0x5b, 0xa7, 0xdf, 0x43, 0xc9, 0xfd, 0xb1, 0xba, 0xae, 0xb4, 0xd5, 0x18, 0x20, 0xf3, + 0xd7, 0xc2, 0x71, 0x85, 0x10, 0x07, 0x28, 0x39, 0xe6, 0x5e, 0x8a, 0x71, 0x56, 0xa5, 0xf0, 0xb0, + 0x43, 0x62, 0x1c, 0x56, 0x7f, 0x5d, 0xc7, 0x98, 0x17, 0x63, 0xbd, 0x90, 0x86, 0xfc, 0x46, 0xb5, + 0xd4, 0xb1, 0xce, 0xa5, 0xdd, 0xc2, 0x85, 0x42, 0x7c, 0xbc, 0x74, 0x55, 0x56, 0x29, 0xaa, 0x23, + 0x64, 0x57, 0x44, 0x07, 0x02, 0x53, 0x0e, 0xee, 0x35, 0x72, 0x1e, 0x26, 0x3d, 0x2f, 0x26, 0x49, + 0xd0, 0xef, 0x4b, 0x27, 0x8a, 0xb8, 0x9b, 0x08, 0x2e, 0x68, 0x36, 0x65, 0x2d, 0x61, 0x9f, 0x8a, + 0x70, 0x54, 0xb2, 0xed, 0x72, 0xa0, 0xa9, 0x32, 0xb8, 0x5b, 0x88, 0xf7, 0xf8, 0x48, 0x75, 0x0a, + 0x73, 0xf4, 0xc9, 0x10, 0x23, 0x9f, 0xa1, 0x79, 0x78, 0x60, 0x47, 0x5c, 0x1d, 0xcd, 0x4b, 0x8b, + 0xf8, 0x99, 0xb3, 0x55, 0x11, 0xb8, 0x0b, 0x8a, 0xdc, 0x72, 0x0e, 0x2a, 0xbf, 0x71, 0x94, 0xa1, + 0xed, 0xea, 0x88, 0xe5, 0x84, 0x4c, 0xc6, 0x8e, 0x17, 0xd6, 0x9a, 0xb5, 0x90, 0x75, 0xa7, 0xd6, + 0xac, 0x82, 0x95, 0x87, 0x5f, 0xec, 0x65, 0xbe, 0x7e, 0xad, 0xe8, 0x90, 0xd3, 0x8b, 0xad, 0xad, + 0x15, 0x5e, 0x45, 0x09, 0x12, 0x26, 0x80, 0x5b, 0x0e, 0x11, 0xdc, 0x16, 0x8d, 0x88, 0x43, 0x84, + 0x9f, 0x99, 0x18, 0x61, 0x12, 0x26, 0x74, 0x64, 0x70, 0x3d, 0x0f, 0x0d, 0xce, 0x4f, 0x8a, 0xd3, + 0x27, 0x1b, 0xbc, 0x89, 0x7a, 0xcd, 0xcf, 0x87, 0x6d, 0x54, 0x36, 0x53, 0x71, 0x34, 0x6c, 0xa3, + 0x02, 0x62, 0x1e, 0x1b, 0x4b, 0xb8, 0x26, 0x4c, 0x6b, 0x30, 0x34, 0x24, 0xed, 0x45, 0xa2, 0x0e, + 0x47, 0x17, 0xf9, 0x9a, 0xa1, 0xd7, 0x72, 0xbf, 0xfa, 0xd0, 0xa2, 0xd9, 0x2a, 0xda, 0x54, 0x7a, + 0x3d, 0x08, 0x75, 0x56, 0xf2, 0x93, 0x8a, 0xa3, 0x5d, 0x26, 0x8b, 0xa0, 0x1d, 0x75, 0xbf, 0xfa, + 0x24, 0x91, 0x89, 0x25, 0x73, 0x4c, 0x48, 0xf7, 0x57, 0xfe, 0xc4, 0x0e, 0x38, 0x2f, 0x9d, 0x0b, + 0x5b, 0x42, 0xab, 0x79, 0xcc, 0x9e, 0xed, 0x12, 0xc0, 0x22, 0x8c, 0x25, 0x67, 0x8d, 0x95, 0x85, + 0x66, 0xe1, 0x90, 0xc7, 0x10, 0x4a, 0x40, 0x60, 0xac, 0xab, 0xcf, 0xd4, 0x8f, 0x7c, 0x7b, 0xcb, + 0x1f, 0x6e, 0x87, 0xcd, 0x58, 0xa2, 0xbf, 0x0e, 0x0f, 0xda, 0xb4, 0x12, 0x58, 0xe2, 0xb0, 0xde, + 0x5a, 0x29, 0x8c, 0xee, 0xfe, 0xe7, 0xff, 0x50, 0xfa, 0xfa, 0x15, 0x14, 0x98, 0xe9, 0x40, 0xb1, + 0x52, 0x3d, 0xf3, 0xba, 0x5c, 0x11, 0x97, 0x4b, 0xe1, 0x3b, 0xfd, 0x5d, 0xac, 0x24, 0x2f, 0x8b, + 0x55, 0xf0, 0x1e, 0x5b, 0xec, 0x04, 0x02, 0x13, 0x95, 0x44, 0x66, 0x75, 0x7a, 0x22, 0x76, 0xf2, + 0xaf, 0xff, 0xf2, 0x7f, 0xd7, 0x9d, 0xbb, 0x1f, 0x37, 0x8c, 0x01, 0xc8, 0x61, 0xdf, 0x4c, 0x2a, + 0xf7, 0x50, 0x8a, 0xb7, 0xa6, 0x9c, 0xd7, 0x91, 0x98, 0xaa, 0x9d, 0x84, 0x92, 0x4f, 0x20, 0x66, + 0xc4, 0x59, 0x71, 0x16, 0x72, 0x1e, 0x7a, 0x97, 0x44, 0x81, 0x1e, 0xc7, 0x0a, 0xab, 0xaa, 0x03, + 0x29, 0x95, 0xd1, 0x79, 0x0b, 0x67, 0x0d, 0xca, 0x51, 0x7a, 0x6f, 0x5e, 0xff, 0xf0, 0xfa, 0x8d, + 0xaa, 0xf1, 0x2d, 0x55, 0xfa, 0x26, 0x74, 0x7d, 0x55, 0xa9, 0xab, 0x2f, 0xb6, 0x9f, 0xcf, 0x62, + 0x1c, 0x86, 0x94, 0x4b, 0x40, 0xf8, 0xd2, 0x0b, 0xbe, 0xd1, 0x3c, 0x98, 0x4c, 0x9a, 0x7f, 0x0f, + 0xff, 0x1e, 0x72, 0x4c, 0xdf, 0x15, 0x5f, 0x4d, 0x28, 0x81, 0x7d, 0xd5, 0x71, 0x7d, 0x5a, 0x02, + 0xb3, 0x6f, 0x3d, 0x4a, 0xb2, 0x48, 0xbe, 0x85, 0x40, 0x3e, 0xb9, 0x3e, 0x41, 0xdf, 0x7a, 0x82, + 0x1b, 0x99, 0xc4, 0x21, 0x53, 0x3a, 0x15, 0xf1, 0x30, 0x22, 0x6d, 0x65, 0x08, 0x3a, 0xe3, 0xd8, + 0xc0, 0xfb, 0x10, 0xad, 0x2c, 0xeb, 0x1f, 0x19, 0x99, 0xd9, 0x0d, 0x0b, 0x5d, 0x95, 0x51, 0xaa, + 0x15, 0xab, 0x48, 0x04, 0xe2, 0x5a, 0xc4, 0x68, 0x47, 0x2e, 0x82, 0xdc, 0x40, 0x09, 0x7a, 0x70, + 0x42, 0x30, 0x3f, 0xea, 0xe6, 0xed, 0x5d, 0xa2, 0x3a, 0x87, 0xe7, 0x27, 0x5e, 0x2c, 0xd6, 0x9b, + 0x75, 0x15, 0xb3, 0x2c, 0x9f, 0x79, 0x4d, 0xf3, 0x4a, 0xaa, 0x16, 0x76, 0x83, 0x07, 0x35, 0xba, + 0xa2, 0xe6, 0xda, 0x56, 0xcb, 0x61, 0xde, 0xf2, 0xb6, 0xf2, 0x40, 0x8b, 0x95, 0xb5, 0xe9, 0xae, + 0xf2, 0x48, 0xef, 0x4b, 0xfb, 0x92, 0x3b, 0x93, 0x09, 0x6f, 0x6b, 0xf9, 0xc1, 0xde, 0xd2, 0x5a, + 0x49, 0x88, 0x56, 0x9f, 0x87, 0x43, 0x2d, 0xad, 0x68, 0xe1, 0xc3, 0xf4, 0xc4, 0x96, 0x4a, 0x98, + 0x0d, 0xeb, 0x36, 0x8f, 0xb3, 0xe9, 0xcb, 0x49, 0x93, 0xe4, 0x08, 0x29, 0xb3, 0x7a, 0x18, 0x05, + 0x39, 0x50, 0x27, 0xde, 0x28, 0x4a, 0x3e, 0xd6, 0x6c, 0xc2, 0x99, 0x4a, 0x80, 0x6d, 0x54, 0x4b, + 0xf4, 0x7e, 0x71, 0x8b, 0xe6, 0x44, 0x7e, 0x35, 0x93, 0x72, 0xb3, 0x8c, 0xda, 0xca, 0xdd, 0x23, + 0x47, 0x9f, 0xb4, 0x9d, 0x5f, 0xec, 0xe8, 0x54, 0x6f, 0x2e, 0x3a, 0xe0, 0x44, 0x5f, 0xae, 0x60, + 0xfa, 0x5a, 0x60, 0x28, 0xc7, 0x52, 0x04, 0x37, 0x34, 0xe7, 0xa1, 0xfe, 0x38, 0x7d, 0xa3, 0xeb, + 0x2c, 0x5d, 0xd6, 0xcf, 0xd4, 0x29, 0x54, 0x3d, 0xdd, 0x85, 0x84, 0x03, 0x04, 0x82, 0xb0, 0x31, + 0x25, 0x91, 0x21, 0xbe, 0xd1, 0x63, 0x35, 0xb5, 0xa1, 0x38, 0x89, 0xfd, 0x26, 0xe2, 0xc4, 0x25, + 0x17, 0xfa, 0xa0, 0xcf, 0x5c, 0x5f, 0x14, 0x66, 0xf3, 0x85, 0xe2, 0x84, 0xc9, 0x35, 0xbc, 0x55, + 0x9d, 0xd1, 0x62, 0xa0, 0xc6, 0x4b, 0x26, 0xc3, 0x55, 0x4c, 0xa4, 0xa9, 0x9d, 0x89, 0x2f, 0xd6, + 0x61, 0x32, 0x41, 0x58, 0xad, 0x7e, 0x70, 0x98, 0x8b, 0x14, 0x96, 0x3c, 0x68, 0xe5, 0x54, 0x3b, + 0xae, 0x66, 0x4f, 0x26, 0x4f, 0x9c, 0x1d, 0x66, 0x37, 0x42, 0x1a, 0xb8, 0xe3, 0x92, 0x08, 0x57, + 0x5c, 0x7c, 0x08, 0xe6, 0x2d, 0x1c, 0xf0, 0xe1, 0x1a, 0x56, 0x26, 0x38, 0x1b, 0xe0, 0xfd, 0xc8, + 0xab, 0x14, 0x59, 0xb5, 0x8a, 0xde, 0x4c, 0x50, 0x63, 0x05, 0xd5, 0xc9, 0x7f, 0x55, 0xb4, 0x67, + 0x0b, 0x5c, 0x8e, 0x21, 0x29, 0x43, 0x62, 0xb6, 0x6c, 0x68, 0x6d, 0x84, 0xd9, 0x4c, 0x16, 0x73, + 0x5e, 0x56, 0xac, 0xf4, 0x4c, 0xc6, 0xcb, 0xb2, 0x3d, 0x6e, 0x54, 0x43, 0xb2, 0x8f, 0x32, 0x2e, + 0x07, 0x55, 0x4c, 0xd7, 0xea, 0x43, 0x76, 0x42, 0x4a, 0x50, 0x48, 0x5b, 0x20, 0xa8, 0xe5, 0x5a, + 0x0d, 0x4a, 0x64, 0xe5, 0xf5, 0x82, 0xc9, 0x29, 0x42, 0x3b, 0xb1, 0x46, 0x33, 0xda, 0xfc, 0x62, + 0x7f, 0xb0, 0xec, 0x88, 0x7d, 0xd5, 0x81, 0x79, 0xaa, 0xd3, 0x12, 0x91, 0x2d, 0x3b, 0x2b, 0x7f, + 0x70, 0xa8, 0xcf, 0xd7, 0x3f, 0xe4, 0x80, 0xbd, 0xae, 0xb4, 0x91, 0x9d, 0xaf, 0x37, 0xa7, 0x31, + 0xa8, 0x81, 0x67, 0xa0, 0xb9, 0x15, 0x19, 0x57, 0xfb, 0x5e, 0xdc, 0x40, 0xa2, 0xe1, 0xb2, 0xce, + 0x48, 0xef, 0xf4, 0x89, 0xed, 0x59, 0x92, 0x03, 0xa4, 0x1e, 0x3c, 0x2b, 0x10, 0xb1, 0xde, 0x6a, + 0xa3, 0x95, 0x99, 0xfb, 0xb8, 0x11, 0xaa, 0x6a, 0x11, 0x04, 0xd5, 0x28, 0xe5, 0xfb, 0x45, 0x19, + 0xc0, 0x61, 0xe5, 0x94, 0x0a, 0xdb, 0x07, 0xda, 0x61, 0x97, 0x8b, 0x42, 0xb6, 0xc5, 0xe1, 0x64, + 0x6f, 0x21, 0x84, 0xe9, 0xce, 0x3a, 0xd3, 0x5b, 0x9c, 0xe3, 0xa3, 0xef, 0xca, 0x19, 0x40, 0x4b, + 0x13, 0xcb, 0x1e, 0xcb, 0xa3, 0xef, 0x6a, 0xcb, 0xd3, 0x15, 0x97, 0x47, 0x12, 0xfc, 0xdc, 0xc0, + 0xcd, 0x3b, 0xd3, 0x04, 0x1e, 0x2c, 0x22, 0x76, 0xc7, 0x36, 0x81, 0xcc, 0x62, 0xff, 0x7e, 0x75, + 0xa9, 0x60, 0x29, 0xeb, 0x71, 0x6e, 0xd6, 0xd0, 0x51, 0x85, 0xfa, 0x3b, 0x95, 0x2c, 0x8b, 0x8d, + 0x6f, 0xc4, 0xe2, 0x94, 0xe9, 0xbb, 0x65, 0x4a, 0x5c, 0x22, 0x33, 0x21, 0x29, 0xad, 0x35, 0x8f, + 0x85, 0x49, 0xa4, 0x17, 0xc5, 0x73, 0x88, 0x22, 0x36, 0xd5, 0x6d, 0x5e, 0xc5, 0xe6, 0x5f, 0x8e, + 0x79, 0x77, 0x3e, 0x60, 0x14, 0x38, 0x26, 0xa8, 0x16, 0xfe, 0xfb, 0x81, 0x43, 0xa4, 0xf0, 0x1f, + 0x8e, 0x24, 0xfc, 0x7d, 0x03, 0x93, 0x89, 0xa4, 0x1f, 0xb8, 0xc2, 0x07, 0xb6, 0x5c, 0xdf, 0x4b, + 0x6b, 0x7b, 0x6d, 0x3e, 0xda, 0x4e, 0x1f, 0x6d, 0xed, 0x2e, 0x53, 0xce, 0x67, 0x90, 0x33, 0x63, + 0x93, 0xe5, 0xc0, 0xce, 0x6b, 0x44, 0xad, 0x6f, 0x21, 0x5b, 0x69, 0x93, 0xd1, 0xc8, 0xa6, 0x67, + 0xfa, 0x39, 0x7c, 0x1d, 0x0e, 0x6b, 0xdb, 0xfb, 0x80, 0xa9, 0xad, 0x4a, 0x33, 0xf1, 0x45, 0xa8, + 0x67, 0x44, 0x35, 0x8d, 0xbc, 0x4c, 0x87, 0xdb, 0xa5, 0xaf, 0xf0, 0x7d, 0x70, 0xed, 0xc5, 0x6e, + 0x58, 0xac, 0x72, 0x11, 0xf5, 0xd4, 0x81, 0x15, 0xda, 0xed, 0x62, 0xf9, 0x7f, 0x3c, 0x79, 0xff, + 0xae, 0x29, 0x67, 0xfe, 0x82, 0x91, 0x41, 0xaa, 0xab, 0xc3, 0x2f, 0xb6, 0xeb, 0x8b, 0xaa, 0x2c, + 0x83, 0x5c, 0x0f, 0xa7, 0x04, 0xc2, 0xe2, 0x88, 0x15, 0xe4, 0xf2, 0x9a, 0x4f, 0xff, 0xda, 0x4c, + 0xb1, 0x5a, 0xd7, 0xc0, 0x65, 0xe5, 0x71, 0x2a, 0x8b, 0xe1, 0xbe, 0x72, 0xb8, 0xd0, 0x94, 0xf1, + 0x68, 0x0b, 0x4d, 0x69, 0xa6, 0xfc, 0x9a, 0xc1, 0x65, 0x27, 0x7d, 0x35, 0x1b, 0xd6, 0x1b, 0xba, + 0x9d, 0x1e, 0xa3, 0x3f, 0x89, 0xfa, 0x3a, 0x9c, 0xed, 0x05, 0xfd, 0xac, 0x7d, 0x5c, 0x83, 0xb5, + 0x4f, 0xee, 0x2d, 0xe6, 0xaf, 0xeb, 0xb0, 0xf6, 0x2d, 0x79, 0xb9, 0x5a, 0x48, 0x4b, 0xee, 0xdc, + 0x15, 0xa4, 0x7f, 0x6f, 0x85, 0x43, 0xc0, 0x33, 0xdd, 0xf6, 0x4c, 0x46, 0xaf, 0xef, 0x8f, 0xdf, + 0xe8, 0x42, 0x12, 0x7f, 0x44, 0xcf, 0x35, 0xf4, 0x2c, 0x2b, 0x67, 0xd2, 0x7b, 0x29, 0xce, 0xef, + 0x7c, 0x26, 0x0b, 0xf9, 0xcc, 0xd9, 0xca, 0xf2, 0x92, 0x21, 0x13, 0xd9, 0xd1, 0xc9, 0x7b, 0x93, + 0x86, 0x4c, 0x27, 0xc9, 0x6d, 0xbb, 0x9d, 0x27, 0x96, 0x0b, 0xbd, 0x0b, 0x27, 0x46, 0x03, 0xc6, + 0x03, 0xce, 0xa4, 0xee, 0x18, 0xe8, 0x1c, 0xe8, 0x61, 0xc4, 0x67, 0xf4, 0x25, 0xf6, 0x2f, 0xa3, + 0x0b, 0xab, 0x2f, 0xd2, 0xd1, 0x7a, 0xaf, 0x94, 0x36, 0x7a, 0x66, 0x56, 0x62, 0xa2, 0xe7, 0x4f, + 0x36, 0x5d, 0x9b, 0x26, 0xaa, 0xe6, 0xa3, 0xb8, 0x47, 0xea, 0xb9, 0xa9, 0x22, 0x8a, 0x60, 0xaa, + 0x89, 0x82, 0x5d, 0x02, 0x96, 0x29, 0x02, 0xc7, 0xd1, 0x33, 0x8f, 0x12, 0xa7, 0x06, 0xfb, 0xd8, + 0xfe, 0x64, 0xec, 0x0e, 0x78, 0x5e, 0xa1, 0xd4, 0xa5, 0x72, 0x74, 0x46, 0x67, 0x9a, 0xc7, 0x75, + 0xd6, 0x78, 0x53, 0x2b, 0x66, 0xcf, 0x2d, 0xa5, 0xa2, 0xb7, 0x48, 0xae, 0x25, 0x9d, 0x72, 0xdc, + 0x5b, 0x1a, 0xf9, 0x38, 0x1a, 0x76, 0x9d, 0x0f, 0xef, 0x4f, 0x4e, 0x1d, 0x57, 0xc2, 0x66, 0x92, + 0xee, 0xad, 0xa3, 0xa9, 0xbf, 0xc1, 0x97, 0x69, 0x54, 0x11, 0x8a, 0x0b, 0x57, 0x46, 0x17, 0xad, + 0x16, 0x69, 0x26, 0x3f, 0x8d, 0x9f, 0x67, 0xba, 0xd7, 0xd4, 0xcd, 0xe7, 0xe3, 0xab, 0x31, 0x2f, + 0xfd, 0xc1, 0x8d, 0xa4, 0x73, 0xd2, 0x8e, 0x93, 0x04, 0x77, 0x81, 0x67, 0x01, 0x2f, 0xd6, 0xe9, + 0x78, 0xe7, 0x88, 0x0b, 0xb2, 0xe9, 0xeb, 0xa7, 0x45, 0xd3, 0xd7, 0xcc, 0x93, 0x9b, 0xdc, 0x31, + 0x45, 0x73, 0x6c, 0x10, 0xae, 0xa5, 0xf0, 0x94, 0xa7, 0x53, 0x40, 0xad, 0x9e, 0x4e, 0xed, 0xf4, + 0xd5, 0xcc, 0x50, 0xa2, 0x22, 0x64, 0x7f, 0x7c, 0x8b, 0xeb, 0x13, 0x1b, 0xe2, 0xe8, 0x1a, 0xfa, + 0xc9, 0x20, 0x0e, 0x66, 0x29, 0xbc, 0xa9, 0x12, 0x70, 0x88, 0x1d, 0x40, 0xb1, 0x21, 0x59, 0xdf, + 0x0c, 0x1e, 0x07, 0x43, 0x2d, 0x18, 0x42, 0x4e, 0xa2, 0x7d, 0x54, 0xb0, 0x75, 0xf4, 0x5d, 0x7e, + 0xdf, 0x91, 0x50, 0xc6, 0x84, 0xfa, 0x14, 0x7b, 0xb8, 0x4f, 0xfb, 0xe3, 0x6d, 0xd8, 0x75, 0x6e, + 0xce, 0xa2, 0x51, 0x42, 0x13, 0x35, 0xe8, 0x76, 0xee, 0x5c, 0xbc, 0x98, 0x97, 0x5f, 0x5c, 0x96, + 0x5f, 0x4c, 0x3d, 0x5a, 0x3f, 0xd7, 0x78, 0xf1, 0xc4, 0x25, 0x78, 0x49, 0x77, 0xe7, 0xee, 0x13, + 0x62, 0x1d, 0xe3, 0xed, 0x1b, 0x0d, 0xb4, 0xa2, 0x04, 0xd7, 0xa4, 0xcd, 0xf3, 0xec, 0xa6, 0xb3, + 0x2f, 0xb0, 0xb8, 0x4e, 0xd4, 0x1f, 0xe8, 0x3a, 0x84, 0x81, 0xb3, 0xd8, 0x6e, 0x96, 0x9e, 0xcf, + 0x17, 0x5e, 0xf4, 0x4b, 0x2f, 0xfa, 0x45, 0x58, 0x67, 0xb3, 0xce, 0x17, 0x03, 0x37, 0x24, 0x8d, + 0x28, 0xf1, 0x02, 0xd3, 0xbf, 0x61, 0x10, 0x9f, 0xa5, 0x63, 0x5c, 0x41, 0x91, 0xd5, 0xf0, 0x87, + 0xe7, 0xfe, 0x59, 0x32, 0x8d, 0xa2, 0x74, 0x7c, 0x76, 0xb3, 0xe4, 0xfd, 0xc0, 0x82, 0xc8, 0xb3, + 0x7e, 0x26, 0xd9, 0x1e, 0x05, 0xe8, 0x28, 0xf6, 0x7f, 0xae, 0x86, 0x4a, 0x42, 0xa4, 0x5f, 0xfe, + 0x32, 0x18, 0x93, 0xb4, 0xea, 0xf1, 0xdb, 0xb3, 0xa9, 0x77, 0xbd, 0xec, 0x4b, 0xb0, 0xb4, 0x0e, + 0xee, 0xfd, 0xc8, 0xbe, 0x20, 0x49, 0x31, 0xb2, 0xdb, 0x94, 0x2a, 0x58, 0xaf, 0x43, 0xab, 0xef, + 0x83, 0x38, 0x4a, 0x70, 0xca, 0xef, 0x42, 0xf7, 0xdc, 0x14, 0xab, 0xaa, 0xd9, 0xbf, 0xd1, 0xe8, + 0xd8, 0x93, 0xd9, 0xdf, 0x93, 0xef, 0x69, 0x7e, 0x9f, 0x51, 0x56, 0x87, 0x24, 0x45, 0xd2, 0xea, + 0xac, 0x76, 0xae, 0x86, 0xf1, 0xd9, 0x60, 0x4e, 0x3a, 0xd2, 0x99, 0x37, 0xbc, 0x34, 0x6d, 0x4d, + 0x22, 0xdc, 0xb8, 0x93, 0x55, 0x62, 0xfa, 0x3d, 0xe3, 0x3b, 0xd6, 0xcf, 0xda, 0x4b, 0xde, 0x77, + 0xec, 0x8e, 0x71, 0x3c, 0x27, 0xad, 0x7e, 0xf9, 0x66, 0x63, 0x87, 0x5b, 0xc2, 0xd1, 0xb4, 0xb3, + 0x04, 0xf7, 0x69, 0x71, 0x37, 0xf8, 0xca, 0xb0, 0xdc, 0x66, 0xc1, 0x9e, 0xf7, 0xa3, 0xef, 0x58, + 0xa0, 0xca, 0x33, 0x89, 0xd8, 0x32, 0x35, 0x5e, 0xca, 0x5d, 0x5a, 0x48, 0xc9, 0xde, 0x14, 0xb6, + 0x62, 0x62, 0xa5, 0x12, 0x91, 0x37, 0x53, 0x93, 0x9a, 0x9d, 0x0b, 0x27, 0xf3, 0xbe, 0xec, 0x9e, + 0xb4, 0xf9, 0xe0, 0x23, 0x67, 0x89, 0xd7, 0x09, 0x3b, 0x0d, 0xf3, 0xe6, 0x90, 0x8b, 0x83, 0x7c, + 0x05, 0x7f, 0x04, 0x2c, 0xc3, 0xbf, 0xf5, 0xe7, 0x3f, 0xfd, 0x89, 0x41, 0x23, 0x0f, 0xbe, 0x70, + 0x6f, 0x42, 0x54, 0x48, 0xdb, 0x08, 0xdf, 0x87, 0xfa, 0x4d, 0x14, 0x4f, 0x6b, 0xa8, 0x24, 0xec, + 0xc9, 0x8e, 0x37, 0x59, 0x25, 0xff, 0xfa, 0xba, 0xba, 0x3e, 0xdb, 0x5f, 0x99, 0x4c, 0x72, 0x55, + 0xfd, 0x24, 0xc0, 0xed, 0x3b, 0xa6, 0xf6, 0x32, 0x4f, 0xe8, 0x3a, 0x28, 0xcc, 0xbb, 0x1b, 0x7c, + 0xb3, 0x52, 0x3d, 0xe3, 0x8e, 0x79, 0x4e, 0x53, 0x62, 0x90, 0xaf, 0xfc, 0x49, 0xd0, 0xf7, 0xf5, + 0xed, 0xd2, 0x38, 0x37, 0xad, 0xd3, 0xde, 0xf2, 0xf5, 0x04, 0x7a, 0xba, 0xb0, 0xc3, 0x8d, 0xe6, + 0x89, 0x0e, 0x3f, 0xe6, 0xf4, 0xbf, 0x0c, 0x0b, 0xd6, 0x51, 0x23, 0x14, 0xf2, 0xbe, 0x2e, 0xf1, + 0xc3, 0x83, 0x71, 0x30, 0x83, 0x11, 0x25, 0x08, 0xf9, 0xd2, 0x31, 0x5c, 0x01, 0x9d, 0x89, 0xd1, + 0xfa, 0x46, 0x09, 0xa4, 0xe3, 0x46, 0x38, 0x31, 0x07, 0x46, 0xa8, 0x46, 0xc3, 0x8a, 0x54, 0x81, + 0x86, 0xbb, 0xef, 0x3b, 0x09, 0x75, 0x86, 0x6f, 0x6e, 0xe7, 0xa3, 0x44, 0x3e, 0x4e, 0x64, 0xf0, + 0x49, 0x72, 0x1a, 0x1d, 0xed, 0x70, 0x13, 0x7d, 0x42, 0x81, 0xd0, 0x43, 0xfb, 0x90, 0x12, 0x43, + 0xf4, 0x41, 0x47, 0x9f, 0x71, 0x10, 0x0f, 0xcd, 0xec, 0x8c, 0x23, 0x7f, 0x24, 0xc7, 0x92, 0xcb, + 0x41, 0xcf, 0x33, 0x73, 0x93, 0x37, 0x3b, 0xa4, 0x39, 0x44, 0x87, 0x24, 0x70, 0x04, 0x2b, 0xe3, + 0xb0, 0xb8, 0x62, 0x3a, 0xce, 0xdc, 0xea, 0xeb, 0xf1, 0x2a, 0x47, 0x0c, 0xeb, 0x85, 0x6d, 0xe7, + 0x61, 0x35, 0x47, 0x54, 0x52, 0x1b, 0x13, 0xab, 0x84, 0x92, 0x05, 0x3a, 0xe4, 0xda, 0xef, 0x8a, + 0xab, 0x27, 0xbf, 0xac, 0xf5, 0xe0, 0x21, 0x14, 0xb9, 0x72, 0x91, 0x64, 0xed, 0x58, 0x92, 0x0e, + 0x0a, 0xd5, 0x6f, 0x2d, 0xb9, 0xf6, 0x37, 0x90, 0xaf, 0x0e, 0x18, 0x50, 0x79, 0xe7, 0x8b, 0x0b, + 0xc4, 0x0e, 0x23, 0xb1, 0xba, 0xbe, 0x79, 0x68, 0xa7, 0x24, 0xb0, 0x13, 0xfe, 0x42, 0xc2, 0x69, + 0x0c, 0x83, 0x69, 0xbd, 0xc7, 0x79, 0x05, 0xe0, 0x81, 0x96, 0x0c, 0x05, 0x9b, 0x87, 0x5a, 0x8b, + 0x24, 0xc9, 0x21, 0x1b, 0x15, 0x09, 0xa5, 0xcd, 0xa6, 0x0e, 0x04, 0xe1, 0x7f, 0x9d, 0xde, 0x6f, + 0xd2, 0x04, 0x2a, 0x46, 0x71, 0x40, 0xc4, 0x50, 0xa1, 0x03, 0xcc, 0xd8, 0x48, 0x6f, 0xac, 0xf5, + 0x25, 0x3c, 0x0b, 0xc8, 0x99, 0xb1, 0xe3, 0xcb, 0xaf, 0xa6, 0xc1, 0x7c, 0xc1, 0xe7, 0x67, 0x0d, + 0xa5, 0x2b, 0xc9, 0xea, 0x59, 0xc2, 0x41, 0xcd, 0xdc, 0xd5, 0xe2, 0xda, 0x39, 0x64, 0x2b, 0x71, + 0x7d, 0xe0, 0xac, 0x4f, 0xe7, 0xbe, 0x7a, 0x36, 0x0f, 0x6c, 0x56, 0xa4, 0x2c, 0x51, 0xb8, 0x98, + 0x1a, 0x70, 0xec, 0x25, 0xf9, 0xb5, 0x0c, 0x8e, 0x71, 0x1c, 0x21, 0x2a, 0x78, 0x96, 0xe7, 0x3c, + 0x84, 0xe2, 0x3d, 0x4e, 0xa7, 0x93, 0xd5, 0x14, 0x30, 0xde, 0x3d, 0x2c, 0x4c, 0xe5, 0xd3, 0x16, + 0xde, 0x64, 0xf8, 0xcb, 0x5b, 0x2a, 0xe5, 0xe2, 0xd0, 0xc1, 0xa7, 0xc8, 0x65, 0xc4, 0x78, 0x35, + 0xbe, 0xac, 0x67, 0x1c, 0x2c, 0x20, 0xa1, 0xac, 0x85, 0x14, 0x74, 0xdc, 0x95, 0xad, 0xc5, 0xbe, + 0x88, 0xbf, 0x38, 0x8e, 0xae, 0x4a, 0x61, 0xac, 0xd9, 0x27, 0x9d, 0x85, 0x43, 0x37, 0x60, 0x82, + 0x8f, 0x16, 0xc1, 0x16, 0xa2, 0x70, 0xa9, 0xf6, 0x9a, 0x40, 0x5c, 0xa4, 0xd1, 0x00, 0x2a, 0x18, + 0x6c, 0xa3, 0x80, 0x83, 0x4d, 0x67, 0x4b, 0x0f, 0x61, 0xcb, 0xb1, 0x62, 0x18, 0x05, 0xe0, 0xd1, + 0x77, 0x1a, 0x21, 0xb5, 0xbf, 0x3b, 0x85, 0x5a, 0x7f, 0x5f, 0x1d, 0x96, 0x9b, 0xf5, 0xa8, 0x41, + 0x1a, 0x1e, 0xe2, 0xf4, 0xcb, 0xa1, 0xb9, 0xd6, 0xda, 0x59, 0x3c, 0xf1, 0x32, 0xe2, 0x63, 0x25, + 0x25, 0xe2, 0xb5, 0x23, 0x0c, 0x6c, 0xea, 0xfe, 0x38, 0x1a, 0x36, 0xc3, 0x4f, 0x5f, 0x0a, 0xf1, + 0xce, 0x16, 0xc0, 0x81, 0x32, 0x8a, 0x98, 0xc7, 0x8e, 0x3f, 0x6c, 0x0e, 0x38, 0xc8, 0xa4, 0x63, + 0x85, 0xc7, 0xe6, 0xed, 0x55, 0xc4, 0xb2, 0x2e, 0x34, 0xc2, 0x65, 0x74, 0x28, 0x29, 0x23, 0xf3, + 0x60, 0xb3, 0xc8, 0x5a, 0x4c, 0xf3, 0x59, 0x70, 0x29, 0x69, 0x41, 0x08, 0x98, 0x7e, 0xc6, 0xbe, + 0xf4, 0xcd, 0xc3, 0x75, 0xb9, 0x07, 0x49, 0x2d, 0x21, 0xf4, 0x94, 0xd2, 0x65, 0x21, 0x9c, 0xe8, + 0x19, 0x63, 0xae, 0x5b, 0xc8, 0x53, 0x69, 0xf6, 0x00, 0xce, 0x29, 0x80, 0xd1, 0xe1, 0x17, 0x31, + 0x0f, 0xfc, 0xec, 0x55, 0x8c, 0xb0, 0x88, 0x51, 0x51, 0x31, 0x1a, 0xd0, 0x7b, 0xb2, 0x1c, 0x2a, + 0x78, 0x20, 0x7e, 0x4a, 0x2b, 0x9e, 0x84, 0x82, 0xc6, 0x00, 0xb7, 0x21, 0x92, 0x9e, 0xa3, 0x2d, + 0x5a, 0x44, 0x67, 0xd4, 0xc0, 0x96, 0xe3, 0x76, 0x46, 0x71, 0x7d, 0xd3, 0x4e, 0xa5, 0x8e, 0x99, + 0xe7, 0xc8, 0xf4, 0x83, 0x76, 0x2f, 0x78, 0xca, 0xcd, 0x07, 0x5b, 0x5b, 0x85, 0x20, 0xe4, 0xdf, + 0x0d, 0xcf, 0x5c, 0x26, 0x18, 0x5e, 0xa3, 0x44, 0x50, 0x44, 0x3c, 0x21, 0xf3, 0x63, 0xf0, 0xe9, + 0xd9, 0xb3, 0x76, 0x11, 0xf5, 0x76, 0xc4, 0x6e, 0xde, 0x2d, 0x9b, 0x9e, 0xf3, 0x12, 0xd5, 0xdf, + 0xe5, 0xeb, 0x32, 0xc4, 0xea, 0x20, 0xb6, 0xac, 0xc5, 0xbc, 0xdc, 0xca, 0x34, 0x36, 0xd9, 0x41, + 0x18, 0x7e, 0x2e, 0x6c, 0xfd, 0x0b, 0x6b, 0x97, 0xd0, 0x2f, 0x51, 0x17, 0xcf, 0x27, 0x93, 0x3c, + 0x7f, 0xfe, 0xfd, 0x9a, 0xd3, 0x7e, 0x2b, 0xab, 0xc1, 0x05, 0x51, 0xa3, 0xaa, 0xbd, 0x63, 0xc9, + 0x8c, 0xf7, 0xdb, 0x5b, 0xe3, 0xd3, 0x4f, 0x85, 0xe6, 0x08, 0xfa, 0x4b, 0xbc, 0x5c, 0x0e, 0xbb, + 0xbc, 0x5d, 0x2f, 0x13, 0x1e, 0x50, 0xa3, 0xfc, 0xbd, 0xe2, 0x68, 0x57, 0x91, 0xce, 0xac, 0x9b, + 0xdd, 0xe8, 0x19, 0xfe, 0xb0, 0x2c, 0x98, 0x9c, 0x77, 0x6a, 0x92, 0x86, 0x9b, 0x51, 0xcc, 0xfe, + 0x27, 0xbc, 0x62, 0xfa, 0xea, 0x59, 0x65, 0x48, 0x27, 0x7f, 0x4d, 0x32, 0x6a, 0x0a, 0xeb, 0x36, + 0x02, 0x9e, 0x69, 0xdb, 0x64, 0xb0, 0xae, 0x91, 0xe5, 0x6a, 0xd6, 0x4a, 0x10, 0xa6, 0xbb, 0x78, + 0xae, 0x49, 0xc7, 0x19, 0x59, 0x41, 0xe6, 0x5f, 0x1d, 0x1c, 0xf0, 0x83, 0xdd, 0x85, 0x3c, 0x10, + 0xd5, 0xc4, 0x70, 0x56, 0x1b, 0x4e, 0xbe, 0xc9, 0xb3, 0xcd, 0x93, 0x04, 0x54, 0x69, 0x39, 0x59, + 0x22, 0x11, 0xdc, 0x15, 0x3c, 0xbe, 0x15, 0x73, 0x75, 0xbb, 0xf1, 0x5b, 0x95, 0x9f, 0xdf, 0xae, + 0xfa, 0x2c, 0x4a, 0xcb, 0xe5, 0xdd, 0x2e, 0xa3, 0x5e, 0x97, 0x08, 0xef, 0x41, 0xb6, 0xde, 0xe5, + 0x71, 0x6c, 0x36, 0xff, 0x31, 0x52, 0x8c, 0x04, 0xb6, 0xd5, 0xa2, 0xf0, 0x99, 0xd3, 0x71, 0x70, + 0x85, 0x76, 0x3d, 0x17, 0x10, 0x63, 0xcb, 0x98, 0x66, 0xd5, 0x55, 0xba, 0xbc, 0x01, 0xc1, 0xf7, + 0xea, 0x6a, 0x68, 0x8b, 0xe6, 0xb4, 0x8a, 0xe8, 0xb1, 0x6f, 0x8a, 0xd6, 0xe6, 0x8a, 0xf9, 0xbf, + 0x97, 0xd5, 0x73, 0x91, 0xcd, 0x54, 0x69, 0x18, 0x0f, 0x51, 0x10, 0x2c, 0x09, 0x50, 0xc2, 0x13, + 0x0f, 0x74, 0x70, 0xe2, 0x01, 0xdf, 0x0f, 0xb7, 0x52, 0x3e, 0xd0, 0xf7, 0xb4, 0x61, 0xe1, 0x24, + 0xb6, 0x32, 0xb3, 0xb8, 0x7a, 0x3f, 0xde, 0x63, 0x57, 0xf8, 0x64, 0xcb, 0xe9, 0x02, 0xd4, 0x5c, + 0x31, 0x53, 0x3a, 0x96, 0xad, 0xb7, 0xdd, 0x50, 0x47, 0x4e, 0x0c, 0xb3, 0xdd, 0x17, 0x07, 0xdb, + 0xc5, 0x20, 0x9c, 0x10, 0x21, 0x46, 0x53, 0x5f, 0x98, 0x43, 0xc6, 0x01, 0x68, 0x79, 0x96, 0x19, + 0x84, 0xd5, 0x66, 0x0e, 0xb0, 0xdc, 0xa0, 0x3e, 0xa1, 0x97, 0x15, 0xad, 0x90, 0x4a, 0x44, 0x46, + 0x92, 0xb6, 0x71, 0x31, 0x89, 0xc5, 0x71, 0x4a, 0x62, 0x83, 0x94, 0xac, 0xe8, 0x30, 0x0e, 0x3a, + 0x15, 0xfb, 0x6b, 0x8e, 0x2b, 0xb9, 0x4e, 0xe1, 0x98, 0x72, 0xb6, 0x2c, 0xbe, 0xd0, 0xc2, 0x90, + 0x29, 0x58, 0x17, 0xef, 0x59, 0x0e, 0xf7, 0x2c, 0x86, 0x56, 0x16, 0x4e, 0xf3, 0x24, 0x25, 0xe6, + 0x5c, 0x46, 0xfa, 0x41, 0xce, 0x93, 0xf1, 0x6b, 0x55, 0x08, 0xe7, 0x5d, 0x7d, 0xa9, 0xf4, 0x65, + 0x82, 0x24, 0x8b, 0xce, 0x7e, 0xa1, 0xa6, 0xb5, 0x51, 0x9c, 0x45, 0x55, 0x4b, 0x27, 0x62, 0xce, + 0x96, 0xa4, 0x06, 0x5d, 0x86, 0x58, 0x69, 0xca, 0xbe, 0xfb, 0x8c, 0xc0, 0x4c, 0x70, 0x79, 0x6b, + 0x19, 0x64, 0x71, 0x91, 0x92, 0x4d, 0xfd, 0x2b, 0x34, 0x9f, 0x99, 0xf4, 0xdf, 0x45, 0x59, 0x7c, + 0x0a, 0xd5, 0xca, 0x62, 0x91, 0x89, 0x39, 0x64, 0xc6, 0xee, 0x97, 0xcf, 0x4f, 0x5f, 0xff, 0xe5, + 0xfd, 0xf1, 0xd1, 0x6b, 0x18, 0xbc, 0x91, 0x33, 0x9f, 0xd3, 0x67, 0xea, 0x2b, 0xe1, 0xd5, 0x77, + 0x73, 0xce, 0xda, 0xe2, 0xb8, 0x30, 0xa8, 0x77, 0x9d, 0x97, 0x08, 0xa0, 0x91, 0x68, 0x3b, 0x9c, + 0x31, 0xa0, 0x3e, 0xe0, 0x0a, 0x4c, 0x7d, 0x3e, 0x35, 0x69, 0xaa, 0xb7, 0x11, 0xe7, 0x03, 0xbf, + 0xf0, 0x55, 0xbb, 0xb1, 0xbd, 0xb7, 0x27, 0x27, 0xbd, 0x45, 0x42, 0x4b, 0x1c, 0x3e, 0xdd, 0x2f, + 0x2e, 0xa6, 0xee, 0x47, 0x67, 0x82, 0xf0, 0xba, 0x90, 0x50, 0x42, 0x14, 0xca, 0x00, 0x3c, 0x98, + 0xcc, 0x9d, 0x7e, 0x6c, 0xbd, 0xd7, 0x66, 0x48, 0xbe, 0xa4, 0xd9, 0x49, 0xc6, 0x5e, 0x3c, 0xd3, + 0x1f, 0xc6, 0xc9, 0x25, 0x5f, 0x74, 0x9c, 0xf5, 0xf6, 0x1d, 0xee, 0xd4, 0x56, 0xc7, 0xfe, 0x70, + 0xae, 0xef, 0x74, 0x96, 0xfe, 0xee, 0xbc, 0xe2, 0x40, 0x9a, 0xed, 0x57, 0x0a, 0x42, 0x6e, 0x14, + 0x7b, 0x13, 0xa8, 0x09, 0xec, 0x90, 0xe0, 0x5b, 0xb8, 0x89, 0x83, 0xe9, 0x1a, 0x4d, 0x05, 0xf3, + 0x29, 0x75, 0x35, 0x0e, 0x3c, 0xb8, 0x08, 0xa2, 0xd1, 0xc8, 0x8f, 0x69, 0x26, 0x42, 0x9f, 0x24, + 0x66, 0xec, 0x9b, 0x43, 0x33, 0xcc, 0xd2, 0x38, 0xc2, 0x78, 0x07, 0x77, 0x27, 0xe3, 0xcf, 0x19, + 0x6d, 0x56, 0xfa, 0xd7, 0xac, 0xc3, 0xbf, 0xce, 0xa8, 0x1b, 0xb3, 0xe0, 0xc2, 0x97, 0x07, 0x92, + 0xae, 0xbd, 0xfc, 0x17, 0xda, 0x93, 0x27, 0xb1, 0x38, 0xdb, 0xbf, 0xcb, 0xdf, 0xce, 0xe0, 0x5b, + 0x2f, 0x0c, 0xf8, 0x25, 0x0c, 0x22, 0xea, 0x4f, 0x8a, 0x66, 0x24, 0xd6, 0x89, 0x41, 0xf2, 0x49, + 0xc2, 0xa7, 0x59, 0x1c, 0xc1, 0x6d, 0x63, 0x07, 0x81, 0x75, 0x33, 0x0b, 0x3d, 0xbd, 0x75, 0x95, + 0x28, 0x04, 0x8a, 0x6d, 0xc0, 0xd8, 0x80, 0x13, 0x1d, 0x57, 0x22, 0x2e, 0x0f, 0x85, 0x43, 0x37, + 0x31, 0x20, 0x00, 0x9d, 0x85, 0x21, 0x5b, 0x56, 0x79, 0x4c, 0x9e, 0xb1, 0x73, 0xf3, 0x3d, 0xd4, + 0x02, 0x1f, 0x17, 0xf6, 0x9e, 0xf7, 0xcf, 0x8c, 0x57, 0xc3, 0xc9, 0x9d, 0x28, 0x85, 0x07, 0x41, + 0x58, 0xbc, 0x7d, 0x83, 0xaa, 0x37, 0x34, 0xb0, 0x60, 0x70, 0xc6, 0xb7, 0xd9, 0x0f, 0x67, 0x67, + 0x83, 0xc9, 0x3c, 0x91, 0x3b, 0xd3, 0xa3, 0xfe, 0xa0, 0x38, 0xf6, 0x57, 0x52, 0x54, 0xf1, 0xad, + 0xe6, 0x66, 0xd4, 0x7f, 0x45, 0xd2, 0x02, 0x0d, 0x44, 0xe8, 0xce, 0x55, 0x33, 0x22, 0x47, 0x5c, + 0xf1, 0xc3, 0xd6, 0x48, 0xe2, 0x49, 0x7e, 0x98, 0x30, 0x35, 0xb9, 0xea, 0xdb, 0x57, 0xc7, 0xb4, + 0x22, 0x42, 0x9f, 0x90, 0xc0, 0x96, 0xc2, 0xd2, 0x08, 0xaf, 0xf8, 0x42, 0xf5, 0x82, 0x65, 0xbd, + 0xf0, 0x0c, 0x67, 0x98, 0x7e, 0x31, 0x49, 0xa7, 0xfa, 0x57, 0x88, 0x3a, 0xb3, 0xd1, 0x40, 0xfe, + 0x95, 0xb1, 0x8d, 0x19, 0x10, 0xfd, 0x2b, 0x8f, 0xc9, 0x78, 0x86, 0x1f, 0x85, 0xd1, 0xbc, 0x41, + 0x44, 0xab, 0x15, 0x26, 0x68, 0x06, 0xc4, 0xef, 0x89, 0xe8, 0xd9, 0xa0, 0x35, 0xc8, 0xa6, 0xd9, + 0x65, 0xfb, 0x65, 0xe3, 0xcd, 0xc9, 0x4b, 0x17, 0xc7, 0x5e, 0xd9, 0x40, 0xda, 0x9f, 0xc0, 0xb4, + 0x3a, 0xb0, 0x61, 0x14, 0xd7, 0x5a, 0x82, 0x4e, 0xd1, 0xbf, 0x67, 0x38, 0x39, 0x8a, 0x8b, 0x95, + 0xe5, 0x8d, 0x57, 0x7a, 0x45, 0xe3, 0xfc, 0x49, 0x10, 0x2e, 0x04, 0x9c, 0xa4, 0x88, 0x8b, 0x3c, + 0x9b, 0xcc, 0x46, 0x98, 0x13, 0x2f, 0xbe, 0x38, 0xd3, 0xfd, 0x91, 0xf9, 0x0d, 0xe2, 0xe2, 0x48, + 0xfe, 0xe2, 0x4d, 0xa7, 0x1e, 0xd1, 0xe4, 0x9b, 0xef, 0x4f, 0xcd, 0x20, 0x4e, 0x81, 0x63, 0xc6, + 0x19, 0x2f, 0xc4, 0x49, 0x14, 0x5d, 0xcc, 0x67, 0x92, 0xc8, 0x41, 0x9f, 0x9d, 0xe3, 0x3b, 0x05, + 0x4a, 0xfd, 0x05, 0xed, 0x9c, 0x03, 0x18, 0xb5, 0x73, 0x33, 0xbf, 0xcc, 0x7e, 0x7b, 0x43, 0x6f, + 0x86, 0xc0, 0x19, 0xfd, 0xa2, 0xd0, 0xf8, 0x29, 0x4b, 0x84, 0xd9, 0x22, 0x78, 0x11, 0x84, 0x5e, + 0x7c, 0xa3, 0x46, 0xbe, 0xc7, 0x49, 0x36, 0xe5, 0x86, 0x5e, 0x3f, 0xe9, 0x2a, 0x5a, 0xcd, 0x37, + 0x09, 0xae, 0xd6, 0xe2, 0xfb, 0x3b, 0x5d, 0x44, 0xdc, 0x51, 0x4d, 0x5e, 0x10, 0x23, 0x84, 0x50, + 0xe3, 0xea, 0x34, 0xa2, 0x97, 0x50, 0x18, 0x04, 0x7d, 0xf7, 0x6e, 0x5a, 0xa1, 0xdc, 0xc9, 0x5e, + 0xe8, 0x23, 0x53, 0xf1, 0x59, 0x1a, 0x9d, 0x01, 0x20, 0x93, 0x3e, 0xc1, 0xa1, 0xbf, 0xa3, 0x59, + 0xc8, 0x77, 0x56, 0x9f, 0xe9, 0x6b, 0xd4, 0xa9, 0xfe, 0x99, 0xae, 0xef, 0x80, 0x09, 0x01, 0x75, + 0x51, 0x50, 0xec, 0xfb, 0xf3, 0xd7, 0xea, 0xa5, 0x61, 0x2e, 0xd2, 0xfd, 0xe7, 0x98, 0x63, 0x38, + 0xbf, 0x13, 0xf4, 0x9e, 0x24, 0x19, 0xa4, 0xae, 0xce, 0xbd, 0xb3, 0xa5, 0xbe, 0x78, 0xfe, 0x99, + 0x7f, 0x79, 0x06, 0x0a, 0x07, 0x92, 0x7c, 0xd3, 0x34, 0xfd, 0x42, 0x50, 0x95, 0xfe, 0x39, 0x82, + 0x3a, 0xc6, 0x0b, 0x2a, 0x7f, 0x10, 0xaa, 0xa4, 0xe7, 0xab, 0x20, 0x3c, 0xbb, 0x3a, 0x4f, 0xd9, + 0x8c, 0xae, 0x61, 0xb0, 0x2d, 0xfd, 0x0c, 0x7d, 0x90, 0x17, 0xf8, 0x75, 0x36, 0x09, 0xa6, 0x41, + 0x9a, 0x81, 0xe6, 0x43, 0xa8, 0x06, 0xa4, 0x10, 0x04, 0xff, 0x04, 0xd5, 0x17, 0x07, 0xf8, 0xd7, + 0x17, 0x55, 0x23, 0xc4, 0xf1, 0xd4, 0xd4, 0x6f, 0xf4, 0xbd, 0x09, 0xef, 0x23, 0x6b, 0x87, 0x79, + 0xd5, 0x3f, 0x43, 0xd2, 0x3b, 0xdd, 0x6b, 0x7a, 0x1a, 0xa4, 0x67, 0x72, 0x03, 0x8e, 0x7e, 0x9e, + 0xc2, 0x05, 0x7c, 0x36, 0x49, 0xf4, 0xa3, 0xd5, 0xc5, 0xfc, 0x42, 0xf9, 0x17, 0x72, 0x3e, 0x33, + 0xd1, 0xf9, 0x51, 0xd8, 0x51, 0xdc, 0xe7, 0xb0, 0xef, 0x20, 0xe6, 0xa3, 0xb0, 0x17, 0x61, 0xd4, + 0xe7, 0x6c, 0x04, 0xb5, 0xc1, 0xe5, 0x3e, 0xc2, 0x6b, 0x38, 0x4b, 0x14, 0xfb, 0x12, 0xf8, 0x6a, + 0x17, 0x4e, 0x81, 0xa4, 0xcf, 0xc7, 0x12, 0x83, 0x24, 0x49, 0x27, 0xf1, 0xb3, 0x6c, 0x4a, 0x3a, + 0x5d, 0x14, 0x13, 0x38, 0x35, 0x7f, 0x93, 0xc0, 0xee, 0x89, 0x45, 0xc0, 0xb1, 0x12, 0x1c, 0x5d, + 0x8d, 0x62, 0x2f, 0x75, 0x11, 0xee, 0x03, 0x2d, 0x3d, 0xf6, 0xad, 0xf8, 0xa1, 0xf6, 0x71, 0xa0, + 0x04, 0xb3, 0xb0, 0x44, 0x0e, 0xea, 0x9e, 0x04, 0xe7, 0x53, 0x0f, 0x97, 0x38, 0x64, 0x87, 0x89, + 0x4d, 0xae, 0x29, 0xa2, 0x69, 0x5a, 0x72, 0x26, 0xe0, 0x3d, 0x3b, 0xb6, 0x9b, 0xe7, 0x4c, 0x29, + 0xee, 0xf0, 0x7d, 0x7f, 0x12, 0x5d, 0xb1, 0xd7, 0xa3, 0x94, 0xd3, 0xfa, 0xe8, 0xbb, 0x13, 0x06, + 0x55, 0xcb, 0xd4, 0x44, 0x57, 0x03, 0x67, 0x69, 0x2d, 0x17, 0xe5, 0xcf, 0x39, 0x81, 0x4c, 0xfe, + 0x45, 0x64, 0x8f, 0x73, 0xb6, 0x61, 0x17, 0xcd, 0x58, 0xe7, 0xc6, 0x9a, 0x5d, 0x2d, 0x82, 0x23, + 0xb5, 0xf5, 0xbd, 0x0e, 0xb7, 0x22, 0x7f, 0x6d, 0x21, 0xa6, 0x8e, 0xd4, 0x46, 0x12, 0xb6, 0x1a, + 0xcb, 0x32, 0x92, 0x18, 0x0b, 0x70, 0xc0, 0xd9, 0x9e, 0x4c, 0x2f, 0x58, 0x42, 0x1e, 0xd9, 0xa9, + 0x31, 0xb5, 0x91, 0x1e, 0xc4, 0xc5, 0xe5, 0xc2, 0x4c, 0xa0, 0x2d, 0xdc, 0x04, 0xa8, 0xa5, 0x64, + 0x16, 0x64, 0x70, 0x75, 0x1f, 0x87, 0x10, 0xe0, 0xc6, 0x14, 0x64, 0xc3, 0xd0, 0x8f, 0x24, 0x9c, + 0x89, 0x8c, 0xe3, 0x2a, 0x54, 0x9f, 0x06, 0x24, 0xf3, 0xfd, 0xeb, 0xbf, 0xfc, 0x1f, 0xfc, 0xdb, + 0xbb, 0xae, 0x6f, 0xa8, 0x35, 0xff, 0x75, 0x01, 0xa9, 0x5c, 0xab, 0x97, 0x9f, 0x3d, 0x7d, 0x9e, + 0x27, 0xe9, 0xe2, 0xf4, 0x5e, 0x9c, 0x89, 0x2b, 0xbb, 0x7e, 0x49, 0x7b, 0xb8, 0xe2, 0x79, 0x98, + 0xe8, 0x84, 0x39, 0x13, 0x38, 0xba, 0x38, 0x89, 0x34, 0xc8, 0x8f, 0x69, 0xd3, 0xcb, 0x3b, 0x21, + 0x0e, 0x39, 0xf1, 0xd2, 0xea, 0x55, 0x80, 0x2a, 0x4d, 0xf5, 0x57, 0x7d, 0xed, 0x13, 0x03, 0x09, + 0xc2, 0xd4, 0x45, 0xf6, 0x28, 0x04, 0xc8, 0xa1, 0xc8, 0x26, 0x6e, 0x8c, 0xc2, 0x09, 0x77, 0xfa, + 0x72, 0xbe, 0xb9, 0x61, 0x05, 0xec, 0x46, 0x17, 0x89, 0xa4, 0x86, 0xf2, 0x54, 0x3f, 0x8e, 0x88, + 0x3c, 0x79, 0x05, 0x59, 0x47, 0x56, 0xb5, 0x5b, 0x20, 0xd0, 0x97, 0x1f, 0x0e, 0x49, 0xa0, 0x09, + 0xe4, 0xf8, 0x9f, 0x7d, 0x2b, 0x0a, 0xaf, 0x0d, 0x2c, 0x85, 0xac, 0x6b, 0xda, 0xad, 0x87, 0x9c, + 0x19, 0x52, 0x6c, 0xa3, 0x02, 0x73, 0x45, 0x78, 0xd8, 0x1b, 0x1d, 0x49, 0xba, 0xbb, 0x0a, 0x1e, + 0x17, 0xab, 0x82, 0xb6, 0x70, 0xf7, 0x1f, 0x6d, 0x7a, 0xab, 0x3a, 0xfd, 0x67, 0x67, 0x49, 0x17, + 0x9e, 0x21, 0x40, 0xb0, 0xdd, 0x7e, 0xd1, 0x2e, 0xfa, 0x19, 0x4c, 0xce, 0xfc, 0xb2, 0x4d, 0x5b, + 0x5c, 0x85, 0x20, 0xda, 0xec, 0xf8, 0xb4, 0xb3, 0xc5, 0x44, 0xb7, 0x05, 0xbc, 0xc1, 0xce, 0x99, + 0x19, 0xd4, 0x8a, 0xfe, 0xf5, 0xcc, 0x76, 0xa7, 0xed, 0x76, 0x4e, 0x7e, 0xa9, 0xa6, 0x10, 0xf2, + 0x16, 0xc6, 0x90, 0x19, 0xc8, 0x95, 0x31, 0x69, 0x96, 0xd3, 0x59, 0x70, 0x8a, 0xf3, 0x15, 0x7e, + 0x39, 0x2c, 0xb9, 0xcf, 0xca, 0xe1, 0xf3, 0xf7, 0x3c, 0x89, 0x4f, 0xb1, 0x83, 0x8e, 0xb8, 0x77, + 0xcc, 0xca, 0x63, 0xdf, 0x4e, 0x01, 0x2f, 0xe0, 0xcd, 0x9b, 0x5c, 0x42, 0xaf, 0x61, 0x51, 0xe9, + 0x8d, 0x86, 0x94, 0x18, 0x9b, 0x7f, 0x0e, 0xb0, 0x84, 0x55, 0xf4, 0x79, 0x69, 0x3a, 0x20, 0xab, + 0xda, 0xe2, 0x48, 0x25, 0x2f, 0x10, 0x3c, 0x2d, 0xc4, 0x46, 0xb6, 0x9c, 0x25, 0xa6, 0x48, 0xfb, + 0x9c, 0x35, 0xe1, 0xaf, 0x70, 0x3d, 0x1b, 0x62, 0x74, 0x39, 0xea, 0x55, 0x32, 0xd6, 0xd0, 0xe6, + 0x4c, 0xcb, 0xa7, 0x98, 0x87, 0xcf, 0xca, 0x7a, 0x65, 0x32, 0x35, 0x04, 0x61, 0x90, 0xd6, 0xea, + 0x59, 0x02, 0x37, 0x0e, 0x13, 0xa3, 0x5d, 0x00, 0xed, 0x7e, 0x88, 0xa3, 0x3e, 0x44, 0xc1, 0x5c, + 0x43, 0xe7, 0x38, 0x26, 0x3e, 0x86, 0x6e, 0x92, 0x7b, 0x0d, 0x22, 0x8e, 0x11, 0x84, 0x78, 0xaa, + 0x8e, 0x4e, 0x3e, 0x90, 0xd8, 0x83, 0x63, 0x50, 0x88, 0x83, 0xe4, 0x5b, 0xdb, 0x66, 0x50, 0xdc, + 0x60, 0x21, 0x04, 0xbc, 0x46, 0x43, 0xed, 0x6f, 0xab, 0x73, 0x3f, 0x15, 0x5f, 0xfd, 0x64, 0xc2, + 0x29, 0x44, 0xc5, 0x25, 0x8f, 0x8f, 0x33, 0x92, 0x3c, 0x26, 0x37, 0x72, 0x42, 0x62, 0x00, 0xe1, + 0xfa, 0x6a, 0xec, 0x4b, 0x66, 0x2e, 0x7a, 0x13, 0x7b, 0x57, 0xd4, 0x0e, 0xed, 0x61, 0xc5, 0xcd, + 0x84, 0x35, 0xcc, 0xa3, 0xef, 0x5e, 0x66, 0xe9, 0x13, 0x6b, 0x31, 0x31, 0x14, 0x9d, 0xf7, 0x48, + 0x9b, 0x7c, 0x7e, 0x06, 0x66, 0x56, 0xc6, 0x55, 0x7b, 0x7d, 0xbe, 0xd3, 0xdc, 0x78, 0x5f, 0x75, + 0xbd, 0xe9, 0xec, 0xc5, 0xea, 0xe3, 0xb6, 0x34, 0x75, 0x12, 0xb4, 0x86, 0xda, 0x52, 0x95, 0xe6, + 0xe1, 0x5b, 0x74, 0xfd, 0xfd, 0xbb, 0x37, 0x7f, 0xc3, 0xe8, 0x3c, 0xa8, 0x04, 0x01, 0xc7, 0x5e, + 0xb3, 0x12, 0xd3, 0x54, 0xcf, 0x43, 0x93, 0x23, 0x91, 0x70, 0x39, 0x0f, 0x81, 0x76, 0xde, 0x98, + 0xed, 0xc9, 0xd9, 0xd0, 0x4b, 0x57, 0xb6, 0x7a, 0x35, 0x9d, 0x23, 0xd1, 0x90, 0xef, 0x5d, 0xf2, + 0x49, 0xfd, 0x71, 0xa6, 0xfe, 0x66, 0xa9, 0x53, 0x09, 0x79, 0x5e, 0xb6, 0x53, 0xeb, 0xcc, 0x91, + 0x1c, 0x0a, 0xd1, 0xd7, 0x39, 0x35, 0xbc, 0x04, 0xce, 0xc9, 0x80, 0xd9, 0x69, 0xb9, 0x28, 0x44, + 0x79, 0x9d, 0x01, 0x64, 0x1e, 0x8f, 0x48, 0x66, 0xd0, 0x8c, 0x94, 0xb6, 0x59, 0x46, 0x5d, 0x5d, + 0x09, 0x0a, 0xcd, 0x65, 0xc5, 0x84, 0x91, 0xaf, 0xbe, 0xd2, 0x68, 0xe6, 0x3b, 0xa7, 0xf8, 0x57, + 0x93, 0xa8, 0x23, 0x4b, 0xa2, 0x61, 0x50, 0xb1, 0x10, 0x6d, 0x88, 0x2e, 0x40, 0x6a, 0x64, 0xe3, + 0xf1, 0xcc, 0xcf, 0xc5, 0x0b, 0x08, 0x14, 0x7b, 0xed, 0x0e, 0xee, 0xf8, 0x43, 0xf2, 0xbf, 0x80, + 0x4b, 0x0a, 0x9e, 0xac, 0xee, 0xf0, 0x8c, 0xd4, 0xf5, 0xcc, 0xe4, 0x97, 0x27, 0x57, 0x77, 0xe7, + 0x4c, 0x37, 0x69, 0xf7, 0x4a, 0x5f, 0x64, 0x48, 0x04, 0x49, 0xed, 0x83, 0x4a, 0xc3, 0x94, 0x93, + 0x01, 0xf2, 0xf0, 0x8f, 0xbe, 0xe3, 0x9b, 0x04, 0xed, 0x74, 0x70, 0x5e, 0x9a, 0x93, 0xb0, 0xab, + 0x8f, 0xc8, 0x70, 0xae, 0x02, 0xae, 0xce, 0x22, 0x14, 0xd3, 0xb9, 0xc0, 0xc1, 0xae, 0x27, 0x01, + 0x2a, 0x1a, 0xfd, 0x9c, 0x96, 0x04, 0xe7, 0xff, 0xf4, 0x76, 0xca, 0xad, 0x60, 0x95, 0xc8, 0xed, + 0x4b, 0x0a, 0x91, 0x56, 0x58, 0x61, 0x98, 0x3f, 0x16, 0x3c, 0xb5, 0xde, 0x4c, 0xad, 0x60, 0x5d, + 0x82, 0x02, 0xf8, 0x88, 0x24, 0xea, 0x5d, 0x51, 0x61, 0xa9, 0x6d, 0xc4, 0x41, 0x25, 0xd9, 0xbd, + 0x49, 0xd0, 0x9b, 0x93, 0x18, 0x5b, 0x75, 0xb9, 0xa1, 0x11, 0xb5, 0x5e, 0x92, 0xa4, 0x73, 0x1e, + 0x71, 0x22, 0xc0, 0xcf, 0x88, 0xed, 0x18, 0x64, 0xb5, 0xb3, 0xe5, 0x71, 0x8f, 0xb0, 0x0a, 0xdc, + 0x2f, 0x9f, 0xc5, 0x47, 0xe0, 0x42, 0xb5, 0xed, 0xfd, 0x8c, 0xa9, 0x69, 0xfb, 0xad, 0x0e, 0x57, + 0x90, 0x90, 0x64, 0x9f, 0x1d, 0x93, 0x26, 0x8d, 0xde, 0x67, 0x84, 0x4b, 0xf0, 0x75, 0x49, 0xb1, + 0xbe, 0xe3, 0x4f, 0x07, 0xbe, 0xab, 0x42, 0x44, 0x84, 0x65, 0xfb, 0x96, 0xd6, 0x4c, 0x9d, 0xec, + 0xb6, 0xa5, 0xb8, 0xea, 0xb6, 0xa5, 0x3c, 0x9f, 0x0e, 0xb6, 0x52, 0x9a, 0x36, 0x7d, 0x86, 0x75, + 0xe1, 0x68, 0x2a, 0xc3, 0x2c, 0xc4, 0x87, 0x6b, 0x4b, 0x99, 0x75, 0xd5, 0x60, 0x0b, 0x37, 0x57, + 0xca, 0x52, 0x80, 0x35, 0x9a, 0xe7, 0x91, 0xb9, 0x1a, 0xb1, 0x0d, 0x13, 0x40, 0x04, 0x2a, 0xe4, + 0x65, 0x20, 0xc9, 0x3a, 0x12, 0x98, 0x2e, 0xe4, 0x68, 0x6a, 0x34, 0x43, 0x34, 0x15, 0xf5, 0x15, + 0x21, 0xa6, 0x66, 0xdb, 0x45, 0x77, 0x02, 0xef, 0x3c, 0x24, 0x56, 0x1c, 0x0c, 0x98, 0x48, 0xe9, + 0x4d, 0xcc, 0x87, 0x72, 0x92, 0x31, 0x5a, 0xc2, 0x41, 0x00, 0x5f, 0x67, 0xd8, 0x90, 0x83, 0x66, + 0xd4, 0xbd, 0x4c, 0x5c, 0xca, 0xa7, 0xb3, 0x14, 0xf2, 0x5e, 0x30, 0xc8, 0x29, 0xeb, 0x98, 0xad, + 0xbe, 0x2b, 0x94, 0x86, 0x9b, 0xed, 0x68, 0xe6, 0xca, 0x3c, 0x5a, 0x1e, 0x70, 0xf6, 0xc9, 0x26, + 0x81, 0x71, 0xa4, 0xba, 0x2b, 0xe6, 0xbe, 0xf9, 0xdc, 0x82, 0x7f, 0xb7, 0xb1, 0x9c, 0x96, 0xb2, + 0x7b, 0x85, 0x8a, 0x12, 0x3e, 0x3b, 0xf5, 0xcf, 0xb4, 0x32, 0xa0, 0x11, 0xba, 0x5c, 0x9d, 0x28, + 0x94, 0xae, 0x6c, 0x3d, 0xd7, 0x32, 0x68, 0x16, 0x81, 0xa6, 0x82, 0xf2, 0x52, 0x70, 0x1c, 0xfc, + 0x6e, 0xda, 0x03, 0x16, 0x02, 0x6f, 0xfa, 0xdf, 0xea, 0xe0, 0x14, 0xa7, 0x9c, 0x2d, 0x96, 0x4f, + 0x72, 0x10, 0x08, 0x39, 0xaf, 0x51, 0x8e, 0x77, 0xa8, 0xf2, 0x9f, 0x7c, 0xb2, 0x83, 0x12, 0x8a, + 0x41, 0x12, 0xca, 0x6a, 0x2c, 0x73, 0x2d, 0x17, 0x2e, 0x38, 0xe9, 0x6e, 0xcf, 0xae, 0x55, 0x7b, + 0x31, 0x0a, 0xc2, 0x96, 0x18, 0x75, 0x05, 0xac, 0x0c, 0x24, 0x83, 0x0a, 0x87, 0x85, 0xab, 0xd1, + 0x1b, 0xe7, 0x13, 0xa4, 0xb4, 0xe9, 0x47, 0x31, 0xcd, 0x4c, 0xa3, 0xe2, 0xea, 0xf4, 0x5e, 0xd5, + 0x75, 0xea, 0xeb, 0xdc, 0xc5, 0x99, 0xb8, 0x39, 0x5b, 0x90, 0x2d, 0x17, 0x86, 0x55, 0x52, 0xc1, + 0x36, 0xec, 0x3b, 0xdf, 0x57, 0x0c, 0x6b, 0x95, 0xc4, 0x6b, 0x34, 0xb5, 0xac, 0x1b, 0x23, 0x3b, + 0x0a, 0x24, 0x6b, 0xa1, 0xf2, 0xd6, 0x81, 0x22, 0xc6, 0x4b, 0x81, 0x00, 0x0b, 0x71, 0x1a, 0xc5, + 0xd2, 0x9f, 0xdd, 0xdd, 0x15, 0xd8, 0xba, 0xb3, 0xfc, 0x33, 0xff, 0x6e, 0x62, 0x38, 0x28, 0x7a, + 0x9d, 0x20, 0x8e, 0x32, 0xf8, 0x9d, 0x23, 0xfa, 0x7e, 0xa2, 0x77, 0xc5, 0x95, 0x4d, 0xf7, 0x97, + 0xbe, 0x81, 0xfb, 0x07, 0x4a, 0xe0, 0x55, 0x07, 0xa9, 0xad, 0x10, 0x57, 0x3b, 0xa1, 0x8d, 0x70, + 0x85, 0x87, 0xc5, 0xd5, 0xf2, 0x91, 0xf1, 0x9a, 0x7d, 0x46, 0xce, 0x44, 0x85, 0x3e, 0x30, 0x8e, + 0xd4, 0x06, 0x84, 0x8d, 0x89, 0x7b, 0x43, 0x7b, 0x9c, 0x06, 0x07, 0x6d, 0xd2, 0xc9, 0xcf, 0xba, + 0xe0, 0xc6, 0x25, 0x2b, 0xbc, 0x96, 0x0b, 0x63, 0x7b, 0x11, 0x90, 0x0b, 0x87, 0x91, 0x1e, 0x72, + 0x88, 0x6e, 0xb9, 0xaf, 0x8f, 0xc3, 0xb7, 0x57, 0x78, 0xf7, 0x90, 0xa5, 0xaf, 0x74, 0x00, 0x4f, + 0x3b, 0x9f, 0x84, 0x98, 0x40, 0xc2, 0x5b, 0x52, 0x4e, 0x17, 0x5b, 0xe1, 0xec, 0xe6, 0xfd, 0xfd, + 0xc4, 0xaf, 0xb8, 0xbf, 0xb3, 0xea, 0x88, 0xec, 0x3d, 0xce, 0xc3, 0xea, 0xf3, 0x41, 0xfa, 0xb2, + 0xc5, 0xe5, 0x47, 0x26, 0xe5, 0x98, 0x91, 0x3e, 0xa0, 0x5c, 0x7d, 0x14, 0x36, 0xbe, 0xd7, 0xa9, + 0xe8, 0xfb, 0x9e, 0xfe, 0x8a, 0x2e, 0x9e, 0xc5, 0xf6, 0x21, 0xe8, 0x6e, 0x6c, 0x9f, 0x05, 0x53, + 0xab, 0x0e, 0x83, 0x3d, 0xe4, 0x34, 0xd8, 0xbd, 0x8f, 0x83, 0x55, 0x9c, 0x07, 0xbb, 0xf2, 0x6e, + 0xfa, 0xbe, 0x37, 0x3d, 0x43, 0xde, 0x8c, 0x33, 0xe9, 0xa5, 0x39, 0xde, 0x55, 0x3e, 0xdf, 0xb5, + 0xfe, 0x80, 0x57, 0x21, 0x25, 0x82, 0xcc, 0x86, 0x7d, 0xb4, 0xab, 0xf2, 0x04, 0xf4, 0x8a, 0xc3, + 0x5d, 0x4b, 0x27, 0xfc, 0x08, 0x72, 0xfa, 0xf2, 0x79, 0x16, 0xf5, 0xba, 0xfa, 0xa8, 0x33, 0xce, + 0xa5, 0x73, 0xc2, 0x5e, 0xfa, 0x97, 0xb4, 0x08, 0xfa, 0x17, 0x66, 0xf4, 0xe4, 0xf8, 0x21, 0x47, + 0x9f, 0x0d, 0x35, 0x58, 0x67, 0x98, 0x6b, 0xb7, 0xe6, 0xce, 0xd2, 0xbb, 0xfa, 0x92, 0x03, 0xd0, + 0xb6, 0xae, 0xf9, 0xd0, 0xba, 0x97, 0x48, 0x4c, 0x82, 0x8c, 0xd2, 0x0f, 0xab, 0xc6, 0x43, 0x5b, + 0x5e, 0x69, 0xf1, 0xcc, 0xf5, 0xc2, 0x39, 0xff, 0xcf, 0x3c, 0xe3, 0x7f, 0xbf, 0xf3, 0xfd, 0x77, + 0x79, 0xbb, 0x34, 0x1f, 0x15, 0x47, 0xb3, 0x61, 0x7f, 0xe0, 0xa4, 0x91, 0xba, 0x19, 0x2d, 0x76, + 0xe5, 0x17, 0x48, 0x72, 0x51, 0x3b, 0xad, 0xf8, 0x81, 0xfd, 0x65, 0xfd, 0xdd, 0xa8, 0xd4, 0x40, + 0xe1, 0xa0, 0x70, 0xf1, 0x1a, 0x12, 0xfb, 0xfa, 0xd1, 0x82, 0x2d, 0x99, 0x83, 0x59, 0x2e, 0xac, + 0x74, 0xc3, 0x0b, 0x85, 0x90, 0xce, 0x86, 0x43, 0x62, 0x51, 0xf8, 0x63, 0xfb, 0x13, 0x0b, 0x32, + 0xfc, 0xa0, 0x0f, 0x57, 0x76, 0x8c, 0xcc, 0x82, 0x64, 0xc5, 0x79, 0x9a, 0xe2, 0xda, 0x47, 0xaf, + 0xf1, 0xcb, 0xa7, 0x7a, 0xeb, 0xdc, 0xad, 0x9d, 0xb9, 0x03, 0x9a, 0xb0, 0x01, 0xed, 0xec, 0xdf, + 0xd3, 0xf6, 0x17, 0xbf, 0xf4, 0x12, 0xbf, 0x56, 0x2f, 0xe7, 0x65, 0xe0, 0x66, 0x90, 0x94, 0x8e, + 0x18, 0x72, 0xa1, 0xf3, 0xfc, 0xa5, 0x38, 0x80, 0xbb, 0x32, 0xd6, 0x41, 0xff, 0x05, 0xac, 0xaf, + 0x3e, 0x04, 0x9f, 0x13, 0x61, 0x41, 0x74, 0xb9, 0x7c, 0xda, 0xa7, 0x4d, 0x9c, 0x61, 0xc9, 0xa9, + 0xf7, 0xd9, 0xec, 0x4c, 0x17, 0xc5, 0x86, 0xde, 0x3f, 0xcc, 0xcf, 0x28, 0x6b, 0xa5, 0x4e, 0x0b, + 0xe9, 0x79, 0x15, 0xa3, 0xec, 0x61, 0x63, 0x70, 0x7a, 0xf7, 0xeb, 0x8d, 0xae, 0x53, 0xee, 0x4d, + 0xa9, 0x33, 0xba, 0x54, 0xb9, 0x23, 0xad, 0x96, 0x58, 0x8c, 0x44, 0xbf, 0x27, 0x95, 0x09, 0x36, + 0x90, 0x08, 0x2a, 0x2a, 0x5b, 0x16, 0xd8, 0x9c, 0x41, 0xbb, 0x6e, 0x72, 0x85, 0x33, 0x92, 0x7b, + 0xed, 0x4e, 0x6b, 0xb7, 0xbd, 0x5b, 0x4e, 0xfd, 0xe9, 0xda, 0xa9, 0xee, 0x73, 0xeb, 0x05, 0x4c, + 0x46, 0x72, 0x6a, 0x86, 0x35, 0x31, 0x36, 0xf6, 0x70, 0xba, 0x10, 0xce, 0xd6, 0xef, 0xc1, 0x00, + 0x33, 0xf5, 0xb0, 0xaf, 0xca, 0xdd, 0xc6, 0xec, 0xfa, 0xc9, 0x21, 0xd1, 0x57, 0x7d, 0xb6, 0x11, + 0x19, 0x55, 0x71, 0xb5, 0x02, 0xe7, 0xd5, 0x5f, 0xbc, 0x94, 0x94, 0xe8, 0x0c, 0x48, 0x96, 0x44, + 0xb1, 0x59, 0x9e, 0x13, 0xaf, 0xdf, 0xcb, 0x61, 0x89, 0xcd, 0x50, 0xce, 0x41, 0xca, 0x10, 0x71, + 0x44, 0x92, 0xd4, 0x54, 0xeb, 0xde, 0x93, 0xcc, 0x16, 0x83, 0xa6, 0xc4, 0x0d, 0xa5, 0x2d, 0x32, + 0x81, 0x95, 0xca, 0x5f, 0x4c, 0x83, 0xb8, 0xbe, 0xa4, 0xc2, 0xf6, 0x57, 0x5f, 0x6e, 0xef, 0x74, + 0x2c, 0x10, 0x98, 0x8d, 0xcc, 0x4c, 0x24, 0x97, 0x37, 0x10, 0x38, 0x33, 0xf3, 0x2c, 0xe6, 0xb0, + 0x29, 0xbf, 0x68, 0x27, 0x3b, 0x27, 0x01, 0x30, 0x81, 0xd1, 0x8e, 0x93, 0xeb, 0xdb, 0x63, 0xcb, + 0x2c, 0x67, 0x72, 0xa5, 0x63, 0x76, 0x09, 0x09, 0xae, 0x1e, 0x61, 0x45, 0xbe, 0x99, 0xab, 0x63, + 0x05, 0xba, 0x83, 0xbc, 0xc5, 0x2e, 0x3f, 0x3b, 0x9f, 0x32, 0x81, 0x3c, 0xd5, 0x9e, 0x3f, 0x20, + 0xfc, 0x2a, 0x8a, 0x2f, 0x12, 0x55, 0xd3, 0x16, 0x31, 0xd2, 0xf4, 0x63, 0x8e, 0x54, 0x13, 0x9f, + 0x4c, 0xdd, 0xe5, 0x8b, 0x60, 0xb4, 0x93, 0x84, 0x59, 0x64, 0x00, 0x7f, 0x9e, 0x67, 0x43, 0x93, + 0x74, 0x17, 0x0a, 0xd7, 0x1f, 0xfa, 0x48, 0x5d, 0x4d, 0x52, 0x33, 0xda, 0xcc, 0x5c, 0x83, 0xda, + 0x76, 0x26, 0x34, 0x06, 0x12, 0x93, 0xeb, 0x9a, 0x8c, 0x29, 0xc2, 0xb5, 0x61, 0xe9, 0x48, 0x42, + 0xfe, 0xe6, 0x0d, 0xd2, 0xb9, 0xc7, 0x07, 0x5e, 0xb5, 0x2b, 0x52, 0x82, 0x6b, 0x13, 0x63, 0xfd, + 0x9a, 0x04, 0x56, 0x0a, 0xde, 0x9c, 0x01, 0x06, 0x1c, 0x9b, 0xf7, 0x91, 0xef, 0x97, 0x87, 0xd5, + 0x55, 0x52, 0x01, 0xb9, 0xd6, 0x73, 0x34, 0x73, 0x3e, 0x55, 0x24, 0x98, 0xee, 0xaf, 0x90, 0x77, + 0x83, 0x61, 0x31, 0x49, 0x36, 0x21, 0x9a, 0xf6, 0xf5, 0xfe, 0x42, 0xf6, 0x43, 0x7a, 0xc5, 0xde, + 0x0e, 0xac, 0xcf, 0xec, 0x0e, 0x6e, 0x63, 0x18, 0xe5, 0xd0, 0x50, 0x80, 0x14, 0xe3, 0x20, 0xe7, + 0x02, 0x63, 0x4c, 0x99, 0x05, 0x6e, 0xe7, 0xf1, 0xbd, 0x5b, 0xc6, 0xca, 0x64, 0x13, 0xd7, 0x76, + 0x28, 0xfd, 0xc0, 0x66, 0xa8, 0xe2, 0x23, 0xd2, 0x29, 0x94, 0x75, 0xf9, 0x19, 0x0b, 0x42, 0xe5, + 0x42, 0xb4, 0xd7, 0x84, 0xc3, 0xda, 0xec, 0xe0, 0x10, 0x19, 0x1b, 0x86, 0x44, 0x34, 0x76, 0x01, + 0x93, 0x40, 0xfc, 0x8c, 0x3e, 0xb1, 0xb9, 0xaa, 0x5c, 0x5b, 0x1f, 0x28, 0xd7, 0x9d, 0x43, 0x0b, + 0xd4, 0x0f, 0xfa, 0xc3, 0x97, 0x02, 0x26, 0x85, 0x07, 0x13, 0xc1, 0x58, 0x3e, 0x33, 0xc0, 0x76, + 0x89, 0x8f, 0x4e, 0xa3, 0xe3, 0x2c, 0x9c, 0x0d, 0x98, 0xbe, 0x31, 0x57, 0x0e, 0xde, 0xe2, 0xbb, + 0xf6, 0xb2, 0xd7, 0xc6, 0xc1, 0xf9, 0x98, 0x68, 0xad, 0xee, 0xdc, 0xf5, 0x2a, 0x28, 0x80, 0x33, + 0xcd, 0x66, 0xad, 0x56, 0xcc, 0x34, 0x3c, 0x60, 0x3a, 0x03, 0xc0, 0x54, 0x4e, 0x6d, 0x16, 0x66, + 0x77, 0x3a, 0x91, 0x8b, 0x51, 0x2e, 0x8a, 0x6f, 0xa5, 0x2b, 0xb2, 0x57, 0x4e, 0x59, 0x6d, 0x04, + 0x3e, 0x6a, 0x17, 0x12, 0x0e, 0x37, 0x6d, 0x5e, 0x05, 0x43, 0xf8, 0x72, 0xae, 0xf1, 0x7b, 0xcc, + 0x4e, 0xfc, 0x2d, 0xe7, 0x1f, 0xf0, 0x30, 0xf5, 0xae, 0xcf, 0x46, 0xb3, 0xa4, 0x5e, 0x15, 0xbf, + 0x2f, 0x77, 0x1d, 0x16, 0x2e, 0x52, 0x64, 0xf8, 0xd6, 0xdd, 0x88, 0x15, 0xd7, 0x27, 0x1e, 0x98, + 0xde, 0x94, 0x35, 0xee, 0x8d, 0x15, 0xd9, 0x81, 0x16, 0xf9, 0x99, 0x96, 0x45, 0xf4, 0xad, 0x64, + 0x9a, 0x8c, 0x9e, 0x59, 0x52, 0x88, 0x5e, 0xba, 0x72, 0x5b, 0xa3, 0x81, 0x53, 0xca, 0xb3, 0x93, + 0x67, 0x66, 0xc2, 0xcd, 0xdb, 0x31, 0xa9, 0x46, 0xb5, 0x42, 0x09, 0x3b, 0x2b, 0xd0, 0x62, 0x31, + 0x93, 0x40, 0xd1, 0x55, 0x9d, 0x8a, 0xdc, 0x41, 0x1b, 0xab, 0x8f, 0x24, 0x56, 0xa4, 0xf7, 0x2d, + 0xd9, 0x18, 0x57, 0xc4, 0x91, 0x9b, 0xe4, 0xb1, 0xf4, 0xff, 0x22, 0x45, 0xd3, 0x0b, 0xd2, 0xe8, + 0xf9, 0x94, 0xfd, 0x21, 0x7e, 0x42, 0x69, 0xe7, 0x1f, 0x08, 0xca, 0x3f, 0xdc, 0xf8, 0xff, 0x01, + 0xb2, 0x65, 0x49, 0x1a, 0x15, 0x4a, 0x01, 0x00, }; /* When present, this file replaces the built-in dashboard at runtime, so the diff --git a/tests/test_pipeline_common.c b/tests/test_pipeline_common.c index d39b275b..5bcad910 100644 --- a/tests/test_pipeline_common.c +++ b/tests/test_pipeline_common.c @@ -4,6 +4,8 @@ #include #include #include + +#include "venc_config.h" #include #include @@ -18,6 +20,130 @@ static int touch_file(const char *path) return 1; } + +/* Drive the watch one window at a time. + * + * The first version of this fed N seconds of 10 ms frames and let the 2 s + * boundary fall where it may. The feed lengths did not line up with the + * window, so a "one window at 2x" arm actually straddled two windows and + * diluted below the trip threshold -- every assertion passed, and so did + * mutants with the two-window rule, the hysteresis and the zero-target guard + * all removed. Each call here closes EXACTLY one window at EXACTLY the + * requested rate, so the assertions are pinned to window counts. */ +static void rw_prime(PipelineRateWatch *rw, const VencConfig *cfg, uint64_t *t) +{ + pipeline_common_rate_watch(rw, cfg, 0, *t); /* opens the window */ +} + +static void rw_window(PipelineRateWatch *rw, const VencConfig *cfg, + uint32_t kbps, uint64_t *t) +{ + /* bytes carrying `kbps` for one 2 s window = kbps * 1000 * 2 / 8. */ + uint32_t bytes = (uint32_t)((uint64_t)kbps * 250ULL); + + *t += 2000000ULL; + pipeline_common_rate_watch(rw, cfg, bytes, *t); +} + +static int test_rate_watch(void) +{ + int failures = 0; + VencConfig cfg; + PipelineRateWatch rw; + uint64_t t = 1000000ULL; + + venc_config_defaults(&cfg); + cfg.video0.bitrate = 4000; + + /* At target: never trips, however long it runs. */ + memset(&rw, 0, sizeof(rw)); + rw_prime(&rw, &cfg, &t); + for (int i = 0; i < 6; i++) + rw_window(&rw, &cfg, 4000, &t); + CHECK("rate_watch_at_target_quiet", rw.reported == 0); + CHECK("rate_watch_at_target_no_streak", rw.over_windows == 0); + + /* ONE window at 2x is not enough -- the rule the two-window requirement + * exists for. A moving scene produced 1.43x for a single window on the + * bench and reporting that would make the warning noise. */ + memset(&rw, 0, sizeof(rw)); + rw_prime(&rw, &cfg, &t); + rw_window(&rw, &cfg, 4000, &t); + rw_window(&rw, &cfg, 8000, &t); + CHECK("rate_watch_one_over_window_quiet", rw.reported == 0); + CHECK("rate_watch_one_over_window_counted", rw.over_windows == 1); + rw_window(&rw, &cfg, 4000, &t); + CHECK("rate_watch_transient_leaves_no_latch", rw.reported == 0); + CHECK("rate_watch_transient_resets_streak", rw.over_windows == 0); + + /* The dead band must break an ARMED streak, which is what makes the + * two-window rule "consecutive" rather than "cumulative". 1.3x is the + * shape that matters: the worst benign transient measured on the bench + * was 1.43x, i.e. inside this band, so before the fix a single benign + * window between two overruns preserved the count and the pair reported + * as one sustained episode -- with a duration string computed from the + * window count, so two spikes 40 s apart claimed "for 4 s". + * + * Distinct from the latched hysteresis case below: there the streak is + * deliberately held. The difference is exactly `reported`. */ + memset(&rw, 0, sizeof(rw)); + rw_prime(&rw, &cfg, &t); + rw_window(&rw, &cfg, 24000, &t); + CHECK("rate_watch_armed_after_one_over", rw.over_windows == 1); + rw_window(&rw, &cfg, 5200, &t); + CHECK("rate_watch_dead_band_breaks_armed_streak", rw.over_windows == 0); + CHECK("rate_watch_dead_band_did_not_report", rw.reported == 0); + rw_window(&rw, &cfg, 24000, &t); + CHECK("rate_watch_non_consecutive_pair_stays_quiet", rw.reported == 0); + CHECK("rate_watch_non_consecutive_pair_recounts", rw.over_windows == 1); + + /* TWO consecutive over-windows trip it. */ + memset(&rw, 0, sizeof(rw)); + rw_prime(&rw, &cfg, &t); + rw_window(&rw, &cfg, 24000, &t); + CHECK("rate_watch_first_window_quiet", rw.reported == 0); + rw_window(&rw, &cfg, 24000, &t); + CHECK("rate_watch_second_window_trips", rw.reported == 1); + + /* Latched: no re-report while the overrun persists. */ + rw_window(&rw, &cfg, 24000, &t); + CHECK("rate_watch_stays_latched", rw.reported == 1); + CHECK("rate_watch_keeps_counting", rw.over_windows == 3); + /* One episode, one report. `reported` stays 1 whether or not the latch + * works, so it cannot show this on its own -- a mutant that re-reports + * every window passes every other assertion here. */ + CHECK("rate_watch_reports_once_per_episode", rw.reports == 1); + + /* 1.3x sits between the clear and trip thresholds: it must neither trip + * nor clear, which is what makes this a hysteresis band rather than one + * threshold. Latched from above, so a clear here would show. */ + rw_window(&rw, &cfg, 5200, &t); + CHECK("rate_watch_hysteresis_holds_latch", rw.reported == 1); + CHECK("rate_watch_hysteresis_holds_streak", rw.over_windows == 3); + + /* Back under the clear threshold: releases, and can arm again. */ + rw_window(&rw, &cfg, 4000, &t); + CHECK("rate_watch_clears", rw.reported == 0); + CHECK("rate_watch_resets_streak", rw.over_windows == 0); + rw_window(&rw, &cfg, 24000, &t); + rw_window(&rw, &cfg, 24000, &t); + CHECK("rate_watch_rearms", rw.reported == 1); + CHECK("rate_watch_second_episode_reported", rw.reports == 2); + + /* Zero target disables the check outright. Without the guard this + * divides by zero once a window closes, so the mutant does not merely + * fail -- it faults. */ + memset(&rw, 0, sizeof(rw)); + cfg.video0.bitrate = 0; + rw_prime(&rw, &cfg, &t); + rw_window(&rw, &cfg, 24000, &t); + rw_window(&rw, &cfg, 24000, &t); + CHECK("rate_watch_zero_target_disabled", + rw.reported == 0 && rw.window_bytes == 0); + + return failures; +} + int test_pipeline_common(void) { int failures = 0; @@ -32,6 +158,8 @@ int test_pipeline_common(void) char fixture_b[160]; int rc; + failures += test_rate_watch(); + CHECK("pipeline common gop zero", pipeline_common_gop_frames(0.0, 120) == 1); CHECK("pipeline common gop fps zero", pipeline_common_gop_frames(1.0, 0) == 30); CHECK("pipeline common gop rounded", pipeline_common_gop_frames(1.5, 90) == 135); @@ -156,6 +284,105 @@ int test_pipeline_common(void) rc = pipeline_common_resolve_isp_bin(fixture_a, "imx335", resolved, 0); CHECK("isp_bin zero size rc", rc == 0); + /* ── ROI bands ────────────────────────────────────────────────── + * The 1280x720 / center 0.3 / steps 1 case is the exact geometry the + * Maruko bitstream measurement used, so the numbers here and the + * device evidence describe the same rectangle. */ + { + PipelineRoiBand b; + int i; + + CHECK("roi band 720p c0.3 s1 rc", + pipeline_common_roi_band(1280, 720, 0.3f, -30, 1, 0, &b) == 0); + CHECK("roi band 720p c0.3 s1 x", b.x == 448); + CHECK("roi band 720p c0.3 s1 w", b.width == 384); + CHECK("roi band 720p c0.3 s1 y", b.y == 0); + CHECK("roi band 720p c0.3 s1 h", b.height == 704); + CHECK("roi band 720p c0.3 s1 qp", b.qp == -30); + + /* Two steps: outer band is wider and weaker, inner takes the full + * delta. A backend where a higher index overrides a lower one in + * the overlap therefore lands full strength in the centre. */ + CHECK("roi band s2 outer rc", + pipeline_common_roi_band(1280, 720, 0.4f, -30, 2, 0, &b) == 0); + CHECK("roi band s2 outer w", b.width == 896); + CHECK("roi band s2 outer x", b.x == 192); + CHECK("roi band s2 outer qp", b.qp == -15); + CHECK("roi band s2 inner rc", + pipeline_common_roi_band(1280, 720, 0.4f, -30, 2, 1, &b) == 0); + CHECK("roi band s2 inner w", b.width == 512); + CHECK("roi band s2 inner x", b.x == 384); + CHECK("roi band s2 inner qp", b.qp == -30); + + /* A positive delta keeps its sign through the taper — the centre + * gets SOFTER, which is the arm the device A/B inverted on. */ + CHECK("roi band positive taper rc", + pipeline_common_roi_band(1280, 720, 0.4f, 30, 2, 0, &b) == 0); + CHECK("roi band positive taper qp", b.qp == 15); + + /* Every edge 32-px aligned, at every step count, or the SDK + * refuses the rect (H.265 CTU constraint). */ + for (i = 0; i < 4; i++) { + if (pipeline_common_roi_band(1920, 1080, 0.35f, -12, + 4, i, &b) != 0) + continue; + CHECK("roi band aligned x", b.x % 32 == 0); + CHECK("roi band aligned w", b.width % 32 == 0); + CHECK("roi band aligned h", b.height % 32 == 0); + CHECK("roi band inside frame", b.x + b.width <= 1920); + } + + /* Skips, not silent zero-size regions: a rect that rounds away + * must be dropped rather than programmed, or the encoder gets an + * enabled region of zero area. */ + CHECK("roi band index negative", + pipeline_common_roi_band(1280, 720, 0.3f, -30, 1, -1, &b) != 0); + CHECK("roi band index past steps", + pipeline_common_roi_band(1280, 720, 0.3f, -30, 2, 2, &b) != 0); + CHECK("roi band null out", + pipeline_common_roi_band(1280, 720, 0.3f, -30, 1, 0, NULL) != 0); + CHECK("roi band width rounds away", + pipeline_common_roi_band(16, 720, 0.3f, -30, 1, 0, &b) != 0); + CHECK("roi band height rounds away", + pipeline_common_roi_band(1280, 16, 0.3f, -30, 1, 0, &b) != 0); + + /* Out-of-domain center_frac is clamped, not trusted. Before the + * clamp both of these returned SUCCESS with a garbage rect: + * frac>1 underflowed the unsigned (width-rw)/2 to ~2^31, and a + * negative frac is an out-of-range float-to-unsigned conversion + * (undefined behaviour) that produced a ~4 GB width. Asserted + * as "identical to the clamped value" rather than "not huge", so + * the test pins the behaviour and not just the absence of one + * symptom. */ + { + PipelineRoiBand hi, lo, ref_hi, ref_lo; + + CHECK("roi band frac>1 rc", + pipeline_common_roi_band(1280, 720, 1.5f, -30, + 1, 0, &hi) == 0); + CHECK("roi band frac 0.9 rc", + pipeline_common_roi_band(1280, 720, 0.9f, -30, + 1, 0, &ref_hi) == 0); + CHECK("roi band frac>1 clamps x", hi.x == ref_hi.x); + CHECK("roi band frac>1 clamps w", + hi.width == ref_hi.width); + CHECK("roi band frac>1 inside frame", + hi.x + hi.width <= 1280); + + CHECK("roi band frac<0 rc", + pipeline_common_roi_band(1280, 720, -2.0f, -30, + 1, 0, &lo) == 0); + CHECK("roi band frac 0.1 rc", + pipeline_common_roi_band(1280, 720, 0.1f, -30, + 1, 0, &ref_lo) == 0); + CHECK("roi band frac<0 clamps x", lo.x == ref_lo.x); + CHECK("roi band frac<0 clamps w", + lo.width == ref_lo.width); + CHECK("roi band frac<0 inside frame", + lo.x + lo.width <= 1280); + } + } + /* cleanup */ unlink(fixture_a); rmdir(tmp_dir); diff --git a/tests/test_venc_api.c b/tests/test_venc_api.c index 862347d7..a36d55d8 100644 --- a/tests/test_venc_api.c +++ b/tests/test_venc_api.c @@ -45,6 +45,8 @@ typedef struct { int apply_awb_rate_calls; uint32_t last_awb_rate; int apply_server_calls; + int apply_output_enabled_calls; + bool last_output_enabled; int apply_max_payload_calls; int apply_zoom_calls; int apply_isp_bin_calls; @@ -312,6 +314,24 @@ static int test_apply_awb_rate(uint32_t hz) return 0; } +static int test_apply_output_enabled(bool on) +{ + g_api_cb_state.apply_output_enabled_calls++; + g_api_cb_state.last_output_enabled = on; + return 0; +} + +/* Accepts the value but asks for a respawn -- the shape CV610's apply_server() + * uses for the ring transports, which cannot be switched in place but must + * still be settable through the API. */ +static int test_apply_server_needs_restart(const char *uri) +{ + (void)uri; + g_api_cb_state.apply_server_calls++; + venc_api_request_reinit(); + return 0; +} + static int test_apply_server(const char *uri) { g_api_cb_state.apply_server_calls++; @@ -528,6 +548,125 @@ static int test_field_support_by_backend(void) CHECK("rc mode unsupported cv610", venc_api_field_supported_for_backend("cv610", "video0.rc_mode") == 0); + /* The sidecar producer is compiled into the CV610 binary, so the port + * is a field the backend genuinely reads rather than one that accepts + * a value and does nothing. Checked on all three backends: the entry + * was added to CV610's allowlist, not to the shared gate. */ + CHECK("sidecar port supported cv610", + venc_api_field_supported_for_backend("cv610", + "outgoing.sidecar_port") == 1); + CHECK("sidecar port alias supported cv610", + venc_api_field_supported_for_backend("cv610", + "outgoing.sidecarPort") == 1); + CHECK("sidecar port supported star6e", + venc_api_field_supported_for_backend("star6e", + "outgoing.sidecar_port") == 1); + CHECK("sidecar port supported maruko", + venc_api_field_supported_for_backend("maruko", + "outgoing.sidecar_port") == 1); + /* ROI reaches CV610 through ss_mpi_venc_set_roi_attr(). fpv.noise_level + * is the control here and is deliberately NOT in the list: it proves the + * allowlist matches whole field names, so a prefix match on "fpv." would + * fail this block rather than quietly advertising a field the backend + * never reads. */ + CHECK("roi enabled supported cv610", + venc_api_field_supported_for_backend("cv610", + "fpv.roi_enabled") == 1); + CHECK("roi qp supported cv610", + venc_api_field_supported_for_backend("cv610", + "fpv.roi_qp") == 1); + CHECK("roi steps supported cv610", + venc_api_field_supported_for_backend("cv610", + "fpv.roi_steps") == 1); + CHECK("roi center supported cv610", + venc_api_field_supported_for_backend("cv610", + "fpv.roi_center") == 1); + CHECK("roi qp alias supported cv610", + venc_api_field_supported_for_backend("cv610", + "fpv.roiQp") == 1); + CHECK("roi center alias supported cv610", + venc_api_field_supported_for_backend("cv610", + "fpv.roiCenter") == 1); + CHECK("fpv noise level unsupported cv610", + venc_api_field_supported_for_backend("cv610", + "fpv.noise_level") == 0); + CHECK("roi qp supported star6e", + venc_api_field_supported_for_backend("star6e", + "fpv.roi_qp") == 1); + CHECK("roi qp supported maruko", + venc_api_field_supported_for_backend("maruko", + "fpv.roi_qp") == 1); + /* The two portable AE ceilings map onto CV610's exposure group with no + * unit conversion (us and 22.10 gain, both documented in the SDK header + * and confirmed on the live board). The floors and the AWB pair are the + * controls here: gain_min/shutter_min_us were not measured in this + * slice, and awb_mode/awb_ct cannot be honoured at all because the ISP + * has no Kelvin input. All four must stay unsupported on CV610 while + * remaining supported on the SigmaStar backends -- which is what + * distinguishes a per-field allowlist entry from an "isp." prefix. */ + CHECK("gain max supported cv610", + venc_api_field_supported_for_backend("cv610", + "isp.gain_max") == 1); + CHECK("shutter max supported cv610", + venc_api_field_supported_for_backend("cv610", + "isp.shutter_max_us") == 1); + CHECK("gain max alias supported cv610", + venc_api_field_supported_for_backend("cv610", + "isp.gainMax") == 1); + CHECK("shutter max alias supported cv610", + venc_api_field_supported_for_backend("cv610", + "isp.shutterMaxUs") == 1); + CHECK("gain min unsupported cv610", + venc_api_field_supported_for_backend("cv610", + "isp.gain_min") == 0); + CHECK("shutter min unsupported cv610", + venc_api_field_supported_for_backend("cv610", + "isp.shutter_min_us") == 0); + CHECK("awb mode unsupported cv610", + venc_api_field_supported_for_backend("cv610", + "isp.awb_mode") == 0); + CHECK("awb ct unsupported cv610", + venc_api_field_supported_for_backend("cv610", + "isp.awb_ct") == 0); + CHECK("gain max supported star6e", + venc_api_field_supported_for_backend("star6e", + "isp.gain_max") == 1); + CHECK("shutter max supported maruko", + venc_api_field_supported_for_backend("maruko", + "isp.shutter_max_us") == 1); + CHECK("awb mode supported star6e", + venc_api_field_supported_for_backend("star6e", + "isp.awb_mode") == 1); + CHECK("gain min supported maruko", + venc_api_field_supported_for_backend("maruko", + "isp.gain_min") == 1); + /* Sensor orientation reaches CV610 through the plugin's + * pfn_mirror_flip, the same place the SigmaStar backends apply it. + * Checked on all three so the entry lands in CV610's allowlist rather + * than the shared gate. */ + CHECK("image mirror supported cv610", + venc_api_field_supported_for_backend("cv610", + "image.mirror") == 1); + CHECK("image flip supported cv610", + venc_api_field_supported_for_backend("cv610", + "image.flip") == 1); + CHECK("image mirror supported star6e", + venc_api_field_supported_for_backend("star6e", + "image.mirror") == 1); + CHECK("image flip supported maruko", + venc_api_field_supported_for_backend("maruko", + "image.flip") == 1); + /* image.rotate stays UNSUPPORTED on cv610 even though the pair it + * decomposes into is now supported. The decomposition runs in + * venc_config's load_image(), on a file parse only, so a value that + * arrives through /api/v1/set is never decomposed and never read by + * any backend — advertising it would accept 90, persist it, raise + * reinit_pending and read back 0. A config file with rotate:180 + * still works; the field is unsupported because nothing reads ROTATE. + * Device-measured on .181 before this was reverted. */ + CHECK("image rotate unsupported cv610", + venc_api_field_supported_for_backend("cv610", + "image.rotate") == 0); /* Recording and snapshot arrived on CV610 in mirror mode: the main * channel's access unit is teed to file, and the JPEG channel is a * second bind target on the main stream's VPSS output. */ @@ -599,6 +738,161 @@ static int test_cv610_restart_only_mutability(void) CHECK("cv610 live fps not applied", g_api_cb_state.apply_fps_calls == 0); + /* image.mirror is newly SUPPORTED on cv610 but still restart-required: + * the sensor is programmed once at bring-up, so there is no live apply + * callback behind it. Advertising `supported` without this check is + * exactly how a dashboard ends up offering a control that 501s. */ + venc_config_defaults(&cfg); + reset_api_cb_state(); + cfg.image.mirror = false; + CHECK("cv610 live mirror handled", + apply_query_http_path(&cfg, "cv610", &cb, "/api/v1/live/set", + "image.mirror=true", &status, response, + sizeof(response)) == 0); + CHECK("cv610 live mirror rejected", status == 400); + CHECK("cv610 live mirror cfg untouched", cfg.image.mirror == false); + /* Same on star6e — this one is not a backend gate but the shared + * table's mutability, so both must reject. */ + venc_config_defaults(&cfg); + CHECK("star6e live mirror handled", + apply_query_http_path(&cfg, "star6e", &cb, "/api/v1/live/set", + "image.mirror=true", &status, response, + sizeof(response)) == 0); + CHECK("star6e live mirror rejected", status == 400); + + /* outgoing.server / outgoing.enabled LEFT the restart-only list in + * 0.77.0. Asserted as an ACCEPTED live set that reaches the callback, + * not merely as "not rejected": the failure this guards against is the + * ordering one, where the field is widened to `live` before a backend + * callback exists to honour it, and the write is then refused by + * live_group_supported_for_cfg() instead of the mutability gate. Both + * paths would show a 4xx, so only the callback count separates them. */ + venc_config_defaults(&cfg); + reset_api_cb_state(); + cb.apply_server = test_apply_server; + cb.apply_output_enabled = test_apply_output_enabled; + snprintf(cfg.outgoing.server, sizeof(cfg.outgoing.server), + "udp://10.0.0.1:5600"); + CHECK("cv610 live server handled", + apply_query_http_path(&cfg, "cv610", &cb, "/api/v1/live/set", + "outgoing.server=udp://10.0.0.2:5600", &status, response, + sizeof(response)) == 0); + CHECK("cv610 live server accepted", status == 200); + CHECK("cv610 live server reached the backend", + g_api_cb_state.apply_server_calls == 1); + CHECK("cv610 live server committed", + strcmp(cfg.outgoing.server, "udp://10.0.0.2:5600") == 0); + + /* Control: strip the callback and the SAME request must fail, which is + * what proves the accept above came from the widening rather than from + * the field having been live all along. */ + venc_config_defaults(&cfg); + reset_api_cb_state(); + cb.apply_server = NULL; + snprintf(cfg.outgoing.server, sizeof(cfg.outgoing.server), + "udp://10.0.0.1:5600"); + CHECK("cv610 live server w/o callback handled", + apply_query_http_path(&cfg, "cv610", &cb, "/api/v1/live/set", + "outgoing.server=udp://10.0.0.2:5600", &status, response, + sizeof(response)) == 0); + CHECK("cv610 live server w/o callback rejected", status != 200); + cb.apply_server = test_apply_server; + + venc_config_defaults(&cfg); + reset_api_cb_state(); + cfg.outgoing.enabled = true; + CHECK("cv610 live enabled handled", + apply_query_http_path(&cfg, "cv610", &cb, "/api/v1/live/set", + "outgoing.enabled=false", &status, response, + sizeof(response)) == 0); + CHECK("cv610 live enabled accepted", status == 200); + CHECK("cv610 live enabled reached the backend", + g_api_cb_state.apply_output_enabled_calls == 1); + CHECK("cv610 live enabled committed", cfg.outgoing.enabled == false); + + /* A live apply that requests a respawn must SAY so. Without this the + * caller is told the change took effect live while the craft is about + * to restart under it. */ + venc_config_defaults(&cfg); + reset_api_cb_state(); + venc_api_clear_reinit(); + cb.apply_server = test_apply_server_needs_restart; + snprintf(cfg.outgoing.server, sizeof(cfg.outgoing.server), + "udp://10.0.0.1:5600"); + CHECK("cv610 restart-class server handled", + apply_query_http_path(&cfg, "cv610", &cb, "/api/v1/live/set", + "outgoing.server=frame-shm://venc_frame", &status, + response, sizeof(response)) == 0); + CHECK("cv610 restart-class server accepted", status == 200); + CHECK("cv610 restart-class server committed", + strcmp(cfg.outgoing.server, "frame-shm://venc_frame") == 0); + CHECK("cv610 restart-class server reports reinit", + strstr(response, "\"reinit_pending\":true") != NULL); + /* Assert the response SHAPE too, not just the flag. A single-field set + * must answer the single form ("field": ...), never the batch form + * ("applied": [...]). Without this the suite is blind to the + * single_response / reinit_requested arguments being swapped at the + * call site -- which happened, and which both flag-only checks passed + * straight through because the two values correlate in these cases. */ + CHECK("cv610 restart-class server single-form response", + strstr(response, "\"field\":") != NULL && + strstr(response, "\"applied\":") == NULL); + + /* Control: the same field with a plain live apply must NOT claim a + * respawn, or the flag would be noise on every write. */ + venc_config_defaults(&cfg); + reset_api_cb_state(); + venc_api_clear_reinit(); + cb.apply_server = test_apply_server; + snprintf(cfg.outgoing.server, sizeof(cfg.outgoing.server), + "udp://10.0.0.1:5600"); + CHECK("cv610 live server handled 2", + apply_query_http_path(&cfg, "cv610", &cb, "/api/v1/live/set", + "outgoing.server=udp://10.0.0.3:5600", &status, + response, sizeof(response)) == 0); + CHECK("cv610 live server accepted 2", status == 200); + CHECK("cv610 live server reports no reinit", + strstr(response, "reinit_pending") == NULL); + CHECK("cv610 live server single-form response", + strstr(response, "\"field\":") != NULL && + strstr(response, "\"applied\":") == NULL); + + /* The BATCH path must report a requested respawn too. This had no test, + * which is exactly how it shipped reporting nothing while the single + * path had just been fixed to report it. */ + venc_config_defaults(&cfg); + reset_api_cb_state(); + venc_api_clear_reinit(); + cb.apply_server = test_apply_server_needs_restart; + cb.apply_bitrate = test_apply_bitrate; + snprintf(cfg.outgoing.server, sizeof(cfg.outgoing.server), + "udp://10.0.0.1:5600"); + CHECK("cv610 batch restart-class handled", + apply_query_http_path(&cfg, "cv610", &cb, "/api/v1/live/set", + "outgoing.server=frame-shm://venc_frame&video0.bitrate=9000", + &status, response, sizeof(response)) == 0); + CHECK("cv610 batch restart-class accepted", status == 200); + CHECK("cv610 batch is the batch form", + strstr(response, "\"applied\":") != NULL); + CHECK("cv610 batch reports reinit", + strstr(response, "\"reinit_pending\":true") != NULL); + + /* Control: a batch with no reinit-requesting apply must stay silent, or + * the flag is noise on every multi-field write. */ + venc_config_defaults(&cfg); + reset_api_cb_state(); + venc_api_clear_reinit(); + cb.apply_server = test_apply_server; + snprintf(cfg.outgoing.server, sizeof(cfg.outgoing.server), + "udp://10.0.0.1:5600"); + CHECK("cv610 batch live handled", + apply_query_http_path(&cfg, "cv610", &cb, "/api/v1/live/set", + "outgoing.server=udp://10.0.0.4:5600&video0.bitrate=9000", + &status, response, sizeof(response)) == 0); + CHECK("cv610 batch live accepted", status == 200); + CHECK("cv610 batch live reports no reinit", + strstr(response, "reinit_pending") == NULL); + /* Control 1: the same field on star6e is still a live apply, so the * rejection above is the backend gate and not a blanket fps block. */ venc_config_defaults(&cfg); @@ -1853,6 +2147,51 @@ static int test_live_set_isp_bin_no_callback_returns_501(void) * Asserts the surviving VALUE, not that the code took some path, so it fails * if the preserve is removed. The third case is the do-nothing control: the * fix must not invent a value where the operator set none. */ +static int test_roi_qp_range_is_pm20(void) +{ + int failures = 0; + VencConfig cfg; + static const int accept[] = { 0, -20, 20, -19, 19 }; + static const int reject[] = { -21, 21, -30, 30, -51, 51 }; + size_t i; + + /* +-20, not +-30. roiQp is a RELATIVE delta and H.265 caps QP at 51, + * so past 20 it stops being honoured at both ends -- and the negative + * end is expensive: CBR pays for the discount by raising base QP about + * 1:1, so once base + |roiQp| passes 51 the rate controller saturates. + * Measured on a CV610 bench: -30 pinned every frame at qp 51 and + * delivered 6x its bitrate target, -20 held it. + * + * Driven through venc_api_validate_loaded_config(), which is the gate + * that actually runs -- validate_field_cfg() is static, and asserting + * on a value assigned straight into the struct would test nothing. */ + for (i = 0; i < sizeof(accept) / sizeof(accept[0]); i++) { + char name[64]; + + venc_config_defaults(&cfg); + cfg.fpv.roi_qp = accept[i]; + snprintf(name, sizeof(name), "roi_qp %+d accepted", accept[i]); + CHECK(name, venc_api_validate_loaded_config(&cfg) == NULL); + } + for (i = 0; i < sizeof(reject) / sizeof(reject[0]); i++) { + char name[64]; + const char *err; + + venc_config_defaults(&cfg); + cfg.fpv.roi_qp = reject[i]; + err = venc_api_validate_loaded_config(&cfg); + snprintf(name, sizeof(name), "roi_qp %+d rejected", reject[i]); + CHECK(name, err != NULL); + /* The message must name the field, not just fail: this validator + * sweeps many keys and a bare non-NULL would also pass if some + * unrelated default started failing. */ + snprintf(name, sizeof(name), "roi_qp %+d names the field", + reject[i]); + CHECK(name, err != NULL && strstr(err, "roi_qp") != NULL); + } + return failures; +} + static int test_resilience_preset_preserves_intra_refresh_qp(void) { int failures = 0; @@ -2116,6 +2455,97 @@ static int test_capabilities_routes_track_callbacks(void) return failures; } +/* GET /api/v1/iq/export_bin serializes the live ISP to a PQTools .bin. + * + * The middle arm is the one that earns its keep. venc_httpd routes by + * first-match prefix and accepts '/' as a boundary, so "/api/v1/iq" would + * swallow "/api/v1/iq/export_bin" if it were ever registered first -- and the + * request would then answer 200 with the full ISP sweep from handle_iq + * instead of the path. That is a green-looking wrong answer no other test in + * this file would notice, so assert on the BODY, not just the status. */ +static int api_test_stub_export_bin_ok(const char *path) +{ + return path && *path ? 144774 : -1; +} + +static int api_test_stub_export_bin_fail(const char *path) +{ + (void)path; + return -1; +} + +static int test_iq_export_bin_route(void) +{ + int failures = 0; + VencConfig cfg; + VencApplyCallbacks cb; + int status = 0, fd; + char response[65536]; + static const char *const req = + "GET /api/v1/iq/export_bin HTTP/1.0\r\nHost: 127.0.0.1\r\n\r\n"; + size_t req_len = strlen(req); + int pass; + + for (pass = 0; pass < 3; pass++) { + size_t sent; + + venc_config_defaults(&cfg); + memset(&cb, 0, sizeof(cb)); + if (pass == 1) + cb.export_isp_bin = api_test_stub_export_bin_ok; + else if (pass == 2) + cb.export_isp_bin = api_test_stub_export_bin_fail; + + if (venc_api_register(&cfg, "cv610", &cb, NULL) != 0) { + CHECK("export_bin register", 0); + return failures; + } + if (ensure_api_test_server() != 0) { + CHECK("export_bin server", 0); + return failures; + } + fd = connect_api_test_socket(); + CHECK("export_bin connect", fd >= 0); + if (fd < 0) + return failures; + for (sent = 0; sent < req_len; ) { + ssize_t n = write(fd, req + sent, req_len - sent); + if (n < 0 && errno == EINTR) + continue; + if (n <= 0) { + close(fd); + CHECK("export_bin write", 0); + return failures; + } + sent += (size_t)n; + } + shutdown(fd, SHUT_WR); + CHECK("export_bin read", + read_http_response(fd, &status, response, sizeof(response)) == 0); + close(fd); + + if (pass == 0) { + CHECK("export_bin 501 without the callback", status == 501); + CHECK("export_bin 501 names not_implemented", + strstr(response, "not_implemented") != NULL); + } else if (pass == 1) { + CHECK("export_bin 200 with the callback", status == 200); + /* The route-shadowing detector: handle_iq would answer 200 too. */ + CHECK("export_bin body carries the path", + strstr(response, "\"path\":\"/tmp/isp_export.bin\"") != NULL); + CHECK("export_bin body carries the byte count", + strstr(response, "\"bytes\":144774") != NULL); + CHECK("export_bin body is not the IQ sweep", + strstr(response, "_schema") == NULL); + } else { + CHECK("export_bin 500 when the backend fails", status == 500); + CHECK("export_bin 500 points at the log", + strstr(response, "venc log") != NULL); + } + } + return failures; +} + static int test_capabilities_awb_fps_backend_gate(void) { int failures = 0; @@ -2314,10 +2744,12 @@ int test_venc_api(void) failures += test_live_apply_sees_already_committed_config(); failures += test_multi_set_url_decodes_values(); failures += test_set_rejects_malformed_percent_escape(); + failures += test_roi_qp_range_is_pm20(); failures += test_resilience_preset_preserves_intra_refresh_qp(); failures += test_capabilities_emits_ui(); failures += test_capabilities_awb_fps_backend_gate(); failures += test_capabilities_routes_track_callbacks(); + failures += test_iq_export_bin_route(); failures += test_snapshot_routes(); stop_api_test_server(); return failures; diff --git a/tests/test_venc_config.c b/tests/test_venc_config.c index 4ff1f6f5..ce9dc8b3 100644 --- a/tests/test_venc_config.c +++ b/tests/test_venc_config.c @@ -68,8 +68,10 @@ static int test_defaults(void) CHECK("defaults_allow_unix_encoder_stall", cfg.outgoing.allow_unix_encoder_stall == false); - CHECK("defaults_roi_on", cfg.fpv.roi_enabled == true); - CHECK("defaults_roi_qp", cfg.fpv.roi_qp == 0); + /* Off, but pre-loaded with a delta that bites when switched on -- the + * two halves of the shipped pair are asserted together on purpose. */ + CHECK("defaults_roi_off", cfg.fpv.roi_enabled == false); + CHECK("defaults_roi_qp", cfg.fpv.roi_qp == -20); CHECK("defaults_roi_steps", cfg.fpv.roi_steps == 2); CHECK("defaults_noise", cfg.fpv.noise_level == 0); @@ -345,6 +347,46 @@ static int test_load_full_json(void) CHECK("load_roi_qp", cfg.fpv.roi_qp == -18); CHECK("load_roi_steps", cfg.fpv.roi_steps == 2); CHECK("load_noise", cfg.fpv.noise_level == 5); + + /* A craft already carrying the old -30 must still BOOT, landing on the + * new bound rather than failing to load: beyond +-20 the delta exceeds + * what the encoder's QP range can honour, and on the negative side it + * saturates rate control and overruns the bitrate target. Clamped on + * the file path, rejected on the API path -- an operator typing -30 + * gets told, a config file that predates the bound gets migrated. */ + { + VencConfig old; + char *p2 = write_temp_json("{ \"fpv\": { \"roiQp\": -30 } }"); + + CHECK("roi_qp_tmpfile", p2 != NULL); + if (p2) { + venc_config_defaults(&old); + CHECK("roi_qp_old_file_loads", + venc_config_load(p2, &old) == 0); + CHECK("roi_qp_old_file_clamps", old.fpv.roi_qp == -20); + unlink(p2); free(p2); + } + p2 = write_temp_json("{ \"fpv\": { \"roiQp\": 30 } }"); + CHECK("roi_qp_tmpfile_pos", p2 != NULL); + if (p2) { + venc_config_defaults(&old); + CHECK("roi_qp_pos_file_loads", + venc_config_load(p2, &old) == 0); + CHECK("roi_qp_pos_file_clamps", old.fpv.roi_qp == 20); + unlink(p2); free(p2); + } + /* In-range values must survive untouched, or the clamp above + * would be indistinguishable from one that pins everything. */ + p2 = write_temp_json("{ \"fpv\": { \"roiQp\": -17 } }"); + CHECK("roi_qp_tmpfile_mid", p2 != NULL); + if (p2) { + venc_config_defaults(&old); + CHECK("roi_qp_mid_file_loads", + venc_config_load(p2, &old) == 0); + CHECK("roi_qp_mid_survives", old.fpv.roi_qp == -17); + unlink(p2); free(p2); + } + } /* scene_threshold/scene_holdoff live in video0 section */ return failures; @@ -878,6 +920,40 @@ static int test_rotate_180(void) CHECK("rotate180_mirror", cfg.image.mirror == true); CHECK("rotate180_flip", cfg.image.flip == true); + /* rotate is write-only: it decomposes and is then cleared. Left at 180 it + * re-decomposed on every parse and won permanently -- and because save() + * writes the field back, a craft that once carried rotate:180 could never + * turn image.mirror off again. Checking the decomposition alone cannot + * see that, which is why this assertion is here. */ + CHECK("rotate180_cleared_after_decompose", cfg.image.rotate == 0); + return failures; +} + +/* The failure the cleared rotate prevents, end to end: turn mirror off on a + * config that arrived with rotate:180, save, reload. Before the fix the value + * came back true, silently, across the restart the MUT_RESTART write had just + * asked for. */ +static int test_rotate_180_does_not_resurrect(void) +{ + int failures = 0; + const char *json = "{ \"image\": { \"rotate\": 180 } }"; + char *path = write_temp_json(json); + VencConfig cfg; + + venc_config_defaults(&cfg); + venc_config_load(path, &cfg); + CHECK("rotate_resurrect_loaded_mirror", cfg.image.mirror == true); + + cfg.image.mirror = false; + CHECK("rotate_resurrect_saved", venc_config_save(path, &cfg) == 0); + + venc_config_defaults(&cfg); + venc_config_load(path, &cfg); + CHECK("rotate_resurrect_mirror_stays_off", cfg.image.mirror == false); + CHECK("rotate_resurrect_flip_untouched", cfg.image.flip == true); + + unlink(path); + free(path); return failures; } @@ -910,6 +986,61 @@ static int test_sample_config_file(void) cfg.video0.bitrate == seeded.video0.bitrate); CHECK("sample_web_port_matches_seed", cfg.system.web_port == seeded.system.web_port); + /* roiQp is stated by BOTH shipped JSONs, so a bound change that + * moves the compiled seed and forgets them ships a default + * outside the range it documents. Read the RAW json, not the + * loaded struct: load_fpv() clamps into range, so a stale -25 + * loads as -20 and a comparison against the seed passes while + * the shipped file is still wrong. Mutation-checked -- against + * the loaded value, seeding -25 into either file produced no + * failure here at all. */ + static const char *const shipped[] = { + "config/waybeam.default.json", + "config/waybeam.default.maruko.json", + }; + size_t si; + + for (si = 0; si < sizeof(shipped) / sizeof(shipped[0]); si++) { + char name[96]; + char *text = NULL; + cJSON *root, *fpv, *qp; + long len; + FILE *jf = fopen(shipped[si], "rb"); + + snprintf(name, sizeof(name), "shipped_open_%zu", si); + CHECK(name, jf != NULL); + if (!jf) + continue; + fseek(jf, 0, SEEK_END); + len = ftell(jf); + fseek(jf, 0, SEEK_SET); + if (len > 0 && (text = malloc((size_t)len + 1)) != NULL) { + size_t got = fread(text, 1, (size_t)len, jf); + text[got] = '\0'; + } + fclose(jf); + snprintf(name, sizeof(name), "shipped_read_%zu", si); + CHECK(name, text != NULL); + if (!text) + continue; + root = cJSON_Parse(text); + free(text); + snprintf(name, sizeof(name), "shipped_parse_%zu", si); + CHECK(name, root != NULL); + if (!root) + continue; + fpv = cJSON_GetObjectItem(root, "fpv"); + qp = fpv ? cJSON_GetObjectItem(fpv, "roiQp") : NULL; + snprintf(name, sizeof(name), "shipped_roi_qp_present_%zu", + si); + CHECK(name, qp != NULL && cJSON_IsNumber(qp)); + snprintf(name, sizeof(name), + "shipped_roi_qp_matches_seed_%zu", si); + CHECK(name, qp != NULL && cJSON_IsNumber(qp) && + (int)cJSON_GetNumberValue(qp) == + seeded.fpv.roi_qp); + cJSON_Delete(root); + } } CHECK("sample_enabled", cfg.outgoing.enabled == false); CHECK("sample_server", strcmp(cfg.outgoing.server, "") == 0); @@ -1353,6 +1484,7 @@ int test_venc_config(void) failures += test_framing_presets(); failures += test_resolution_aliases(); failures += test_rotate_180(); + failures += test_rotate_180_does_not_resurrect(); failures += test_sample_config_file(); failures += test_audio_config(); failures += test_audio_volume_clamping(); diff --git a/web/dashboard.html b/web/dashboard.html index a6607362..4f151734 100644 --- a/web/dashboard.html +++ b/web/dashboard.html @@ -437,6 +437,7 @@

ISP & Image Quality

GET/api/v1/iq/set?param=valueSet a single IQ parameter. Dot-notation for sub-fields (e.g. colortrans.y_ofst=200){"ok":true,"data":{"param":"contrast","value":60}} +GET/api/v1/iq/export_binExport the live ISP state to a PQTools .bin at /tmp/isp_export.bin. CV610 only{"ok":true,"data":{"path":"/tmp/isp_export.bin","bytes":144774}} POST/api/v1/iq/importBatch-import IQ parameters from JSON (output of /api/v1/iq). Star6E only{"ok":true,"data":{"imported":true}} GET/metrics/ispRaw ISP metrics as Prometheus-style plain textvenc_exposure_us 8333\ @@ -652,7 +653,7 @@

Quer 'fpv.roiEnabled':'Enable ROI (Region of Interest) \u2014 allocate more bits to center of frame. Applied live', -'fpv.roiQp':'ROI QP adjustment (-30 to +30). Negative = higher quality in center. 0 = disabled. Applied live', +'fpv.roiQp':'ROI QP adjustment (-20 to +20). Negative = higher quality in center. 0 = disabled. Applied live', 'fpv.roiSteps':'Number of horizontal ROI bands (1-4). More steps = smoother gradient. Applied live',