From 4972e8510b8c596a4a60fe39aa93961b8e25ad28 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Sat, 31 Oct 2026 10:34:57 -0400 Subject: [PATCH] receipt-ledger: bill what the work spends; live-metering: a receipt of version 2 prices bytes out A job's output receipt is of an object its served hop states it delivered (route-record version 2's `outputs`, by content hash), once, or the source is refused `output_not_delivered`; under tariff version 4 a record of version 1 holds its outputs to none. Routing figures (cost, expected cost and time, failures) are never charges: a line bills the billed attempt at the tariff's price. The room-session receipt's version 2 states `bytes_out`, the bytes its hops sent the session's sessions from their ledgers, prices them per 10^9 bytes in its tariff and counts them in each grant's consumption and funds. Tariff and invoice version 4 bill a room's bytes out, a package's work once per run that made it (a routed job of `package.build`, per job and per work unit, its receipt the product each run cites, a replayed run refused), a package's storage by byte-days for each invoice period it is held through, read from the chain, and state every hop's energy, the hops not billed in a scope of their own. The ledger corpus adds jobs routed under the route record's version 2 and version 4's chain with their controls; the metering corpus adds receipts of version 2; both second implementations read the new versions and catch every new rule. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 96 ++ wai/SPEC.md | 6 +- wai/extensions/live-metering.md | 47 +- wai/extensions/receipt-ledger.md | 257 +++- wai/live-conformance/ledger/README.md | 24 +- wai/live-conformance/ledger/vectors.json | 1352 ++++++++++++++++- wai/live-conformance/live_metering_verify.py | 58 +- wai/live-conformance/metering/README.md | 17 +- wai/live-conformance/metering/vectors.json | 525 +++++++ wai/live-conformance/receipt_ledger_verify.py | 237 ++- wai/wai-ledger/src/ledger.rs | 24 +- wai/wai-ledger/src/tests.rs | 30 +- wai/wai-rs/src/c2pa_emit.rs | 1 + wai/wai-rs/src/live_metering.rs | 130 +- wai/wai-rs/src/live_metering/corpus.rs | 81 +- wai/wai-rs/src/receipt_ledger.rs | 421 +++-- wai/wai-rs/src/receipt_ledger/corpus.rs | 195 ++- wai/wai-rs/src/route_record/corpus.rs | 85 ++ wai/wai-rs/tests/live_metering.rs | 36 + wai/wai-rs/tests/receipt_ledger.rs | 93 ++ 20 files changed, 3441 insertions(+), 274 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index 8db49afdf..de95a432c 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -6,6 +6,102 @@ wire format may change and such changes are recorded here. ## Unreleased +### The receipt ledger bills what the work spends: bytes out, a package's work per run and its storage, every hop's energy, the output its hop delivered + +- **A job's output is the object its hop delivered** ([extensions/receipt-ledger.md](extensions/receipt-ledger.md) + §5.1): an output's object is its `codestream`, named by its content hash, and where the job's route record states + what its served attempt delivered (route-record version 2, `outputs`), each output receipt a job source gives is of + one of those objects, once, or the source is refused **`output_not_delivered`**, at `outputs` and its index. A line + bills a job's subpixels from its output receipts, so a receipt of an object the hop did not deliver billed subpixels + nobody delivered for that job, and one given twice billed them twice. The route record binds the hop's receipt to + its outputs (#552); this binds each output receipt to the same outputs. It holds under tariff versions 3 and 4; under + version 4 a record of version 1, which states no outputs, holds its outputs to none, and under version 3 its outputs + are read as before. +- **Routing figures are never charges** (§5.1): a route record's `cost`, `energy`, `expected_cost`, + `expected_ttfb_ms`, and its price book's `price` and `failures`, are the router's figures for choosing an endpoint; + no line reads them, and a job line bills its billed attempt alone, at the tariff's price the buyer signed. Two + controls hold it: a failed hop counted as a job, and a job line at the router's list price, neither recomputes. +- **The room-session receipt, version 2** ([extensions/live-metering.md](extensions/live-metering.md) §4.1, §4.4, + §4.6): a sixteenth unit, `bytes_out`, the payload bytes the hops sent the session's sessions, summed from their + ledgers' `bytes_out` (§3.4), and a fourteenth tariff price, per 10^9 of those bytes. What delivering a session costs + scales with the bytes carried as well as with the time it ran. A grant's consumption entry states its `bytes_out` + (206 bytes), and its funds are ⌈(1000 × *N* + `bytes_out` × the price) / 10^15⌉ minor units, the time and the bytes + rounded up once together. The ledgers count exactly the sessions under a grant or none, so the grants' bytes out sum + to the receipt's; a hop link's bytes, which no ledger holds, are carriage between relays and are not counted. A + receipt of version 1 reads, verifies and prices exactly as before; a version-1 reader cannot read version 2. +- **Tariff version 4** (receipt-ledger §4.7; `WLT1`, `WLI1` with version byte 4) prices three more things by what + spending on them scales with. A **room's bytes out**: a fourteenth room price, a room line of unit `bytes_out` from a + receipt of version 2, and a receipt that states a tariff states all fourteen prices (one of version 1 states no + price of bytes, read as 0, so its funds conflict with a tariff that prices bytes). A **package's work, per run**: + packaging is deterministic, so a package made again (a customer asking for the work done and measured again) gives + the same receipt from a run that did the work again, and every version before billed a package once per receipt and + refused it. In version 4 a package has a job's shape: the run that made it, a routed job of `package.build` whose + output is the package (its receipt's text the object its hop delivered, verified against its indexes), is the work, + billed once per run at the tariff's job prices per job and per **work unit**, a new job unit, the package receipt's + `work_units` (packaging §9.1), the work its figure is expressed against; the package receipt is the product, cited + by each run and billed once by none; a run replayed under a new route record is refused (`record_rebilled`, + `record_duplicate`). The run's energy is its hop's figure, and the receipt's own figure, the same work's, is not + stated again (scope `packaging` is empty in version 4). A **package's storage by byte-time**: the tariff's one package + price is per 10^9 byte-days; a `package` source is the product held and bills its storage alone: one the previous + invoice lists is held through the invoice's whole period, written by its start, and is billed ⌊Σ `stored_bytes` × + (`end` − `start`) / 86 400 000 000⌋ byte-days and its receipt listed again; the invoice that first lists a package + bills it no storage, since no record shows when in that period it was written. The period is read from the chain's + own invoices, which the seller signs and the buyer holds. The invoice states a sixth unmetered count, so a version-3 + reader cannot read it. +- **Every hop's energy** (§6.6): under version 4 an invoice states the energy of every attempt of its jobs, the ones + not billed (a failed hop, a hop that served past the deadline) in a scope of their own, `unbilled_hops`, beside the + billed hops' and never summed with them; such a hop's figure that no row can state is `job_figure_invalid`. A failed + hop spent energy and delivered nothing; before, no row stated it, so the jobs' energy was less than their hops + spent. No line reads the scope: the buyer is still not billed for a failed hop. +- **Jobs routed under the route record's version 2 in the ledger corpus**: an encode, a failover whose failed hop was + metered, a decode, a hop past the deadline, three hops that failed and a failover whose failed hop's figure states no + class, routed by the route corpus's router under its price book of version 2, per operation with measured failures, + each served hop stating its outputs; and two runs of `package.build` making one package, under a price book of + version 2 of their own, and a replay of the first. `routes/vectors.json` is unchanged (`route_record::corpus` adds + the helpers that route them for the ledger). +- **The corpora.** `live-conformance/metering/vectors.json` adds five vectors (a receipt of version 2 with its bytes + priced; bytes out restated, bytes left out of the consumption, bytes priced with no tariff, a receipt of version 3) + and keeps every other byte for byte; `live_metering_verify.py` reads version 2 and requires its new mutated copies to + fail. `live-conformance/ledger/vectors.json` adds twenty vectors (version-2-routed jobs under version 3 and + their two controls; version 4's chain of two invoices and its controls); `receipt_ledger_verify.py` reads version 4, + holds outputs to their content hashes with `claim-conformance/_blake3.py`, requires the new mutated copies to fail, + and drops seven more of its checks (`output-delivered`, `unbilled-hops`, `storage-held`, `package-again`, + `run-work`, `bytes-out`, `conflict-bytes`). The ledger service (`wai/wai-ledger`) reads a source by its tariff's + version and, under version 4, bills each package the last invoice holds again for its storage, and a package made + again by a new run. +- **Breaking:** `api:rust:wai::live_metering::SessionReceipt::version`: a receipt states its version, 1 or 2. A struct + literal adds `version: live_metering::RECORD_VERSION`. +- **Breaking:** `api:rust:wai::live_metering::Units::bytes_out`: version 2's bytes out, 0 in version 1. +- **Breaking:** `api:rust:wai::live_metering::Tariff::bytes`: version 2's price per 10^9 bytes out, 0 in version 1. +- **Breaking:** `api:rust:wai::live_metering::Consumption::version`: an entry states its receipt's version. +- **Breaking:** `api:rust:wai::live_metering::Consumption::bytes_out`: version 2's bytes out of a grant. +- **Breaking:** `api:rust:wai::live_metering::Consumption::encode`: returns a `Vec`, 198 bytes in version 1 and + 206 in version 2. +- **Breaking:** `api:rust:wai::live_metering::Computed::version`: the version of the receipt it was computed for. +- **Breaking:** `api:rust:wai::live_metering::SessionPlan::version`: the version of the receipt a plan aggregates into. +- **Breaking:** `api:rust:wai::receipt_ledger::ROOM_PRICES`: 14, a tariff's room prices with version 4's price of bytes + out; `ROOM_PRICES_1` is the 13 of versions 1 to 3. +- **Breaking:** `api:rust:wai::receipt_ledger::Tariff::room`: fourteen prices, the fourteenth written in version 4 and + read as 0 in versions 1 to 3. +- **Breaking:** `api:rust:wai::receipt_ledger::Invoice::unmetered`: six counts, scope 6 (`unbilled_hops`) last; an + invoice writes and reads its version's. +- **Breaking:** `api:rust:wai::receipt_ledger::Computed::unmetered`: the same six. +- **Breaking:** `api:rust:wai::receipt_ledger::JobFacts::packages`: under version 4, a job's output packages, each its + receipt hash and work units. +- **Breaking:** `api:rust:wai::receipt_ledger::JOB_UNITS`: three names, `work_units` the third (version 4). +- **Breaking:** `api:rust:wai::receipt_ledger::Tariff::package`: in version 4 only the third, per 10^9 byte-days, is + written and read; the first two are 0. +- **Breaking:** `api:rust:wai::receipt_ledger::PackageFacts::held_us`: under version 4, the period a package is held + through, `None` when first billed. +- **Breaking:** `api:rust:wai::receipt_ledger::JobFacts::unbilled`: under version 4, the figures of a job's attempts + that are not billed. +- **Breaking:** `api:rust:wai::receipt_ledger::Reason::OutputNotDelivered`: a job's output receipt of an object its + served hop did not deliver, or given twice (§5.1); a match over the reasons adds it. +- **Breaking:** `api:rust:wai::receipt_ledger::Reason::ALL`: the codes of §10, `output_not_delivered` among them. +- **Breaking:** `record:corpus:wai/live-conformance/ledger/vectors.json`: the control `invoice_version` gives an + invoice of version 5, since version 4 is now defined, and is refused `unknown_version` as before; every other vector + keeps its outcome, and the new vectors are added. + ### The receipt ledger prices media jobs per operation, and bills the work done - **Tariff version 3** ([extensions/receipt-ledger.md](extensions/receipt-ledger.md) §4.6): each job price diff --git a/wai/SPEC.md b/wai/SPEC.md index 44655dda8..384c34f26 100644 --- a/wai/SPEC.md +++ b/wai/SPEC.md @@ -1073,7 +1073,8 @@ object or per viewer, so its size is bounded by what the room published, whateve The room authority, or a key its origin's key log lists with `live/meter`, signs the room-session receipt, `WMR1`, naming the records, the takes and the composition receipts it aggregates and stating publisher-seconds, subscriber-seconds by layer class, composition-seconds, events sent -and delivered and recorded-seconds, every hop's joules with its class and a total per class, +and delivered and recorded-seconds (and, in a receipt of version 2, the bytes its hops sent the +session's sessions, priced per byte), every hop's joules with its class and a total per class, never one across classes, and each grant's consumption against its joule and funds ceilings, a hop's joules attributed to grants by the bytes each moved, an accounting convention and not a saving any grant made; a verifier recomputes every number from the records. The reference relay @@ -1527,7 +1528,8 @@ And for **invoicing from receipts**, invoice lines a customer can recompute from `wai.delivery.ledger`: a seller and a buyer both sign a tariff, `WLT1`, one currency and one price for every unit the records state (a room session's publisher-, subscriber-, composition- and recorded-seconds and its events; the acknowledged bytes of each object class, carried over MOQT or -HTTP; a package's packages, entries and stored bytes; an ad decision's impressions, presented under +HTTP; a package's packages, entries and stored bytes, or, in a tariff of version 4, its work units +and its stored bytes by the days they are held, beside a room's bytes out; an ad decision's impressions, presented under the players' claims or billable on beacons, or presented in a stream another party stitched), and the scope of rooms, delivering parties, packagers, and ad deciders and stitchers it bills. Each source is verified by the extension that defines it, a room-session receipt or a settlement statement that states a tariff must state this one, and the seller signs an diff --git a/wai/extensions/live-metering.md b/wai/extensions/live-metering.md index a0ee1a26c..b2f9fc1fd 100644 --- a/wai/extensions/live-metering.md +++ b/wai/extensions/live-metering.md @@ -12,8 +12,9 @@ > the **room-session receipt**, `WMR1`, which names the per-hop records, the takes and the > composition receipts it aggregates, and states the session's units (publisher-seconds, > subscriber-seconds by layer class, composition-seconds, events sent and delivered, -> recorded-seconds), the joules of every hop with its class, a total per class and never -> one across classes, and each grant's consumption against its joule and funds ceilings. +> recorded-seconds, and in version 2 the bytes the hops sent), the joules of every hop with +> its class, a total per class and never one across classes, and each grant's consumption +> against its joule and funds ceilings. > Every number in the receipt is recomputed by its verifier from the records it names. > Clients add quality-of-experience observations, CMCD version 2 Event-mode reports carried > on the CMCD event timeline, of which only an aggregate over enough sessions enters the @@ -319,7 +320,7 @@ When the session is over, the room authority, or a metering key (§4.3), signs t | field | size | meaning | |---|---|---| | `magic` | 4 | `WMR1` (ASCII) | -| `version` | 1 | 1 in this revision | +| `version` | 1 | 1; 2 for a receipt that states the bytes its hops sent and prices them (§4.4, §4.6) | | `room` | 32 | the room id | | `signer` | 32 | the key that signs the receipt | | `start`, `end` | 8 each | u64: the room session, [`start`, `end`) | @@ -327,14 +328,19 @@ When the session is over, the room authority, or a metering key (§4.3), signs t | `takes` | 1 + 32 × *k* | a u8 count, then the digest of each take manifest it aggregates ([capture-binding](capture-binding.md) §7.1), strictly ascending | | `compose` | 4 + 32 | u32: the composition receipts it aggregates ([live-compose](live-compose.md) §8); then their **list digest**, SHA-256 over their digests in ascending order, concatenated (32 zero bytes when none) | | `qoe` | 4 + 32 | u32: the session logs of QoE observations it aggregates (§6); then the SHA-256 of the logs document (32 zero bytes when none) | -| `units` | 120 | fifteen u64: `publisher_us`, `subscriber_us` for layer classes 0 to 8, `sessions`, `composition_us`, `events_sent`, `events_delivered`, `recorded_us` (§4.4) | +| `units` | 120, in version 2 128 | fifteen u64: `publisher_us`, `subscriber_us` for layer classes 0 to 8, `sessions`, `composition_us`, `events_sent`, `events_delivered`, `recorded_us` (§4.4); in version 2 a sixteenth, `bytes_out` | | `unmetered` | 1 | u8: the hop entries whose figure is the unmetered marker | | `totals` | 1 + 13 × *m* | a u8 count *m*, then for each acquisition class among the hop entries: `tag` (u8), `figures` (u32, the hop entries of that class) and `joules` (u64, their sum), in strictly ascending order of `tag` (§4.5) | -| `tariff` | 3 + 52 | `currency` (3; zero for no tariff), then thirteen u32 prices in millionths of a minor unit: per second of `publisher_us`, of `subscriber_us` for each layer class 0 to 8, of `composition_us` and of `recorded_us`, and per event sent (§4.6) | +| `tariff` | 3 + 52, in version 2 3 + 56 | `currency` (3; zero for no tariff), then thirteen u32 prices in millionths of a minor unit: per second of `publisher_us`, of `subscriber_us` for each layer class 0 to 8, of `composition_us` and of `recorded_us`, and per event sent (§4.6); in version 2 a fourteenth, per 10^9 bytes of `bytes_out` | | `ceilings` | 4 + 32 + 4 + 33 × *p* | u32: the grants of the session (§4.6); the **consumption root** (32); then a u32 count *p* and each grant past a ceiling: `grant` (32) and `flags` (u8: bit 0 past its joule ceiling, bit 1 past its funds ceiling), in strictly ascending order of `grant` | | `qoe_cell` | 49 | the QoE aggregate (§4.7): `suppressed` (u8), `started`, `start_failed`, `exit_before_start` (u32 each), `stalls`, `stall_ms`, `engaged_ms` (u64 each), `vst_count` (u32), `vst_ms` (u64) | | `sig` | 64 | §4.2 | +Version 2 is version 1's fields in the same order, with `units` and `tariff` each one figure +longer, the figure last. A reader of version 1 cannot read a receipt of version 2, and a +receipt of version 1 reads, verifies and prices exactly as before: version 2 is a version of +its own, as a per-hop record's version 2 is (§3.1). + ### 4.2 Digest, signature and rules The **digest** of a receipt is SHA-256 over its bytes before `sig`; its **signature** is @@ -351,8 +357,8 @@ other way to state. It refuses as `session_invalid` a receipt that breaks any of 2 or 3, and its class reads and meets §3.6's `energy_invalid` rules; each total's `tag` is 2 to 5 and its `figures` above 0; - `compose`'s digest is zero exactly when its count is, and so is `qoe`'s; -- with no tariff (`currency` zero) every price is 0; otherwise `currency` is three capitals - `A`–`Z`; +- with no tariff (`currency` zero) every price is 0, the price of bytes among them; otherwise + `currency` is three capitals `A`–`Z`; - each past grant's `flags` is 1, 2 or 3; - `suppressed` is 0 or 1, and with 1 every other field of the cell is 0. @@ -408,6 +414,15 @@ Every unit is an integer of room-clock microseconds or a count, over the room se + *o*, `end` + *o*), each chunk's capture range on the room clock, within the session. A take with no held commitment records nothing. What a device captured and did not commit while capturing is not counted. +- **`bytes_out`**, in a receipt of version 2: the sum over the hop records of their ledger + entries' `bytes_out` (§3.4), the payload bytes the hops sent the room's sessions. What + delivering a session costs scales with the bytes carried to it as well as with the time it + ran: a viewer of a high layer and one of a low layer subscribe for the same seconds and are + sent different bytes. The ledgers count exactly the sessions that ran under a grant or + under none, so the sum of the grants' `bytes_out` (§4.6) is the receipt's. A hop link's + bytes are in the relays' track entries and in no ledger (§3.10): carriage between the + relays of a room is how its operator built the room, not a session's delivery, and is not + counted here. The units do not sum the DVR figures of version 2 records (§3.9) in this revision. @@ -458,11 +473,16 @@ and every grant that was in effect for a present principal at some instant of th its span is largely what running the hop costs, not a cost per byte, so a grant that moves fewer bytes is attributed a smaller share of the same figure and does not lower the hop's energy by that share, and nothing here states what the network between hops spent; +- `bytes_out`, in a receipt of version 2: the sum of its ledger entries' `bytes_out` over + the hop records; - **funds**, where the tariff's `currency` is the grant's: ⌈*N* / 10^12⌉ minor units of it, with *N* = `publisher_us` × *p*pub + Σ*c* `subscriber_us`[*c*] × *p*sub,*c* + `composition_us` × *p*comp + `recorded_us` × *p*rec + `events_sent` × *p*ev × 10^6, at most 2^64 − 2; 2^64 − 1 - states that no funds were computed (no tariff, or another currency). + states that no funds were computed (no tariff, or another currency). In a receipt of + version 2 they are ⌈(1000 × *N* + `bytes_out` × *p*bytes) / 10^15⌉ minor units, + *N* in 10^-12 of a minor unit and *p*bytes per 10^9 bytes, so the time and the + bytes are rounded up once, together; with a price of bytes of 0 they are version 1's. Its verdicts, against its ceilings, each the first row of the table below that applies, taken in the order none, past, unmetered, partial, within for the joule ceiling, and none, @@ -486,7 +506,8 @@ A grant's **consumption entry** is 198 bytes: `grant` (32), `joules_ceiling` (8) `funds_ceiling` (8), `currency` (3), `publisher_us` (8), `subscriber_us` (9 × 8), `composition_us` (8), `recorded_us` (8), `events_sent` (8), the attributed joules of tags 2, 3, 4 and 5 (4 × 8), `unmetered` (u8: 1 when its share is unmetered at some hop), `funds` (8), -and the joule and funds verdicts (u8 each). Its leaf is SHA-256 over the 25 bytes +and the joule and funds verdicts (u8 each). In a receipt of version 2 it is 206 bytes: its +`bytes_out` (8) follows `events_sent`. Its leaf is SHA-256 over the 25 bytes `wai:metering-consumption` (ASCII) and 0x01, followed by the entry; the **consumption root** is the root of the grants' leaves in order, and the receipt's `ceilings` states their number, the root and every grant with a verdict of 2. Every principal can be shown its own entry with @@ -802,7 +823,8 @@ the reference relay signed in its test, `relay-record.wmh` with its ledger receipt and what it names, with the outcome §5.4 gives them: - **Accepted**: a lesson room with a relay, a compositor and two recorded takes, its receipt - whole; mixed acquisition classes (a relay's counter reading, a compositor's model, an ingest + whole; the same session in a receipt of version 2, its bytes out summed from the ledgers, + by grant too, and priced in each grant's funds; mixed acquisition classes (a relay's counter reading, a compositor's model, an ingest gateway's estimate) with one total per class; a viewer's grant past its joule ceiling and another past its funds ceiling, named in the receipt; a large audience, ten thousand subscriber sessions whose relay record is the size of the lesson's, with a QoE cell of more @@ -813,7 +835,10 @@ receipt and what it names, with the outcome §5.4 gives them: codes a receipt, a record, a take, a composition receipt and a room raise from the extensions this one reads; among them version 2 records whose DVR figures exceed their entries' (`record_invalid`) or whose length is past B₂(*M*) (`record_too_large`), and a - record of version 3 (`unknown_version`). + record of version 3 (`unknown_version`); and receipts of version 2 stating a byte more than + the ledgers (`unit_mismatch`), whose grants' entries leave their bytes out + (`ceiling_mismatch`), or pricing bytes with no tariff (`session_invalid`), and a receipt of + version 3 (`unknown_version`). A conforming verifier gives every vector the outcome, the reason, the place and the facts the corpus states. `wai_live_metering_vectors verify` and the test `tests/live_metering.rs` diff --git a/wai/extensions/receipt-ledger.md b/wai/extensions/receipt-ledger.md index 3810907d5..47711ccf2 100644 --- a/wai/extensions/receipt-ledger.md +++ b/wai/extensions/receipt-ledger.md @@ -26,7 +26,14 @@ > receipt of its output, in the units those receipts state. A tariff of version 3 prices a > job by its capability **and its operation** (§4.6), since an encode and a decode spend > different energy, and bills a job's **work** once, its route record and its hops' receipts, -> its output's receipt being the evidence a re-run may cite again (§6.9). No new transport, no payment +> its output's receipt being the evidence a re-run may cite again (§6.9). A tariff of version 4 +> also bills what the rest of the work spends (§4.7): a room's bytes out, which a room-session +> receipt of version 2 states (live-metering §4.4), at a price per 10^9 bytes; a package's work +> once per run that made it, by the work units it states, its receipt the product each run +> cites; a package's storage by byte-days for each period it is held; and its invoices state +> every hop's energy, the hops not billed in a scope of their own (§6.6). Whatever the version, +> a job's output receipt is of an object its served hop states it delivered, where its route +> record states it (§5.1), and a route record's routing figures are never charges. No new transport, no payment > and no tax: an invoice is the recomputable figures a payment rests on. The reference implementation is the > `receipt_ledger` module of `wai-rs` (feature `receipt_ledger`) and the service > `wai/wai-ledger`; the corpus is [`live-conformance/ledger/`](../live-conformance/ledger/), @@ -87,8 +94,9 @@ a buyer's rooms, deliveries, packages and ads together. Three rules keep every f consistent with what the records say: 1. **A record that states a tariff states this one.** A room-session receipt of a source either - states no tariff (currency zero) or the tariff's currency and its thirteen room prices, in - live-metering §4.1's order; a settlement statement either states no tariff or the tariff's + states no tariff (currency zero) or the tariff's currency and its room prices, in + live-metering §4.1's order: the thirteen, and the price of bytes out, which a receipt of + version 1 and a tariff of versions 1 to 3 do not state and read as 0; a settlement statement either states no tariff or the tariff's currency and its four delivery prices, in settlement §7.1's order. A record under another tariff is refused `tariff_conflict` (§7.2 step 5): the funds its grants were held to, or the amount its party stated, were computed at other prices, and an invoice at these prices would @@ -98,9 +106,10 @@ consistent with what the records say: statement's line. A statement's own amount rounds once per payer; the invoice rounds once per party and class, so the two can differ by less than one millionth of a minor unit per payer line, and the delivery report (§8.2) states both. -3. **Units are never converted.** A room is billed in its own units, a delivery in bytes, a - package in packages, entries and stored bytes, an ad in impressions, a job in jobs or in - the subpixels its output's receipt states (§4.5). No line turns one unit +3. **Units are never converted.** A room is billed in its own units (in version 4, its bytes + out too), a delivery in bytes, a package in packages, entries and stored bytes (in version + 4, in byte-days held), an ad in impressions, a job in jobs or in the subpixels its output's + receipt states (§4.5), and in version 4 in the work units of the packages it made. No line turns one unit into another, and no line is priced from joules: the energy of an invoice is stated beside its lines (§6.6), per class, and is not an amount. @@ -115,16 +124,16 @@ records recomputes all three. | field | size | meaning | |---|---|---| | `magic` | 4 | `WLT1` (ASCII) | -| `version` | 1 | 1; 2 for a tariff that prices jobs (§4.5); 3 for one that prices them per operation and bills their work (§4.6, §6.9) | +| `version` | 1 | 1; 2 for a tariff that prices jobs (§4.5); 3 for one that prices them per operation and bills their work (§4.6, §6.9); 4 for one that also prices bytes out, a package's work and its storage by byte-time (§4.7) | | `seller` | 32 | the seller's key, which signs the tariff and every invoice under it | | `buyer` | 32 | the buyer's key, which accepts the tariff by signing it | | `start`, `end` | 8 each | u64: the period the tariff is good for | | `currency` | 3 | three capitals `A`–`Z` (ISO 4217) | -| `room` | 52 | thirteen u32: millionths of a minor unit per second of `publisher_us`, of `subscriber_us` for each layer class 0 to 8, of `composition_us` and of `recorded_us`, and per event sent (live-metering §4.1's order) | +| `room` | 52, in version 4 56 | thirteen u32: millionths of a minor unit per second of `publisher_us`, of `subscriber_us` for each layer class 0 to 8, of `composition_us` and of `recorded_us`, and per event sent (live-metering §4.1's order); in version 4 a fourteenth, per 10^9 bytes of `bytes_out` (§4.7) | | `delivery` | 32 | four u64: millionths of a minor unit per 10^9 acknowledged bytes of each object class, in class order (settlement §7.1) | -| `package` | 24 | three u64: millionths of a minor unit per package receipt, per entry, and per 10^9 stored bytes | +| `package` | 24, in version 4 8 | three u64: millionths of a minor unit per package receipt, per entry, and per 10^9 stored bytes; in version 4 one, per 10^9 byte-days held (§4.7) | | `ads` | 16 | two u64: millionths of a minor unit per presented impression, and per billable impression | -| `job` | 2 + Σ (18 + *c*), in version 3 2 + Σ (19 + *c* + *o*) | versions 2 and 3, absent in version 1: a u16 count *j*, then each job price (§4.5, §4.6): `cap_len` (u8), `capability` (`cap_len` bytes), in version 3 `op_len` (u8) and `operation` (`op_len` bytes), then `unit` (u8), `divisor` (u64) and `price` (u64) | +| `job` | 2 + Σ (18 + *c*), in versions 3 and 4 2 + Σ (19 + *c* + *o*) | versions 2 to 4, absent in version 1: a u16 count *j*, then each job price (§4.5, §4.6): `cap_len` (u8), `capability` (`cap_len` bytes), in versions 3 and 4 `op_len` (u8) and `operation` (`op_len` bytes), then `unit` (u8), `divisor` (u64) and `price` (u64) | | `scope` | 2 + 33 × *n* | a u16 count *n*, then each entry: `kind` (u8) and `id` (32), in strictly ascending order of (`kind`, `id`) | | `seller_sig` | 64 | §4.2 | | `buyer_sig` | 64 | §4.2 | @@ -143,17 +152,18 @@ tariff the buyer did not sign bills nobody. A reader reads exactly the bytes it is given as one tariff, in the order of §4.1, and refuses at the first of these that holds: fewer than 4 bytes, `truncated`; a magic other than `WLT1`, -`malformed`; no fifth byte, `truncated`; a version other than 1, 2 and 3, `unknown_version`; the +`malformed`; no fifth byte, `truncated`; a version other than 1 to 4, `unknown_version`; the bytes end before a field the layout requires, `truncated`; bytes after `buyer_sig`, `malformed`. It then refuses as `tariff_invalid` a tariff that breaks any of these: - `start` is below `end`; `currency` is three capitals `A`–`Z`; - `seller` and `buyer` are not zero, and not the same key; - `scope` has at least one entry, in strictly ascending order of (`kind`, `id`), each `kind` 1 to - 4 (1 to 5 in versions 2 and 3) and each `id` not zero; + 4 (1 to 5 in versions 2 to 4) and each `id` not zero; - in version 2, `job` has at most 255 prices, each as §4.5 requires, in strictly ascending - order of (`capability`'s bytes, `unit`); in version 3, at most 255, each as §4.6 requires, - in strictly ascending order of (`capability`'s bytes, `operation`'s bytes, `unit`). + order of (`capability`'s bytes, `unit`); in versions 3 and 4, at most 255, each as §4.6 + requires, in strictly ascending order of (`capability`'s bytes, `operation`'s bytes, `unit`); + each `unit` 1 or 2, and in version 4 1 to 3. Then the seller's signature, then the buyer's: `bad_key`, `bad_signature`. @@ -167,7 +177,7 @@ A scope entry names whose records the tariff bills: | 2 | a party's key | a settlement statement's `party` is the `id` | | 3 | a packager's key | a package receipt's `signer_pubkey` is the `id` | | 4 | an ad decider's or a stitcher's key | every receipt of an ads source has `signer_pubkey` the `id` (live-ads §3.4); a stitched source's records are accepted only when their `signer` is such an `id`: the verifier's **signers** (stitched-presentation §7.1) are the scope's entries of kind 4 | -| 5 | a router's key (versions 2 and 3) | a job source's route record has `signer` the `id` (route-record §5.1) | +| 5 | a router's key (versions 2 to 4) | a job source's route record has `signer` the `id` (route-record §5.1) | The scope is what the buyer agreed to pay for: a record signed by a party the tariff does not name is refused `outside_scope` (§7.2 step 5), whoever submits it. @@ -184,6 +194,7 @@ The units are the records' own figures, never converted: |---|---|---| | 1 | `jobs` | 1 | | 2 | `subpixels` | the sum of its output receipts' `work_pixel_ops` (integer-payloads §15.1): the subpixels its output decodes to | +| 3 | `work_units` (version 4) | the sum of its output packages' `work_units` (packaging §9.1, §4.7) | A job the tariff has no price for, by its serving capability, is billed nothing, and a buyer pays for a capability only at a price it signed. A package job stays a package source (§5.1), @@ -208,6 +219,53 @@ a job price that names an operation, and the buyer of a version-2 tariff signed rules. Version 3 also bills a job's work rather than its output's identity (§5.2, §5.3, §6.9). A tariff of version 2, its invoices and its sources read, verify and bill exactly as before. +### 4.7 Bytes, work and storage (version 4) + +A tariff of version 4 prices jobs as version 3 does, and prices three more things by what +spending on them scales with: + +1. **A room's bytes out.** Its fourteenth room price is per 10^9 bytes of a room-session + receipt's `bytes_out`, the payload bytes the hops sent the session's sessions, summed from + their ledgers (live-metering §4.4, a receipt of version 2). A room's time units price how + long its sessions ran; what delivering them costs scales with the bytes carried too, and a + viewer of a high layer and one of a low layer subscribe for the same seconds and are sent + different bytes. The receipt states the price in its own tariff and counts it in each + grant's funds (live-metering §4.6), so a receipt that states a tariff states this one's + fourteen prices (§3). A receipt of version 1 states no bytes, and bills none. +2. **A package's work, per run.** Packaging is deterministic: the same source packed again under + the same policy gives the same package, under the same receipt, from a run that did the work + again with new energy (a customer asks for the work to be done and measured again). So a + package is billed as a job is (§6.9): the **run** that made it is the work, and its receipt is + the product, which each run that made it cites. Billing once per receipt refused a package + made again, though the work was done again. A run is a job of the catalogue's operation + `package.build`, routed and receipted as any job is (route-record §6): a `job` source whose + output is the package (§5.1), billed at the tariff's job prices for its serving capability + and `package.build`, per job and per **work unit**: the package receipt's `work_units`, the + work its figure is expressed against (packaging §9.1, jwp-receipts), one per entry, each a + base or a refinement the packer coded and wrote, so a price per unit bills what the run + spent in proportion to its size. The chain bills each run's route record and hop receipts + once, and a run replayed under a new route record is refused (`record_rebilled`, + `record_duplicate`), as any job's; the package receipt (kind 5) is not billed once, and is + cited by each run's line. The run's energy is its hop's figure (§6.6), and the receipt's own + figure, the same work's, is not stated again. A `package` source is the product held: it + bills its storage alone (below), never its work, which only a run states. +3. **A package's storage, by byte-time.** Its one package price is per 10^9 **byte-days**: + what keeping bytes costs scales with how many are kept and for how long, which a price per + stored byte once per receipt ignores. A package whose receipt the previous invoice of the + chain lists is **held** through the invoice's whole period: it was written by the end of + that invoice's period, at most this one's `start`. The invoice bills it ⌊Σ `stored_bytes` × + (`end` − `start`) / 86 400 000 000⌋ byte-days over its packager's held packages, the + period in microseconds and rounded down once per line, and lists its receipt again. The + invoice that first lists a package bills no storage for it: no record shows when within that + period it was written, and a buyer pays only for time a record shows the bytes were kept. The period is read from the chain itself, its invoices' + `start` and `end`, which the seller signs and the buyer holds (§6.9), and the bytes from + the package receipt. + +A version-3 reader cannot read a tariff of version 4 (its room prices are one longer and its +package prices two shorter, and a job price may be of unit 3) or an invoice of version 4 (§6.1: +it states a sixth unmetered count), so version 4 is a version of its own. A tariff of versions +1 to 3, its invoices and its sources read, verify and bill exactly as before. + ## 5. Sources ### 5.1 Kinds and their documents @@ -222,7 +280,7 @@ extension's verifier is given. Bytes are lowercase hexadecimal strings. | `package` | `receipt` (the text of `package.receipt.json`), `indexes` (the index files in the receipt's component order) | packaging §9, a receipt of version 2 against its indexes | | `ads` | `descriptor`, `grants`, `key_log`, `chains`, `policy`, `pt0_ms`, `receipts` (form-2 receipts in their JSON carriage), `pods`, `claims`, `creatives`, `issuers` | live-ads §9, with ad-presentation §9 under a policy that requires claims | | `stitched` | `records` (pod-input records), `claims` (stitched claims), `manifests`, `responses` (VAST and VMAP documents), `receipts` (form-1 receipts in their JSON carriage), `creatives`, `issuers` | stitched-presentation §7, its signers the tariff's (§4.4) | -| `job` (versions 2 and 3) | `request`, `pricebook`, `policy`, `record`, `receipts`, `keys` (a route record's verification document, route-record §7.1, its `receipts` and `keys` not `null`) and `outputs`, a list of objects of exactly `receipt` (the text of a `wai.video.int_motion` decode receipt's JSON form, integer-payloads §15.2) and `codestream` (the `WIV1` payload it describes) | route-record §7, accepted with its hop receipts checked; then each output receipt read by integer-payloads §15.2 and re-derived from its `codestream` (§15.1 there), or `output_invalid` at `outputs` and its index | +| `job` (versions 2 to 4) | `request`, `pricebook`, `policy`, `record`, `receipts`, `keys` (a route record's verification document, route-record §7.1, its `receipts` and `keys` not `null`) and `outputs`, a list of objects of exactly `receipt` (the text of a `wai.video.int_motion` decode receipt's JSON form, integer-payloads §15.2) and `codestream` (the `WIV1` payload it describes: the object the hop delivered, named by its content hash), or, in version 4, of exactly `package` (the text of a package receipt of version 2, `package.receipt.json`: the object the hop delivered) and `indexes` (its index files in its component order) | route-record §7, accepted with its hop receipts checked; then each output receipt read by integer-payloads §15.2 and re-derived from its `codestream` (§15.1 there), each package verified against its indexes by packaging §9, or `output_invalid` at `outputs` and its index; then each output held to what its hop delivered, or `output_not_delivered` there | A source is accepted when its extension's verifier accepts it; for `ads`, when the outcome is **accept** (live-ads §9.4), a **gap** being `source_gap`. A `stitched` source is always @@ -241,6 +299,33 @@ attempt's OER/2 receipt: the unmetered marker half to the even one, with the receipt's `energy.class`. A billed hop's receipt whose figure has no class, or rounds below 1 µJ or past what a u64 holds, cannot be stated in a row (§6.6): the source is refused `job_figure_invalid`, at `receipts` and the receipt's index. +Under a tariff of version 4 every attempt's figure is stated (§6.6), so the same holds of each +attempt that is not billed, a failed hop and one that served past the deadline. + +**A job's output is the object its hop delivered.** An output's **object** is its +`codestream`, or a package's receipt text, named by its content hash (route-record §2, +jwp-receipts §2.1). A route record +of version 2 states the objects its served attempt delivered, by content hash, and holds that +hop's receipt to them (route-record §5.2, §6). Each output a job source gives is then one of +those objects, and no two of its outputs are one object: otherwise the source is refused +`output_not_delivered`, at `outputs` and the output's index. The reason is the subpixels a +line bills (§6.3): they are read from the output receipts, and an output receipt of an object +the hop did not deliver bills subpixels nobody delivered for this job, as a receipt given +twice bills them twice. So the chain closes: the hop's receipt names its outputs, the record +names the hop's receipt and the outputs, and each output receipt is of one of them. Under a +tariff of version 4, a record that states no outputs (a record of version 1, or one no attempt +served) holds every output to none, and a job it routed is billed by the job alone; under a +tariff of version 3, a record of version 1's outputs are read as before. + +**Routing figures are never charges.** A route record's candidates' `cost`, `energy`, +`expected_cost` and `expected_ttfb_ms`, and its price book's `price` and `failures`, are the +router's figures for choosing an endpoint (route-record §4.2, §4.4): what a hop costs the +router, and what the failures it measured cost it, per successful job. No line reads them. A +job line bills its billed attempt alone, at its list price, the tariff's job price for its +serving capability and operation, which the buyer signed: a failed attempt, what a provider +billed for it and the expected cost per successful job never reach a line, however the router +ranked, and a line that counts a failed hop as a job, or prices one at the router's figures, +does not recompute. ### 5.2 What a source contributes @@ -256,7 +341,7 @@ the others are the ledger's own: | 2 | a per-hop record, `WMH1` | its digest (live-metering §3.5) | a `room` source: each record its receipt names; a `delivery` source: each record its statement names in `hops` | | 3 | a settlement statement, `WSS1` | its digest (settlement §7.4) | a `delivery` source: its statement | | 4 | an acknowledgement or declaration, `WDA1` | its digest (settlement §3.5) | a `delivery` source: each record its statement names in `records` | -| 5 | a package receipt | its `receipt_hash` (packaging §9) | a `package` source | +| 5 | a package receipt | its `receipt_hash` (packaging §9) | a `package` source; a `job` source (version 4): each output package | | 6 | a `wai.video.ssai` receipt of the break form | its identity (live-ads §8.4) | an `ads` source: each receipt | | 7 | a presentation claim, `WPC1` | its digest (ad-presentation §5.3) | an `ads` source: each claim that reads | | 8 | a pod-input record, `WSI1` | its digest (stitched-presentation §4.4) | a `stitched` source: each record it accepts | @@ -265,9 +350,9 @@ the others are the ledger's own: | 11 | an invoice, `WLI1` | its digest (§6.7, as [revenue-share](revenue-share.md) §7.4 cites it) | no source: cited by revenue-share §7.4 | | 12 | a cue event | its event digest ([opportunity-report](opportunity-report.md) §7.3, live-events §3.2) | no source: cited by opportunity-report §7.3 | | 13 | a room policy | its digest ([opportunity-report](opportunity-report.md) §7.3, live-ads §3.2) | no source: cited by opportunity-report §7.3 | -| 14 | an OER/2 receipt | the 32 bytes its `receipt_id` names (oer-receipts §5) | a `job` source (versions 2 and 3): the receipt of each attempt of its record | -| 15 | a `wai.video.int_motion` decode receipt | its receipt hash (integer-payloads §15.1) | a `job` source (versions 2 and 3): each output receipt | -| 16 | a route record | its digest (route-record §5.3) | a `job` source (versions 2 and 3): its record | +| 14 | an OER/2 receipt | the 32 bytes its `receipt_id` names (oer-receipts §5) | a `job` source (versions 2 to 4): the receipt of each attempt of its record | +| 15 | a `wai.video.int_motion` decode receipt | its receipt hash (integer-payloads §15.1) | a `job` source (versions 2 to 4): each output receipt | +| 16 | a route record | its digest (route-record §5.3) | a `job` source (versions 2 to 4): its record | Kinds 17 to 127 are unassigned. Kinds **128 to 255 are reserved for private and provisional use**: an implementation's own records, such as a hosted service's provisional records carried @@ -282,10 +367,11 @@ receipts, a `stitched` source's its accepted records, and a `job` source's its r contributed once. An OER/2 receipt a `job` source contributes that an earlier `job` source of the invoice also contributes is refused `record_duplicate` too: one hop serves one job, so no hop is billed for two. Under a tariff of version 2, so is an output receipt: one output is one job's. -Under a tariff of version 3 it is not: an output receipt is the evidence of what a job delivered, -not the work, and the same request run again on a deterministic codec delivers the same output -under the same receipt from a new hop that did the work again (§6.9). Two lines of one invoice -that cite one output receipt therefore cite different hop receipts, whichever lines they are. +Under a tariff of version 3 or 4 it is not: an output receipt is the evidence of what a job +delivered, not the work, and the same request run again on a deterministic codec delivers the +same object, of the same content hash, under the same receipt from a new hop that did the work +again (§6.9). Two lines of one invoice that cite one output receipt therefore cite different hop +receipts, whichever lines they are. ### 5.3 Placement in time @@ -296,14 +382,15 @@ A source is **in** a period when: - `delivery`: the statement's period lies within it; - `ads`: the `t` of the break each receipt names, placed by the room's `t0`, is within it; - `package` and `stitched`: always: a package receipt and a pod-input record state no time, and - the chain (§6.9) bills each once; + the chain (§6.9) bills each once; under a tariff of version 4, a package's work once and its + storage for the periods it is held through (§4.7); - `job`: its route record's `accepted` is within it. Two room receipts of one room whose sessions overlap, two statements of one party whose periods overlap, two receipts of the invoice's ads sources naming one break and one session, and, under a tariff of version 2, two route records of one router naming one `job`, bill one thing twice: -the later is refused `record_overlap`. Under a tariff of version 3, two route records of one job -are two runs of it, each billed from its own hop, and no hop twice (§5.2): a job's id names what +the later is refused `record_overlap`. Under a tariff of version 3 or 4, two route records of one +job are two runs of it, each billed from its own hop, and no hop twice (§5.2): a job's id names what was asked, not the work, and a request run again is worked again. ## 6. The invoice @@ -313,7 +400,7 @@ was asked, not the work, and a request run again is worked again. | field | size | meaning | |---|---|---| | `magic` | 4 | `WLI1` (ASCII) | -| `version` | 1 | its tariff's version, 1, 2 or 3 | +| `version` | 1 | its tariff's version, 1 to 4 | | `seller`, `buyer` | 32 each | the tariff's | | `tariff` | 32 | the tariff's digest | | `prev` | 32 | the digest of the invoice before it in its chain (§6.9); zero for the first | @@ -322,7 +409,7 @@ was asked, not the work, and a request run again is worked again. | `records` | 4 + 33 × *r* | a u32 count, then each record (§5.2): `kind` (u8) and `id` (32), in strictly ascending order of (`kind`, `id`) | | `lines` | 2 + 94 × *l* | a u16 count, then each line (§6.3), in strictly ascending order of (`source_kind`, `source`, `unit`) | | `energy` | 1 + 18 × *e* | a u8 count, then each row (§6.6): `scope` (u8), `tag` (u8), `figures` (u32), `joules` (u64, µJ), `max_ppm` (u32), in strictly ascending order of (`scope`, `tag`) | -| `unmetered` | 16 or 20 | four u32: the unmetered figures of scopes 1 to 4 (§6.6); in versions 2 and 3, five, scopes 1 to 5 | +| `unmetered` | 16, 20 or 24 | four u32: the unmetered figures of scopes 1 to 4 (§6.6); in versions 2 and 3, five, scopes 1 to 5; in version 4, six, scopes 1 to 6 | | `amount` | 8 | u64: the sum of the lines' amounts | | `sig` | 64 | §6.7 | @@ -337,7 +424,7 @@ A line is 94 bytes: | field | size | meaning | |---|---|---| -| `source_kind` | 1 | 1 room, 2 delivery, 3 package, 4 ads, 5 job (versions 2 and 3) | +| `source_kind` | 1 | 1 room, 2 delivery, 3 package, 4 ads, 5 job (versions 2 to 4) | | `source` | 32 | the room id, the delivering party, the packager, the ad decider or the router | | `unit` | 1 | the unit (below) | | `quantity` | 8 | u64: the quantity of the unit the records state | @@ -356,16 +443,19 @@ each: | 1 | 11 | `composition_us` | their `composition_us` | `room` 10 | 10^6 | | 1 | 12 | `recorded_us` | their `recorded_us` | `room` 11 | 10^6 | | 1 | 13 | `events_sent` | their `events_sent` | `room` 12 | 1 | +| 1 | 14 | `bytes_out` (version 4) | their `bytes_out`, of receipts of version 2 (§4.7) | `room` 13 | 10^9 | | 2 | 1–4 | `live`, `fetch`, `fill`, `ancillary` | the bytes of the statement's delivery lines of that class that are not free (settlement §7.2) | `delivery` `unit` − 1 | 10^9 | | 3 | 1 | `packages` | the number of package receipts | `package` 0 | 1 | | 3 | 2 | `entries` | their `total_entries` | `package` 1 | 1 | | 3 | 3 | `stored_bytes` | their `stored_bytes` | `package` 2 | 10^9 | +| 3 | 3 | `byte_days` (version 4, its only package unit) | ⌊Σ `stored_bytes` × (`end` − `start`) / 86 400 000 000⌋ over the package receipts the previous invoice lists, which are held (§4.7) | `package` 0 of version 4 | 10^9 | | 4 | 1 | `presented_impressions` | under a policy that requires claims, the impressions that count (ad-presentation §9.2); of a stitched source, the presentations of its accepted records' ads (stitched-presentation §7.4), one per session | `ads` 0 | 1 | | 4 | 2 | `billable_impressions` | under a policy that does not, the billable impressions (quartile at least 1) | `ads` 1 | 1 | -| 5 | *k* | the *k*-th job price's unit | over the router's job sources with a billed hop whose serving capability is that price's `capability` (and, in version 3, whose operation is its `operation`): one per job (`jobs`), or each job's output receipts' `work_pixel_ops` (`subpixels`) | the *k*-th job price's `price` | its `divisor` | +| 5 | *k* | the *k*-th job price's unit | over the router's job sources with a billed hop whose serving capability is that price's `capability` (and, in versions 3 and 4, whose operation is its `operation`): one per job (`jobs`), each job's output receipts' `work_pixel_ops` (`subpixels`), or, in version 4, its output packages' `work_units` (`work_units`) | the *k*-th job price's `price` | its `divisor` | -There is one line for each source and unit whose quantity is above 0, a price of 0 included, and -none for a quantity of 0. A delivery line's bytes are those its party's downstream parties signed +In version 4 a package source bills only its `byte_days`, and its work is its run's job line. +There is one line for each source and unit whose +quantity is above 0, a price of 0 included, and none for a quantity of 0. A delivery line's bytes are those its party's downstream parties signed for (settlement §3.7): a declared byte and a free retrieval are never billed, and the delivery report states both (§8.2). An ad line counts impressions under one rule or the other, never both: a policy that requires claims bills only what the players' own claims show presented, and one that @@ -385,20 +475,23 @@ Each line cites the records it came from: - a delivery line: the statements of its party with a delivery line of the class that is not free, and each acknowledgement (mode 1) they name with an entry of the class that is not free (a retrieval class with a zero `grant` is free); -- a package line: the package receipts of its packager whose figure of the unit is above 0; +- a package line: the package receipts of its packager whose figure of the unit is above 0; in + version 4, the held receipts its `byte_days` count; - an ad line: the receipts of its decider with at least one impression counted under the unit, and, for `presented_impressions`, each counted impression's own claim; of a stitched source, its stitcher's accepted records, and each presented own claim of their ads; - a job line: for each job it counts, its route record and its billed hop's OER/2 receipt, and, - for `subpixels`, each of its output receipts whose `work_pixel_ops` is above 0. In version 3, - an output receipt that two jobs of the line delivered is cited once and its `work_pixel_ops` - counted for each (§6.9). + for `subpixels`, each of its output receipts whose `work_pixel_ops` is above 0. In versions 3 + and 4, an output receipt that two jobs of the line delivered is cited once and its + `work_pixel_ops` counted for each (§6.9); in version 4, for `work_units`, each of its output + packages whose `work_units` is above 0, a package that two runs of the line made cited once + and counted for each. `cited` is their number, and `cites` is SHA-256 over the 17 bytes `wai:ledger-cites` (ASCII) and 0x01, followed by each cited record's `kind` and identity, in ascending order of (`kind`, identity). Every cited record is in `records`. A buyer recomputes a line from the records it cites alone, and shows one line to an auditor with its records and nothing else. One line is -the exception: a version-3 job line two of whose jobs delivered one output receipt names each job +the exception: a job line of version 3 or 4 two of whose jobs delivered one output receipt names each job and that output once, and how many of its jobs delivered the output is stated by their sources, each of which pairs its job with its outputs (§5.1). @@ -410,9 +503,17 @@ Each record that states an energy figure states it once, in one **scope**: |---|---| | 1 `room_hops` | the per-hop records named by the room receipts (each restated by its receipt, live-metering §4.5) | | 2 `delivery_hops` | the per-hop records named by the statements and by no room receipt of the invoice | -| 3 `packaging` | the package receipts' `joules_micro` and class | +| 3 `packaging` | the package receipts' `joules_micro` and class; in version 4 none: a package's figure is its run's, which the run's hop states (§4.7) | | 4 `ad_decisions` | the ad receipts' `joules_micro` and class; a pod-input record states no figure | -| 5 `jobs` (versions 2 and 3) | each job source's billed hop's figure (§5.1): the hop that served the job, in the class its OER/2 receipt states; a job with no billed hop states none | +| 5 `jobs` (versions 2 to 4) | each job source's billed hop's figure (§5.1): the hop that served the job, in the class its OER/2 receipt states; a job with no billed hop states none | +| 6 `unbilled_hops` (version 4) | each job source's attempts that are not billed (route-record §5.2): a failed hop and one that served past the deadline, each its OER/2 receipt's figure (§5.1) | + +A failed hop spent energy and delivered nothing, and a hop that served late spent it and +delivered too late: neither is billed, and before version 4 neither appeared in any row, so an +invoice's energy for its jobs was less than their hops spent. Version 4 states them in a scope +of their own, beside the billed hops' and never summed with them: the jobs' energy is scope 5 +and scope 6 together, per class, and what the buyer was billed for is scope 5 alone. No line +reads scope 6. For each scope, `unmetered` counts its figures that are the unmetered marker, which are in no row and **MUST NOT** be presented as zero joules. For each scope and each tag among its metered @@ -443,11 +544,11 @@ invoice with a row of tag 0. It refuses as `private_kind` an invoice with a reco - `start` is below `end`; `currency` is three capitals `A`–`Z`; - each list is in the strictly ascending order §6.1 gives it; each record's `kind` is 1 to 9 (in - versions 2 and 3, also 14 to 16: kinds 10 to 13 are no ledger source's, §5.2); -- each line's `source_kind` is 1 to 4 (1 to 5 in versions 2 and 3), its `unit` a unit of its kind - (§6.3; for kind 5, at least 1), its `quantity` and `cited` above 0; -- each row's `scope` is 1 to 4 (1 to 5 in versions 2 and 3), its `tag` 2 to 5 and its `figures` - above 0. + versions 2 to 4, also 14 to 16: kinds 10 to 13 are no ledger source's, §5.2); +- each line's `source_kind` is 1 to 4 (1 to 5 in versions 2 to 4), its `unit` a unit of its kind + in its version (§6.3; for kind 5, at least 1), its `quantity` and `cited` above 0; +- each row's `scope` is 1 to 4 (1 to 5 in versions 2 and 3, 1 to 6 in version 4), its `tag` 2 to 5 + and its `figures` above 0. Then the signature (§6.7): `bad_key`, `bad_signature`. @@ -455,14 +556,16 @@ Then the signature (§6.7): `bad_key`, `bad_signature`. The invoices of one tariff form a **chain**: each names in `prev` the invoice before it, the first names zero, and their periods do not overlap. A ledger keeps one chain per tariff. No record is in -the `records` of two invoices of a chain, but, under a tariff of version 3, an output receipt -(kind 15): a record billed once is billed never again, whatever period a later invoice states, and +the `records` of two invoices of a chain, but, under a tariff of version 3 or 4, an output receipt +(kind 15), and under one of version 4 a package receipt (kind 5), which each run that made it +cites and each invoice whose period it is held through lists again to bill its storage (§4.7): a record billed once is billed never again, whatever period a later invoice states, and a package receipt, which states no time, is billed in the invoice that first holds it. What a chain bills once for a job is its **work**, and its output's receipt is the **evidence**. A run of a job is a hop that did it: new energy, and a new OER/2 receipt and route record, new on every run. An output receipt is not the work: the codecs are deterministic, so the same request -run again delivers the same output under the same receipt. Under a tariff of version 3, therefore: +run again delivers the same objects, of the same content hashes, under the same receipt. Under a +tariff of version 3 or 4, therefore: - the records a chain bills once for a job are its route record and its hops' OER/2 receipts, the billed hop's among them; @@ -476,8 +579,10 @@ run again delivers the same output under the same receipt. Under a tariff of ver Under a tariff of version 2, an output receipt is billed once as well, and a re-run of a job whose output an invoice of the chain holds is refused, as that tariff's buyer signed it. A -package keeps its rule in every version: it is billed as a delivered product, once per package -receipt, which is a rule of its own and not a job's. +package keeps its rule in versions 1 to 3: it is billed as a delivered product, once per package +receipt, which is a rule of its own and not a job's. In version 4 it has a job's shape: the run +that made it is the work, billed once per run, and its receipt the product, cited by each run; +its storage is billed for each period it is held (§4.7). ## 7. Verification @@ -511,8 +616,8 @@ It runs these steps and stops at the first refusal, which it reports with the re 6. **Across sources**, at `source` and the index of the later: a head contributed twice (`record_duplicate`); a receipt, statement or ad receipt overlapping an earlier one, or, in version 2, a route record of the router and job an earlier one names (§5.3, - `record_overlap`); and a record that is in the previous invoice's `records`, in version 3 an - output receipt excepted (§6.9, `record_rebilled`). + `record_overlap`); and a record that is in the previous invoice's `records`, in versions 3 and + 4 an output receipt excepted, and in version 4 a package receipt (§6.9, `record_rebilled`). 7. **The figures**, at `invoice`, recomputed from the sources as §6.2 to §6.6 compute them and compared in this order: 1. a line whose source and unit no source gives, or that states a larger quantity than the @@ -529,9 +634,10 @@ A figure that cannot be held in its field is a difference. - **refuse**: the reason and where. - **accept**: the invoice's digest; the tariff's digest; the currency and the period; the number of records; each line with its source kind, source, unit name (and, for a job line, the job - price's `capability`, and in version 3 its `operation`), quantity, price, amount and its cited - records; each energy row by scope and class label with its figures, joules and `max_ppm`; each - scope's unmetered figures and coverage (scopes 1 to 4, and in versions 2 and 3 scope 5); the + price's `capability`, and in versions 3 and 4 its `operation`), quantity, price, amount and its + cited records; each energy row by scope and class label with its figures, joules and `max_ppm`; + each scope's unmetered figures and coverage (scopes 1 to 4, in versions 2 and 3 scope 5, and in + version 4 scopes 5 and 6); the amount; and the reports of §8. ## 8. Reports @@ -625,6 +731,7 @@ The codes this extension adds, each with where it is raised: | `private_kind` | §5.2, §6.8, §7.2 step 2 | | `output_invalid` | §5.1, §7.2 step 5 | | `job_figure_invalid` | §5.1, §7.2 step 5 | +| `output_not_delivered` | §5.1, §7.2 step 5 | A verifier of this extension also raises `truncated`, `malformed` and `unknown_version` for a tariff or an invoice that does not read, and `malformed` for a source that does not read (§5.1); `bad_key` and `bad_signature` for their signatures; @@ -645,7 +752,9 @@ from the corpora of the extensions it reads (`live-conformance/metering/`, delivery statements of two parties signed for it and, for each media job, a sink's `wai.video.int_motion` decode receipt of its output over a payload of `wai-rs/tests/vectors/int_video/`, and, for version 3, the route records of a decode, a re-run, a -replayed hop receipt and a claimed one, routed and sealed under the route corpus's own seeds. The sources are +replayed hop receipt and a claimed one, routed and sealed under the route corpus's own seeds, as +are jobs routed under the route record's version 2, its price book of version 2 with its +per-operation entries and measured failures, the served hop stating its outputs. The sources are held once, by name, and each vector is a verification document (§7.1) naming its sources, with the outcome §7.3 gives it: @@ -664,7 +773,15 @@ outcome §7.3 gives it: each at its own price; the next invoice of that chain, billing the first job run again, its route record and hop receipt new and its output receipt one the first invoice holds; the job and its re-run in one invoice, their shared output receipt cited once and its subpixels billed - for each; and a decode under a tariff that prices only the encode, which bills nothing. + for each; and a decode under a tariff that prices only the encode, which bills nothing; jobs + routed under the route record's version 2 billed under version 3 (an encode, a failover billed + at the endpoint that served, a decode, a hop past the deadline and three that failed); and, + under a tariff of version 4, a lesson room's receipt of version 2 billed by its bytes out + beside its time, a package listed and the run of `package.build` that made it, billed per run + and per work unit, and those jobs with every hop's energy, the failed and late hops' in their + own scope, one of them unmetered; and the next invoice of that chain, billing the package it + holds for the byte-days of its own period and the same package made again by a new run, its + work billed again and its receipt cited again, beside a second package listed. - **Refused**: each reason of §10 at least once, each vector a control of one defect; a source of each kind outside the scope, a room receipt and a statement under other prices, and a source of each timed kind outside the period; a refusal of each source kind by its own extension; and, for @@ -675,7 +792,17 @@ outcome §7.3 gives it: another text's kind; and, for version 3, job prices out of order by operation, a version-2 invoice under a version-3 tariff, a hop receipt the previous invoice billed brought again under a new route record, and one hop receipt claimed by two jobs billed on two lines; and, - under a tariff of version 2, the same re-run, refused because its output receipt was billed. + under a tariff of version 2, the same re-run, refused because its output receipt was billed; + and, for a job routed under the route record's version 2, an output receipt of a clip its hop + did not deliver and one output given twice (`output_not_delivered`); and, for version 4, a + price of bytes other than the receipt's and a receipt of version 1 under a price of bytes + (`tariff_conflict`), bytes out above the receipt's, storage billed for a package first listed, + a held package's storage over the tariff's period rather than the invoice's, a package's run + replayed under a new route record in the next invoice (`record_rebilled`) and in the same one + (`record_duplicate`), a failed hop billed as a job and a job line at the router's list price, the unbilled + hops' energy left out or added to the billed hops' row, an unbilled hop whose figure states no + class (`job_figure_invalid`), an output of a route record of version 1, and an invoice of + version 3 under a tariff of version 4. `wai_receipt_ledger_vectors verify` and the test `tests/receipt_ledger.rs` check that the file regenerates byte for byte, that `wai-rs` gives every vector its outcome, that every reason of §10 @@ -686,7 +813,8 @@ it shares no code with `wai-rs`, verifies signatures with WAI's strict rule writ implementation (`live_metering_verify.py`, `settlement_verify.py`, `live_ads_verify.py` with `ad_presentation_verify.py`, `stitched_presentation_verify.py`, `route_record_verify.py`, and `pack-conformance/pack_verify.py`) and each output receipt by `_int_motion_receipt.py`, written -from integer-payloads §15, recomputes every line, +from integer-payloads §15, computes each output's content hash with BLAKE3 written from its +specification (`claim-conformance/_blake3.py`), recomputes every line, citation, row and report itself, gives every vector the same outcome, and requires every mutated copy of the corpus to fail. @@ -710,6 +838,17 @@ copy of the corpus to fail. ran, as a party and a downstream key can bill bytes (settlement §13). Whether a request is worked again or answered from outputs still kept is the router's decision, not the ledger's; the ledger bills what was worked. A tariff of version 2 keeps billing an output once. +- **Bytes, work and storage.** Under a tariff of version 4 a room's bytes out rest on its hops' + ledgers, which each hop signs by their root (live-metering §3.4), as its time rests on their + records; a package's work rests on the run that made it, its route record and its hop's + receipt, new on every run, and on its receipt's work units, which its indexes recompute; and + its storage on the chain: a package is billed a period's storage only when the invoice before lists it, + so it was written by the start of the period billed, and a buyer holding the chain sees each + period billed once. Whether the seller kept the bytes through the period is the seller's + statement, as a delivery is the acknowledging parties' (settlement §13). +- **Every hop's energy.** Under a tariff of version 4 an invoice states the energy every hop of + its jobs spent, the hops the buyer was not billed for in a scope of their own, so a seller + whose router fails often shows it in the energy it states, and is not paid for it. - **What the figures rest on.** An invoice is as true as its records: a delivery line rests on acknowledgements, so a party and a downstream key that collude can bill bytes that never moved, as settlement §13 says; a room line rests on per-hop records and the room's events; an ad line diff --git a/wai/live-conformance/ledger/README.md b/wai/live-conformance/ledger/README.md index 3e7c6bf44..4decceec6 100644 --- a/wai/live-conformance/ledger/README.md +++ b/wai/live-conformance/ledger/README.md @@ -54,7 +54,23 @@ The accepted vectors: - `one_output_under_two_hops` (version 3): `job-0001` and its re-run in one invoice: both billed, the output receipt they share cited once and its subpixels billed for each hop; - `an_operation_the_tariff_does_not_price` (version 3): a tariff that prices `int_motion`'s encode - and not its decode: the decode bills nothing, and its hop's energy is stated. + and not its decode: the decode bills nothing, and its hop's energy is stated; +- `version_2_routes_under_version_3` (version 3, §5.1): jobs routed under the route record's + version 2, its price book pricing each operation apart with measured failures and each served + hop stating its outputs: an encode, a failover whose failed hop was metered, billed at the + endpoint that served, a decode, a hop past the deadline and three that failed, which bill + nothing, and a failover whose failed hop's figure states no class, which version 3 does not + read; each output receipt is of the clip its hop states it delivered; +- `version_4_by_the_byte_and_the_work` (version 4, §4.7): the lesson room's receipt of version 2 + ([`metering/`](../metering/)'s `bytes_out_priced`) billed by its bytes out beside its time, a + package listed, no storage yet, and the run of `package.build` that made it (`package_run`) + billed per run and per work unit of the package, its receipt cited, and those jobs at their own + prices, with every hop's energy: the billed hops' in `jobs`, the failed and late hops' in + `unbilled_hops`, one of them unmetered; +- `version_4_storage_held_through_a_period` (version 4): the next invoice of that chain bills the + package the first holds for the byte-days of its own period, and the same package made again by + a new run (`package_run_again`), its work billed again and its receipt cited again, beside a + second package listed. Every other vector is refused, a control of one defect: each reason of §10, the reused codes, and a refusal of each source kind by its own extension. @@ -63,7 +79,7 @@ refusal of each source kind by its own extension. seeds (the seller, the buyers, the two delivering parties, their viewers and objects) and from sources taken unchanged from the corpora of the extensions the ledger reads: rooms and their receipts from [`metering/`](../metering/) (`lesson`, `mixed_classes`, `receipt_bad_signature`, -`relay_recorded`), the forwarding viewer's statement and the room its hop records name from +`relay_recorded`, `bytes_out_priced`), the forwarding viewer's statement and the room its hop records name from [`settlement/`](../settlement/), ad rooms from [`ads/`](../ads/) (`live_break`, `gap`) and [`presentation/`](../presentation/) (`video_rule`, `ceiling_exceeded_by_presented`), streams stitched by others from [`stitched/`](../stitched/) (`hls_stitched`, `form1_prefetch`, @@ -76,7 +92,9 @@ manifests, responses and receipts they name, by their bytes), media jobs from `wai-rs/tests/vectors/int_video/int_video_bitstream.wiv1`; the version-3 jobs (`job_decode`, `job_rerun`, `job_rerun_replays_its_hop`, `job_claims_another_hop`) routed here by that corpus's router under its price book and policy, their hop receipts sealed under its hop key, the replayed -and the claimed one being `served_first_try`'s own; and the +and the claimed one being `served_first_try`'s own; the jobs of version 2 (`job_v2_*`) routed +here by that router under the route corpus's price book of version 2, and the runs of +`package.build` (`package_run*`) under a price book of version 2 of its own; and the packages `video-base-01` and `video-staged-01` of [`pack-conformance/packs/`](../../pack-conformance/packs/). When one of those corpora is regenerated, so is this one. Nothing here was fetched from outside the repository. diff --git a/wai/live-conformance/ledger/vectors.json b/wai/live-conformance/ledger/vectors.json index 327dc0c47..77b2410c4 100644 --- a/wai/live-conformance/ledger/vectors.json +++ b/wai/live-conformance/ledger/vectors.json @@ -7,6 +7,7 @@ "buyer_m": "98f25ea3a2c247f29e94b9280ebf10b50c1a7412b49a0b559a2c131c0b87ba01", "buyer_s": "74ab29c1a8eb8a438d896f065fd759e5296c0b130782d534cbfab185bb961bc6", "buyer_j": "708ca98f0c81494c6a839414a36407fbe750023b8f4da697f31973ac8125ceda", + "buyer_4": "ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c03", "cdn_a": "b7ccb31f589ef602603d4ae5cd3bada28af9e22cd6858ee65403c8772e9e6f83", "cdn_b": "123149749a48decea3d95364f688b821bb45bd7993dcfd3ae12b4e5f0b5b0be3", "output_sink": "4a29b9b42b4c7b8d947b226d503cfa1ee8b69a5cd3e4cb88b30db023d6d2bb8c" @@ -1285,6 +1286,161 @@ } ] }, + "job_v2_all_failed": { + "kind": "job", + "request": "{\"capability\":\"wai.video.int_motion\",\"deadline_us\":30000000,\"fallback\":\"wai.video.av1\",\"job\":\"job-3005\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"media.encode\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.av1\",\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":300000,\"failures\":{\"billed_price\":0,\"failed\":10,\"failed_ms\":500,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":12000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":10000,\"provider\":\"prov-beta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793000000000000,\"attempts\":[{\"billed\":false,\"end\":1793000002000000,\"endpoint\":\"im.alpha\",\"error\":\"server_error\",\"hop\":1,\"not_billed\":\"failed\",\"outcome\":\"failed\",\"outputs\":[],\"receipt\":\"sha256:993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a183\",\"start\":1793000000001000},{\"billed\":false,\"end\":1793000003000000,\"endpoint\":\"im.eta\",\"error\":\"server_error\",\"hop\":2,\"not_billed\":\"failed\",\"outcome\":\"failed\",\"outputs\":[],\"receipt\":\"sha256:03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea3783\",\"start\":1793000002000100},{\"billed\":false,\"end\":1793000004000000,\"endpoint\":\"im.iota\",\"error\":\"server_error\",\"hop\":3,\"not_billed\":\"failed\",\"outcome\":\"failed\",\"outputs\":[],\"receipt\":\"sha256:27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e\",\"start\":1793000003000100}],\"candidates\":[{\"capability\":\"wai.video.av1\",\"cost\":480000000,\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy\":10000000,\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"rank\":10,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\",\"via_fallback\":true},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy\":31104000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"expected_cost\":1036800,\"expected_ttfb_ms\":300,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1296000,\"expected_ttfb_ms\":700,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"rank\":4,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":967680,\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"rank\":9,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":898560,\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"rank\":8,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1054080,\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1054080,\"expected_ttfb_ms\":10100,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"rank\":2,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":864000,\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"rank\":7,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1071360,\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1071360,\"expected_ttfb_ms\":280,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"rank\":3,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1382400,\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1382400,\"expected_ttfb_ms\":240,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"rank\":6,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":933120,\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1333028,\"expected_ttfb_ms\":648,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"rank\":5,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\",\"via_fallback\":false}],\"capability\":\"wai.video.int_motion\",\"deadline\":1793000030000000,\"decision\":{\"decided_by\":\"price\",\"runner_up\":\"im.eta\"},\"fallback\":\"wai.video.av1\",\"job\":\"job-3005\",\"kind\":\"wai-route-record\",\"operation\":\"media.encode\",\"order\":[\"im.alpha\",\"im.eta\",\"im.iota\",\"im.beta\",\"im.zeta\",\"im.theta\",\"im.gamma\",\"im.epsilon\",\"im.delta\",\"av1.alpha\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"3fe0b709d0a08b368ae357c7451507dbed9d5634a8b38dde1167efb3d9399c16\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}],\"request\":\"221ae75392cf6478c26b5ad77827261216180439021f1c0af5939310a4284670\",\"sig\":\"7bddac935488ffd22f1e52a21bf550bfbd4a8f30118f87d2f2a132616f105364ecc7799c9392a3a4478f92e6c99286c67700cf1b9ec0af86d63c96fd55d17509\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a183\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:1420588290ca1c06ee2e41760d1ab9938d26b04001d32d560632ba0693a8b695\"],\"output\":\"\"},\"work\":{\"status\":-1,\"outcome\":\"failed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"1.5\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"1.5\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:c4fa8b632107e23d6fbd9d8b653678390a449787ca0ea4c634e266aaff7c2844\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"a8dc6cd68cee6155884b9424b07e18ed853363e907af8d40a7892a7969f3197db5dc874fbb2546da3f38a878fe4f06c88053aba8f1d399dc68f50434824d2c06\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}", + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea3783\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:13feaea2713c78176c3b724e1f878db33a85e4c75114f46adfa42874c9d454ba\"],\"output\":\"\"},\"work\":{\"status\":-1,\"outcome\":\"failed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":null,\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":null,\"movement_j\":null,\"idle_alloc_j\":null,\"shared_alloc_j\":null,\"upstream_j\":null},\"method\":\"unmetered\",\"temperature_k\":\"300\"},\"provenance\":{\"how\":\"projected\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"projected\",\"input\":\"im.eta\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:4e3589dc6160f6773d91f2b7c22e8b6ca5f85cefea0a1b83e9769786e9ee7f34\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"4a92ebeb16f49c87614151da12fd740fdf5d5ccb04f1c6435378b6a2c8d9e94c719642d3bc8e7992f0c0a2c7b46313a9e130720bacfebfb4a510a7cd1a930705\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}", + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:bbe8a143646be82e388b3be4f0d2e66b9729c2b09fbab8799e8bf7b31e69a8a5\"],\"output\":\"\"},\"work\":{\"status\":-1,\"outcome\":\"failed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"0.75\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"0.75\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.iota\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:37d079b5b4da37609a43884ccdb47d406b56a5486d6ef5510ff6ea4b8c0cf3e1\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"dd9fb9cebc6fc1d388d1c81388b9726247647e6b3c1905632e5448ba91c845d611dae69156c261be86ea3c5fac127cc1c548d45b79116dcecf90354fe3829403\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [] + }, + "job_v2_another_output": { + "kind": "job", + "request": "{\"capability\":\"wai.video.int_motion\",\"deadline_us\":30000000,\"fallback\":\"wai.video.av1\",\"job\":\"job-3001\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"media.encode\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.av1\",\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":300000,\"failures\":{\"billed_price\":0,\"failed\":10,\"failed_ms\":500,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":12000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":10000,\"provider\":\"prov-beta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793000000000000,\"attempts\":[{\"billed\":true,\"end\":1793000004000000,\"endpoint\":\"im.alpha\",\"error\":null,\"hop\":1,\"not_billed\":null,\"outcome\":\"served\",\"outputs\":[\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"],\"receipt\":\"sha256:003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff\",\"start\":1793000000001000}],\"candidates\":[{\"capability\":\"wai.video.av1\",\"cost\":480000000,\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy\":10000000,\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"rank\":10,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\",\"via_fallback\":true},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy\":31104000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"expected_cost\":1036800,\"expected_ttfb_ms\":300,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1296000,\"expected_ttfb_ms\":700,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"rank\":4,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":967680,\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"rank\":9,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":898560,\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"rank\":8,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1054080,\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1054080,\"expected_ttfb_ms\":10100,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"rank\":2,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":864000,\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"rank\":7,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1071360,\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1071360,\"expected_ttfb_ms\":280,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"rank\":3,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1382400,\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1382400,\"expected_ttfb_ms\":240,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"rank\":6,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":933120,\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1333028,\"expected_ttfb_ms\":648,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"rank\":5,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\",\"via_fallback\":false}],\"capability\":\"wai.video.int_motion\",\"deadline\":1793000030000000,\"decision\":{\"decided_by\":\"price\",\"runner_up\":\"im.eta\"},\"fallback\":\"wai.video.av1\",\"job\":\"job-3001\",\"kind\":\"wai-route-record\",\"operation\":\"media.encode\",\"order\":[\"im.alpha\",\"im.eta\",\"im.iota\",\"im.beta\",\"im.zeta\",\"im.theta\",\"im.gamma\",\"im.epsilon\",\"im.delta\",\"av1.alpha\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"3fe0b709d0a08b368ae357c7451507dbed9d5634a8b38dde1167efb3d9399c16\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}],\"request\":\"889abf45e6a9ae51a0adb6b3f582bf66ae06cde717416578ea9117fe030ed061\",\"sig\":\"8c88126dc052e73fd3310ff00df12e0976b11af1d23474a3acf448c50d6e50034904c739950bf1c8ba7e2b8da968805ea6c4a8d8f5793aabac58dc5cd9fcce02\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:8c4548f5a0e497ae6257f82ab35a19c91a7e1489007119c03e4a299dbc0471c0\"],\"output\":\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"},\"work\":{\"status\":1,\"outcome\":\"completed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"30.25\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"30.25\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:6080a89fdfc1f6b08ac32fe75f1528dba2f26e652e6a1e04daa6e96a76f66f8e\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"143b5c365dc8ba8e460c4616773bd01da1f6b6ed47c2f28e454c2bc1797e078c09a895fc34aed8533f5d337841539a52fe982dc6b9d3fc829eb1704a9cc0e203\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [ + { + "receipt": "{\"profile\":\"wai.video.int_motion/receipt\",\"codestream_hash\":\"d671344a46acfea98d2478facfb133ca5d69d0f2f9b70b5bed489986a6733f5c\",\"clip_hash\":\"491d3773994b68127e1f6f723f0c56c3bcadb2f2a5368283b1d7b34d72887dab\",\"h\":96,\"w\":96,\"frames\":[\"e60e94568e85d3835d54881e34eed0505b0f7e0112b0822fbec27fc06cd206de\",\"a78107a9e7e97ad5e681c26689b3563d34a30a36d45974abefc3170de18958e1\",\"d6b717a1dae7c70c2c9e493e6dff36b694abc5ea1311c16e9f6ee9899a16c455\",\"dc5b6b1720a7150674650f935bf37f99e094c2803ebb6e0b4770a879aae3b837\",\"5e3ec8e111437e97b0ccd38baea53ec89c7aac5b4f7853f3ba5846307ed6e55a\",\"e928a1f46b13fda9d6df994352fc60dcd02ba5170fe6d4fdb8fb5584e5ffde6c\",\"305ca306259b90d0546943be48ad3d013c2e039459454bd2085a7a4ece945193\",\"7f0a4f4b0edae8b22103f29213d308b86084a72b5e715a89fa0e8ce7d85a2961\"],\"merkle_root\":\"bedabe0a19e9bf4367146033866222af458683d627f688e157ccc7d072c88cfc\",\"work_pixel_ops\":221184,\"joules_micro\":0,\"uj_per_kilopixel_op\":null,\"energy_provenance\":null,\"parent_receipt_hash\":null,\"signer_pubkey\":\"4a29b9b42b4c7b8d947b226d503cfa1ee8b69a5cd3e4cb88b30db023d6d2bb8c\",\"signer_id\":\"did:example:sink/job-3001\",\"sig\":\"bd07fad7565cfd8cf692834c28c37f4175990ea257376a664867f43e00de4edd39adff921bfd4e3343f9b40b7a37c89e4235c34614d5fe09d5da3d5e6b488809\",\"receipt_hash\":\"4de22ebb3095d5bb26fbdbbd4806337780333957d5d4567a727762625da1ffa0\"}", + "codestream": "57495631010200000800000060000000600000001000000005000000cdffffff69000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f00000020000000210000002200000086030000ed0a0000630d0000d2110000531500006c1500006d1500006e1500006f15000070150000711500009f150000881900006f1f000014200000152000005d220000d5fe0000cdff0000ceff0000cfff0000d0ff0000d1ff0000d2ff0000d3ff0000d4ff0000d5ff0000d6ff0000d7ff0000d8ff0000d9ff0000daff0000dbff0000dcff0000ddff0000deff0000dfff0000e0ff0000e1ff0000e2ff0000e3ff0000e4ff0000e5ff0000e6ff0000e7ff0000e8ff0000e9ff0000eaff0000ebff0000ecff0000edff0000eeff0000efff0000f0ff0000f1ff0000f2ff0000f3ff0000f4ff0000f5ff0000f6ff0000f7ff0000f8ff0000f9ff0000faff0000fbff0000fcff0000fdff0000feff0000ffff000000000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300030003000100010001000100030001000300010003000100030003000300010001000300030003000300030001000100030002000200010001000100030001000100030001000300030003000300020002000200020003000100030003000100030002000200010001000200020003000300030003000300030002000300030003000300010003000100010003000200000002000200030003000300010003000100040000000300010001000100040002000200010003000100020002000300010002000200040002000300010003000300020002000200000003000100030001000300020001000300020000000300010003000100040002000200020002000000010001000200010003000100020001000200020002000200030001000300020003000100030001000200020002000200020002000200020003000100020002000200020002000200020002000200020003000100020002000200020003000100020002000200020002000200020002000200020003000100020002000200020002000200020002000300010002000200030001000300010003000300030001000200020002000200030001000300030003000300030001000300010003000100030001000300010003000100030001000300010003000300030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100030001000300010003000100010001000300010003000100020002000200000002000100020002000200020002000200020002000200020002000200020002000200020003000100020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200030003000300030002000200030003000300010003000300020002000200020003000100020002000400020003000100020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020003000100020002000200020002000200020002000200020003000200030001000200020002000200020000000200000003000100030001000200020002000000386d0000c70c909e0300000062165451bf0cc1071c03d179c5157340f01674dc230d0873680172f25e1628cfb6152833dc0b5e488502c76ab9165968ab15f740410d165d520a26dd3a036019ca178b39ff0bc5c81709c6823307c16c6f19a6add50bc2943a0360196b16e0262a0c94a21b0dafe98c03503b0d1786ea52164ae05c0b2e565100de9f19197662460b664aff09adb3041935096f17dacc100b78db77056d7c50037def2c0d54397b030c78e60c454f910027b2ac15513afd16e7801c089081bb00ab428215bd903201b0f5871567a120037d1876151db2590319237c1847b358062cab6f00ffba590ad52ad41639795b0c03a55e10ba73a2034f45391697aafd15ca70310be9f73506b6a16c08ddbc2819f5999910a0b0f00cdedbd30af49a75187f9bd518bf4dff0c48693f06e6a53218c54ed016bd15210b7f50b10680e38318f7d11c0b96c9ed022d3c1e01c72a4b184a87650c7fdd0808fdda1805db83a717384c300b730d4e03fe231618fe36bb0b47697615fea6e40ca64dfd04f2bd5519b72a30196654f6057a94b7026435720b420ef20bd325dd028510b80a1c69c50376657f152c0b7f0ab645451924a2970bb5443400346f6302649e7a1716309004761d901541bd5e02908876151db20502388b9d16e174171952c0a00c5a145906b03e16041dac5818b44be50c5105bd027f6fc70130aac21745ea2f0d24bac30b3c26ac079beb95174db4270c5ed59503df5658012f9347170143270bcca3660545bd2e07cafef417be0a340be39cab006a113119b4e7d60c54b92a0517a0bd0103002e16d8b5470c63a3530946a9e106a387b218aefc7f0c0dce870898b7a815bba5d10b9c31120114c2f91847012a07438e2f026e2d7218820b190d5a94d1029b979d15dac2b201a854b309b3bf4b189f26ce0446c28615cc693f038e5a520b731ab2042ac9cc078f728d1510001b03eb0af21710e1a90c45c29b0af59597039f15dd1896b5301865c3090bea91ba00b3e36a187d4d2c0b1750890bad359b03ddcb1d16f4c5d717f7996d0c1babbd0cf1f9e30089a782187841c80c67e4c5012b8e3d17540e53198b44650bacb53600645eee18caa88f0cdb9aba0353134609e5012a17db1ada183b58120bd9f38c00ca58d418f8dcdc0cba92a00b41f455091d50331845c9a00c5d3b930204578c18a981fc0ba9f4c1013101c20c790f0e02a9aba616d5c0ac0bd3189b01d1b90c0b8a86b500e6170017d4243b08451e84151bd9e7019e1c8b028a95eb0846664e0240031002dbb1291722ce360b0d344e06141a761838ddf01843436d0ba20c7e08e4b9c917b456ad15f18dc50c14a98f0906bf130a98b7f618bab0121958b6f90b5e55750923ae0017646ab50c8d3a7a0cfa15630274e068195a528f0c97d6640681828400fac7ff1771fd430b1a1185065365ae1725a2111938f30e0d4435ee01e8ae7d161e5384163e4d7e0cb76b35031787e81740bd1d0cc862ac02c2ce7919bb41c6169a7e3a0d37f2d5097ad273152e8bff0b3e5a1701568a31070772c3024d57040a84125e01a3cf530db39d5a0bb076891565a1760a9e80df01b2fa1d07a8b151054a90d902d062cf18844e560d47dc9c0bdd411607052563054e4ffc1657e283187ea6880b98703909a89d1a076a48cb15a253270b1e52a8023f95f815c1e928166fe61b0c242db2085824361639364c16d1b4a70bd9738704f8c9bb05e55dbe168fa9070b438e9805a7b1ea038f86ad182fc52c0d5dc84a0246df5a02512ef11526540d0de6d050045d449609df4c610c96560a097a80150244714817bbfe890c85383f00ab023c0c76ce900a7cb48d155e6f2f0b02fe40004ae4eb169b0fbd09785121072f6a97081f9d230245c8150c28fb6a03654c5a028cac95162e82871507a7640100bb87193a0a150c26c78a0b9ba46d0aa703090939a05717e210af166b1ddb0c287b430ada885c016cfffa18c7dfe40c7c36ad018b95b316e85f450dca89240d88ecc108676b4d189e3c5118fed2dd0c007e4108b225720503954817a1050d0b9e4b660b7c291906a9414f192e1e4c172f1e540d5ee271068c525117c8229f0ccb163d0d46cfef069ce15c1674350f0ca9746c0b198434024d298d177356a90c59faaa02cfcb6e050e74cf07df4cc51580856d0bb4b7cb16301e1d0a39af7607225ccc153f9b32042fdf8315ae37bb0ade6592153e3dd90b76ce3b07f81b1b163bc7eb16e9a28d0d339bf20a41815d07f77cb8096675ff15070c180d4542310b98f022052219d918cab3041794cb260bcdbd1708eb641e018522ae1872994e1099720e083c7d570a3d173a1953b5010d875fc105432db1062c9cdb18296035178a65700b885f9806f77c3319180f5616df8ac90b2fe332010a8aee181c26a018ed283f0d13297708a330cd15cd39c71724a2a50b09f3f000136b2918869cd60c54392302fe6385160f884a0bc3215d03c2ce750c687e8d01c57cc70c5ed59a094f316e19852d880061d97115757a21033486b91803d4130b4b90a8002f81880361c06f1adfc43511681afb0b2d49ae064bc9a002b73f9118a5ce200ff4731b118704840bdca794078c4d26180f883f16abda130cdeceb91050fd90066623cb1d9d25d1179d95060d2c3c790b8b20b3022a776b163bc72c0c5105d704fd8d70050dc60b184d022d0bb3902f04962c78170a2e750c4e51e50baec2a205751806185a04b40bcd3ddd0bfa953c0026db781771af2a0be5b6440303c04219738e870b9b24020273890316c6a7c018475aa90b720d76009f1c970b764e09038dc33618756d990ce39c8301dc9f0805d67cdd15940e800729cefa010129ea16470c4902ae304d0340ac0b17e6968a100a27170d186a1f053b91e416933a1c1679092e0d6dccad0a680520049fbe1a19cf2e1118dd5d0d0c2e494c08acc20604183f0618b68eb60bc0603604bd4ce108d572b615c8ea30183ca60711fcaacf095cf2330332580f163199f80cfdbc850339e23519f561050d04b253017d413d0680e38e156ac83603c958700335dd201621d9aa0bc17a0d0abd4283192354f6170cbf930c7ba9cc021f6867171b474f0cfd49fd0c576082041c0d2716efa3b20c38727c0151ae8f008134f60719e8160208dc8d15eacd3e02380b73153de4fe018727ca15f21e700b8391350d66d72504b836280753c1f6161e058f18afe6cf0b94a26f02afdeb318a6c3db160b7c310b1cabb10834338e17195259180064b2183240c10e5f79600fea78f0033585c3094419d517b1db820b1b91fa0af6ba9c011b8c07174f508a0b0980700327891a16eb8cdf0c586de80a18de2c19836f1d178321dd0bfc228d04183f8e052bfd2e198fbf990b51f82e022920cb0644c79917c9df670c1b1e4b0d576d780a9e15d515e711ac182d82aa0c0a0d6d00331856163df4200a9f1a52004836be0b7b1ceb0743d1b4155aab1f0bc0edd803b27ca2187b84760c00f10b0e86d6ca093762af06aa3c581600b2061b786eba0c7c36a20f5fae7005f4fb2519cc92a8159b5d300dc214550acd84590647a4221749a81c0d8b2d050cfa9550030fe62306cde0c3151eacf80a3b99d104b0956b0254f3f516a38bd50cbc2c290389fe4c18cf0dcb0b2fd678034ec0701825f0e218be20880b71005600479fa316f8dcd017effc3d0cbf60d807d9ee8a1864110a0dd64c2a01ce34ee0217872b18b6dc580b3424ea072f1d5d0114c2740c829ebb1726daed0bb9050105b559d50883bbf8151093130c04328500ab822f17c47aae1727daf51042109e0f304f4f0c5907710192df1919d419580f31a2af00ec9c5e19a9280c165193640b0ec148007d8148184c0dd00df4e40e1185292d05c90d2d03e312f1157e585a0bc4ae2e011b8ca50642935b16d57de0175dd8530dd432200326b2c01862d9360bfa088b01b9166019e3ac3d17fe6e8e0c0866ef00292059171c31ac15ef4a0e0bd6cc5c038d83570dcf712f01365d0705282544175d74a90be42943003c90c41702dfa3186b1de30c990a1b0224dbfb1689c9a70b9863890a57d718025097480cffd6b20927d3210d04bf5205b27cf001e1d25a0635941506803fdb0a3a91810a1d5000181fef4b17c2deeb0e13cf9003cd325e03cedd62182b07ce16b6356b10e7bbf00c328a2a03697a6917161aca1582c8ed0cc7e22e06c8ca4901390b4c17f81f93169372110d3c40d402cf0b351824ad5e0df9fb170c464f40006e5665180601c40f8102ef08a47d7703f947471932dc600bae4f6a0cfcafd609878954187dc76e0c5a14020b030b3007916806162a126219b7bb2e0d6a0bcd0252c5361901a7f90ad0f17b0ce7dde507c9086e170000140b23a0c502fd0c6117c87b3108813aca161ba04c19dcf94101d843a515075a2f1667e5100c34310a05a00b38034243ea189d47d4161f96740ecaca4701cedd9204d1aee7168fbf591876092a0d74c10b0e40358808c81c3b02f126001670825e0d96568f0e663f2a0120a8b618050c250d20f90103b628dd025f027d1969c4f80ae20210089a4cd708e887cd1729cfea151cd8fd0ba1f27703609903187fde080cd6590406719c38026e2da218fcfe4c0bc0ed620c9e4bc905296d2b17b6d10d0dffe31d0229e09418a83e680bb2902f01c6936d17e0742117bdbc6c0b1ec5b3007e18961516d99900d615da1822d9580dd10b67001b8ca41585f5f715595def0ce75d700006d7f001f1665316fa6de90c9c3e3211a69b1b04944a6207b502b60510a87818ab815a170517e40e8c67b30c129ce601a261a31873e76a17a110a010c995f10b7db673010785d116c516cf0ca54d790c6b98b103f35c3816a6b8710cdb1a2009dd65db00560ae9168f66a80b4caa280127b27616c6002b167bd2fa0aa20c53030dcf8118e6c3820c253a0808e4671f07fce92917a1ac7f0cb6d15609483e580233efac06879d611953aac01825e5510b1ec55200d7d59c166797570bc53b5f036d96380ba30c7604a5ca2d03c8c1d916f68e4d0ddedb6a0120a84b0adf4cfe16e2052f19b6789f0f60548a001519671842b24616aa33210e31135b108b327a00d855c8048ca9d316af34210be4a95a05d5d39d08827342181a8a7f17be20a50b731a0206d99c67031fe8b01657258c0b4b769c068d43b915ff63751810c0f10c89f98e01ad305117c2d3a20c04321f064ea163183f7a44182728c90bce57490155f3771836a5bd0c6216da035b5db0010e4f8b16cd4f3c0c86c52b0436cdb4093fac67167fb11d0dc1fa6d00ca983a188a4f5019a053700c19f7fd05048b73185b52a8175193af027faff8184c2e421c5a3e4419fd794e1128fa9b0e253d8803766a2a024a8d79091dfec816218b111f354a2011663f4b0e1657a20ba7da2b014015ac1805c95c19d05b4f199ed8400d93afbb023f3e4818d5d63419f308ad0c5ec89b060525400602a412162b07e917ec76b31001f0890092dfde16e03ca2186c3f4c0d18ea57005cfd1d196b55b30b8d3ac20bda8dff00693a731918686e0b4f51010bdd34b3017e18e517b11ea417771f200d0f5b730632a86e078fd3a6150765ee0cad427d052ab5d5017e58b817fdd29c0c01fe510af620f716eafb5d16fd84461047c63c063c30a00059b85818645f1f1ee6b1d50d09810f11206952091510a809fd3630185bf9a51b9e77d70fada4b60cbc2ca9112c7b3106ad665c0416afa018ca65a5158121f510c6d8b60100a4d500829d0f168216090b464f8f07128a870993a61416e86a4a176a1d71197857370f92ffdc0cd6d957029c6e28198b4f450bd980950409f8671775e7841758731f0cb2109004fe7e4e09324c1e19d0a94e0b1202a70b7ed0ba053438df173a158619fb4cb10be6d0e4000f26541985a7381976092c0b128f9b0aecfe5016dc04d117226a550c664a4109a5736b087db93e063b9609094f40b9187cd2e915f799491904bed30e1112c30e7233b30deb3c98027faf291949eba116f699681120da0d11e9b452014ee93308845a28164cd54f0d36d87301ba6d8f0611f0c41702a79817acb93b0b4fde75055b0b60062aba700100bb5816d1502b11b54c930aa9e50e189a0f02196ab9b20b8ec7570082c6fb1529cf4f1915d7220ba974420c220699026be8cf17f9bbdb0b25479b01f52b6a16dc04cc0b1102ec05c591050699b29a0b70f3e000fac79318ab6bd30c4876f3052123f116a296810caecff3059c384206756f4e027f183c170ef7c61659c1cb0c0a1ada0b3972b204405a7a0478fa0f080bdfc7154e5b0719ba8f6810e7bbc70018079c08498b32162597f7178717f10a4fde16036d568219807aad0b2320c707d8ab5a0344f1de03c72bb41ad8e1550d3fda2d0fb52e9d0098527d1790458a0ddf311f108b141a0a324cc9092ddf0f1788b3550d7cb6c4007372f2084c6377170e451d0bcca3a40c9e4b0205f872691609928b18b7143d0b8752180240ac36166e4a530d1e523b0b00f1a3000db873153a3dd501c99871180064c61580f49a0bb651500454b2e905c9649702fb1e7419bcc7d21986e24c10304fe507cba27202cc060f01a461b21ef2b4601ad45b3c0bdd344a0e81c6ff00099c30193e372016f4bac318631c660d7be234008374121678f30b0cd7598e0e98cccf0403f1c4034cbfb0164e6642161f055e0b6323c00064de2302a5cfbf16fafe470c50ebba086f079e0acf0fc718f735720ca3993c0525a47a02fea35617cf66100b0ec1ec0096243e184d66ee0a35319a0b1536d304ce236918a33dc5177d20330cbe537f09a1f28807489513167678a60c6fd9540131413318d2452418987e7e0baca87c0d3a689e05f3b88a04b0f16f189e742016a7ad8510ddc0450f5eb55f026199571ef01ae71ef34e2910f081b40fa238a311c3fd5a055c53b3055fd444164d66b81879dd79114f39ab02c4e5b90180efc51660c23617822ca40c6a98e60bf908b906c9b61018d33a02195e10ab0d2b46e50728204602c67c141819b6610b3db3b202c13739194f888817b86db50b4a10e80099a9b8171bcd560d9549b709d334041902eaa718fc9abe0b07e6e40b8e47b10748ec461958b6570c65ca550be8dda7011b0cc7162454bb0c73a7cd089b9483181c101018c137140f4691d4104035be0fcea5350003a93207ef37aa1eba5fe81d8bb05e1dc4a96c0e73e01f10f302580b1d4531093d216603ea057e161b31740fcd69f810d7b724035b26d603f78b01185868f5168d71570b26d4fa06dfa3fe1570346e16bce8880c26d4990c6a989700f7c2c318f962490c990ac60c5d3b25081f9361167662ba15e81cf10abb12250650df7e0347b61119595dd60bb9f893026e6dcd15bc84dc0c953c790ca399eb051f93251899300d17b3af200dca89ac0a357b960ada886a16c285b30c3758f70b3a19e30363f9df162fd0850ff3206a0de868b90d72c26c068fdda70396887507b31b6316bbddfd1d40387c19a01bcd0e339b5d10192b610d75c1610062d9b10064875516862df710f0b6850ff0810004e3d7c504daee0d17cf6672107cbd220d03a581048fd81617d0ca22166e3ff30a77cef40acc309c023f7e0217388fe90fb85c040fe7bb6c056a9f5919d19e0d18e21bfe0da0b0530c8b136a0454b2bd151ccde90c3b99f902598f4f1748a8a40c16dd740ec05e48023fd52d195ecdb3185cd8040bb49dbf063aeddf0845b8ac17f055e30b21f99608000adb09d9e9ea160438d815f983740f650a9a0fdace780fd846f10eb8ebdd03e23327034e29070986efc3176981db168d39a0170701a70dec1e7003a8bda1053c351c03e82e481873a4371b914bd8103bbb130ee09b82036b680519e396da1555aab71e8d69480e20875a0b10e8a303adbdf0003f7edb1850d6131182fbb80c69fe6509b9cb111649eb83184db4cc0bd5bf5e07ea1cf20577a80b19b9f3c018bf58340bf6c7400437c3a618a7a29017d4ec820cfba2df07a6b68208179bfe18f6f2bd0b6e3fd10beed219036019de166997e2169dab5b0cd7e659044d114607e7f21608fd368b1ad031821dd61e9b188ceb4d1f0a21170f1dcac61075bbb30527dd9b0acd2d4a025ae6c6179f748a0d0e55f010e56f49002f7c0608a75f591bba69211b18e7cd0e439f4d0ee20ca306a00bb204bdff3e006b912b18b44bbf0cd6d98f11db38c509bf29d90139a24316854e7016ea548b0b6323970e17504a03aac21218df7f1d16334b470f1aef1e0e991f59061ad4b506f81bfd00e2bbe1187f4d9d0c14365004cfc22d0424579c1655033e0dfcaf0f0c90ee3905afa43c1931e72d109ca04b04925e4e0a7d58571c17d2df1c0f4be71e9a430f1d61eebf1a5c53bf0ecb06f810a03f5e0f294d720fa338aa08da3b72075e8c4509803a1f17fb4c15170b66c3110a630a0e6001eb04c35d2605198c69097292e3167e0a5317a38bb50d4e225e0257cac3057e013304a6128516c9becd10ddfc050d3ecd810af9ba6d18caa8d9185be3f10cceca870764ef2b0988db2217b2296719082e0f10c104e2086fb58b06aff62a17314bf40a8e3a720c0d347d056be77e16a5e42b16e45ef20b5c216e0724fb5301da9a4516ac81e00c253aca09756541040e659c17029c1f10c7ef9f106ba2910850df8101afc70d05e5b9f60593593f1ccb3ae91a23dfbc1b559938169f26e716157ef41067e5660edfa271012584031b4f5a4017f3827918e8adb01101619300f7c2630ae0eb0f188a44d117047b3b0e4fb14c0e35056911650abd01f5abef16ebda0c19bc8f100cd3a5df0098126c03f8b02c18bce8cf0bab1b7c044700eb07591a1517c090e61820a1c41513aa850e11d62011c9e8bd0439062609e7ed32011ce33719a606460dd900a60312e17a0aa4cad91723b8500b5f62890fb00734079dd25619378f7c1e2bd79d103de9c30d9b89de041380030abf2e5a081dac0d09015c500490d38803d2525e059f15971c01a43b1cf6bf721cb320bf178d184e0e9fec9f015080130a36c87c06986f0f17e3696b1d9b8b681f79df6c1152496a10d711051056d1e90f7e27680127f2c40529c9c1152fd06316f21ef70fcf0fc60ef02e360a6cd8a3089c8a320a6af1f9181c74da157d0a4010f8b83f07a33589046208211779e893110b3e0f0bd866f8028639c715e3c26219ba363a0d37659202bb448619e5275318b809580c6cb2e00820d6651669283610923b15107900a61116df2800faf0d5096e6d651fd6f5f9195547f91a3fc76e1c8b876c1f354a391033b90a11b1e96411a4c05d11ad9dff07a94655001b0cfb1810cb33164be0cf0e9a01500fa6d7d50e120b5a11fc5773079865d404a48724177da6e716adfc611191e1bc034cc43d074b77b605ce7fd3064ff3bf1713aa31194cb4cf103833450d064ca4020c381a19a475a21c27b7811096261b07b55eaa011ccc1417ae55c017115c9b0b1db8330b2d3c5107cddbd715da7ea6159cf9160d9ba48e04419da518004e4d193a0a9d0e557e5606671e0a02379dad1531996a1f08b0b71a46fc6510efbd5c10058f951016e6771069dedc049ceb0d08e22e180177b77317cd876a10416ae8107bdb1a11dd4fe0046208a107512cac0276b752165cf9b3167db1af104faa670d90e87800aeb0e401251bee1e320cd50d8002780e1f34310af963780988db40041d5ae118447bc6188116560be41c50012f932c1684a71a0d9288c00ffa401f0412e1cd181fe4d60c2a88ef0e79e2f201fd0c2918d102cd1572087b11708d120cf1866a012396541697945e0c2a88e10bc6c8fe064fe92f1f3be56b1c5dedce0dc3042f0fd5c52e111557bb10798f05099fb98a034943cf0af686bf091f3cff1c69a82e1f41a9271febf0551adff71d10dab0810fa72a47068b0a270607bfb00650e4c71e4462e017a57565163b0a0f0f64115d0e626b5a088884cb018ae7a2186da3d21bdacd4f114abfc50e10fb150e304f5402bf32150438672703c0e0d21dab1e4a193936f30d838a7f1160c573066dd843013418e11564801f16b1c5460dca16aa0a5785dd0a89196817b3c5e50b1a91290007850f01c7d3a5159973710b0873a50096e43e1bdef7771eba2cc71a4ca1871a8448d6104c29c20e57caaf107b4c8501eac5d60a8a0fac080bdf921e35547d1cec75a211762507110f194207e749db0531b78a08376c42025117e91e38a7881bac8fdd0e3cb4a21050fd0401935f18021efa1719d250051080eb980fda922d053af77c02f414581b8070fd19640d751df110480e45d4350e3de9b1018c55e7073013fa19ce1c2519b44b8519ab280d0d89799f10ababa40037dd2802d94361168eca98188591cd0f9ca0570d74b47803df8dbe1837fe4e1682d3560c6a8b2f0b1db84608c02990017ceabd154b7c481eab99cb1a364a841a40bd4c10c432a70d1fff4a018f9a3f067db96a02cbaf7d1b23df4e1c4baba01c27510b1c57006310f9475a11b909650e465cfb0f07f94702825d76042dee761bed0f931d4b6e801c558f120de329bb078bb8b201c1e08819fdcb991a97b3c00d767fba0ebd8a1c0fb07fe20f81a8fe0278cef617d930f116dacc2c0cffd6b503d39a280a12dc741960a168194b875c0edb034810d4896309b8833e16db256e18b6dc9c0bcdbd440c3d401f03ae47c418ee55a11b1e07b60b428e00010400d808827804081601010561179c1cc44d381ca007c01d19e7fb1938bbd3195948481080e46b0f7bf9a1016f6dea0a3ebb960a63468617799aa11e2145bc164538671eac8fa511a8e7bb0e371c13066446cc0912dc14091a7db003039fab15aa812316b809b20f22623a04ca5a9902195e19097479411b6522b01e8ae3c918ea8c831171c29d10cebc24097e016706b88d44019f1c0a17f31ee70dea07fe0f773c7908680fe1078ac2f40172f26816950ed30de17d740fdd4f18062bb0e601f454dd153ea6a8151fb7440f3b4a6208d94aef06d42fcf05f26be00047085a1e560a2e1f0887e4151ce3921df759761b68b2931d71251e0f3c61701115e654119f3fca0451318c069bf0c00985f905165b043f1a5e3f0f16245460170cb4c211378d8e1194da720e8922cf0407c46c067c71a806d6c4e5056e77b41653b5711de39c5d0fe53a3611e615d4026ca8c204ef3c7c06d100091d2ac27019c0f4b00dc339c801435ae2022909a9181fef6e10e5a4ce111b24080aecb1c005ff796d174944fa152bb9950e9ac5670bb644c00214824b0553bc3318d572521fc1421a0e4791cf0db471b20d83bfca040b3ba209f2bd1a038cecd91a3f425b1760faf40db31e2f0f78e9df102eb0830d350ca603cca24101ba9684002316c51d9241d11e0aa6601ef7de2318b213000fd226ae11e5c2330e6821890f3968d30e29fa0b07d100e3060d229f0420e03117a8fb00170f9eb61904670e1ae23584186b550d0e1de86f043442a70708592d09d99c2e18b177e11718b680110068290c14a96a069aa87100256d781953720217e210880b5e48970ca8742c0a0d6ffe01a89412194ea99c1106a69311f865a50d061ee40e2dec1e028e03930785ac291ff5969a1bd670151ecd45c00e0086d110ad684a052972c50a0fad92028b7eb61769286e16922f6e0de68d830fd1625911429f7e0da72acf09141a7701fb47d0193aa7271e05d8711c04af8a1017fd7c11b1e9681147737d0f5952c70dbd30950033014f092c40351bca96c11d0f22b60d6464460e0f8a570f4d9ad70655f5f009e03d2018d0669e1639f3ae1c815c640ebf472b0e1012d40367d1f8051bcaab15b8d1791cc9fc570ced45b800faf0bb008b95cc15665ff51439548d0fa1b02310b38f00031d630818b40860170939441ca9ad74102e92d50f6dee9411ff505b0562b62c0a4a25af009e2e3800ef618218edb9f81015c8b4114add6810ab3ad70f4463f70d43d43103e08d981d1e8ce81d9b8b381850f7011d6956b415057b760db9453710a31a88025385570259f86500ad99f81ed5ffc61e8701440f74151311eb077f0fcf0fb90fb59fe502a68f9c0a042f380690ced41db969a8182907b60f9ca0be117ae2760bd9f384079c38740783c53216221ce415d4458e0ea36d290fb6f2ee063bed64043dd4cf00d3f9471b8329c61687dfd31e86d85110b763960d7ae2ca0d78e9680d2adc010a380bc703f5481d022028b11632dc190f8f424b14acbe410f0daf4a0ff6fbbe0ec3c83f0ac8c05e073af2270268e31c029d6e6d1d09b0221fd38eb11675d1940ea9b2b20e4855bc101f70d401b5ba970771f3fb02431ab91946257b1a4db6be11cb8e8e1033eea20027323203db1a4418cc017618e4e41c0f68a9c903b836680617f7bf15882dc51dba5fda1e4180b9160ae0af15c643031089aa1b07ae57830a7e53ad1783a7631e6403431ec944020ebacd2b0f995b5601191e8008cb9dc71dca1b5e1fc94e401f34b0c91c90a7da195e68be0f8583fb0e2b82880d13d6dc0ea9764704503b3a0541f41405fc4aca014f40ea1bbf890c1bad14e01cf195781b2c5c141f7bf4e00e7a88cf0ebacd671103b4d00ff97c6e07eb1712039fdc0618d23afe16fdd2be0eef2ef801007ba80a10475617de5dab1819ee3218f68eb810212d610668bdf306e7ed061e335e5f1e7e51930dede2c111a67d350a1c5a64031b0c3218e2b71a172e29a2161203eb0e378de304d066de08cf1e9107662807098e8bb8086af6651e139ecc1a44e71f1ed67ab01b9c39ae1dc5765f13ebe658104a4ee50f8e0dca11fd3922075cfc7909acc76f0411478f044fa19f19c242101dae522b1d029a2e1a1eb53d197e90e80e8e0d1411ca1d6604ed552d0a29687b034bfbff1e0a4ad10fd999ac0ec3046211632f48101a2bb8009fc5a209cb4696172a6bd11a3e566816f2d0a40e7696690e4363ea0394a1150205573c1aba5f32107d10480cd8e6330a409d8c0190f1b11575dcdd16c69c970ed02d2102b09e4405aeb3e609eda21a1b72c9611ab973971dc82f7b1a49bfb31177e9c5100496781044275d0f2b829108259f5405597bdf07ab280a051b78a800fb70e71e96e66c1a0085ba1eacb8251d1c778a16b2ba95100d3e13111eca9410b4c4240aecac5606a05dd10408b5ba03d490f31eafcdf2153ca60b114427f1105624ed0dcfbc970392ba3901e7c0191b902cf217e76a4f1e1743df19d1acb20d6a1a3310b28f150fbd199e0018476202dc71031db591e11c593eed164f50280f4e0443101539860abfdc4a03df0d6a165968251f13c77d1ece12671000d9891347a37b0eef6a6108310ef604f734bd0661126d00ec5caa1ad532591e65f9421d7bcb2e1b994d1b1f682d7f0e46af6d13f8332d0aae055c02f899d319c4dcba1adfc44619a3326b0f6382a8100ee4ce0d8d2b3406e50bb4097479b106a1536707fde4141b8fe4871b1ba0661d7797250ead518f0fdc74e70d3af7c2073109ac0af872ae1b20a15e198c239a17af4abf18a1ac270fc8baa90eb353510320287309dc1d16085f828c180059a8185af9c90f7b4cb5104db1010cbcb95a080dcbf403b5b56a0a29686919bce8c316a6b8830d6cf5c811f298900ef309a90f0888941118856f08eb1c8f098abd920ad7ba6e1d07e3ec19d866d91c5aec901b0749c0103e3cb7103833b8066becbd0aff6faf07affb2f05132ee00a0b31e104751dde1a712fee1cc2b3d31b41a9f50ef37a711066288c0aab7a190442eafb08c0299107b043a215fa57181f3aef261ed7c2b00dc375170f89e6ff0684b19604de13ec02b24cfd175367c619f5fc161135c95610cf9ed30837150903ba2df21881bd7a11824e740f9e465f0592bf5909cc93c107015c610856f0520a7eaa7a177a84291d75821f1ed5ff2d0f77d21c0f68e5b00fed8ff9082219cb0657eb8000e076bd0aa664cf1df96e991ccf6efc1bd714551c565cb6109bc5170ec5507a0e8b8ce10d9e4680044e540304509747066866e80201129c1afe3c081f96387e0fce34c90f4c65070ec8d87e074c119601bb6d1106a578d7081a78fe05ffcb971a2b8fc61d42c8901e52ad2b11c4df78107f209b0ec80d480e07f9b802d6be911a4d3b031a05af1b1e2bae4b1ea6989118c7f5501089aa591202125808a0b4e507e13d0301721bf61be00ca01b43c83e1aecd1e01800164610a85faf1171feb81081552e0e3dd28008a2f2f705fed50b030f4f581c3efa361c8200e71c6403fd0d3d96bc10122927108d85ba12c6e3cf06217f2f0288505d1e51324a1d78120b1d52e0161a2264770e4d0b5a10e3b28d11b353dd0d373aee00146b160417aabc052c4a340785acce16bbddb219865db50ef1f20c11e4ab5b0a4fee3c02522ee21e162e711ce86a0716a9f06b162fbad40d49198c0dbb739711ef2e840817a07603784e46040c88691b90f9301d77ca0c1408fe64138dad180f2c99b604c0dcce0312e61c075183d302479fbb1a1cfc981c86e2291a0672410e0fc65b0e0343b30fb3e21d0fa5c00f074337190856eb92088ee2eb03ed031b1f9b399a1bb8171e1c84ecd10ff619520eada4cd1044eb680461696b028739801ef8fdba1d77a1af1e6f10d40e5f3d780f7ef2cf0d6d669c0e1422d003f78bd00146c8e91776bbdd17489d570eefa6a7110881e3006dbf1c08df56620868bd7d18f962eb15eaf0930f9cdcd60997cbae078096fb172633f81ca011d81d2283a40e79ada714e7f05811c7676b0f4cf43c07855f110aef373b023aa2fd1951f4a41a06f7bb1aa7eaef0eaf0e11154a16b00dfa299207bd4c62065183d50ab507b5090f04471d31f7381816259a1a8b5eea1e5f54b010cef82111aac9cd109006750d30c70d018aa7af002396af1a9ef2dc1e954cd61a63696416d424b50e6f41d610bdbf6e0e5250460f2cec0e09873777041d5fe606b97eb505b18b12170992fa1abdeff316a8f0c511d33dc10d04430f1139688f11a923560657e60f056fbf8f01b4a3c3020369581b5c7c161fede6b11d1e59601dacc2820f296be613968b1a1512da8506d15773068cb37f002b779c196b423c17f8783f1044b68411f99a8511bc19ad14f0d2ef021d236b06c4aa8c047b2edf0a45bd0606076de21df076ba1e2d71a419278ed512c4eb4d0f5f5b530f81af0209869d05099beb7302a7261219135c360e2cced20d3e787b11c977b905371a2906a42bf909029f671b4094ac1ea8095019cba89a0dc48c700d9ba713013acb3804e7a58d0aa2ed0a09137b7c000400ef17a675b70fa4a2d90db6f9c31087cf4204a8088008fa63ce0530740a1e9abe781aa95bc910a03f4d125473ac11fb40a1101b7e0c0fdf13af07b9d56f0518f73d0455a8ac191eb5471d5f54ed198aed510ee1b9960f70c92211e97f2010b64c290e923bd7009eeed009c7211f04b6fde51b4439371a5e495b1ec09ed11a4019860ffe8cc2118f42571130c0c402af87660103e9001ce540451f647e3219c0588917d018451c6dd2ac0f3a4a72107707481060016100d1cbaa017e416919ed76280f78adf90da4319b01b4a3280a6e16890281c6fc1d3fe65e1b49e86a0efa9ad811970a3c10bfd6b1112034e6023d50211ca813cd1dd0fe661c2cae001bb60c7c0ed2269612ab435e114c5e57030212e80a9b99371f424dab1d5752141afb31e9107e63120e4791c20e9b723c11508cca11339b1508934fdb04f734550104c03d18fb41c516273eaa1a81eb1a10463e4111f010ed105db55c0ea7665f019a29cf01fa30601caaadaf1eb4682819e6d9771a84528a0d8255f30d7b88fa107d10dd10ce69710391884e08dbdaa81defdcf51af0d2a81533dc290ed518d811c5e9d01464396e07ce7f080396643f07644ba41c5f35661be354251de5922d1a793b4310ea96b31385cb9010b64c0f0e516e57130312be0ad42f12092e2c4b04e6afbf062c4a8406ea82ba1cad33e61e61cf801e2ab8fb1c0ef9331c8853e21003968613701590133170650fd928c206a0b4d70a84086c04460f860ad29a8008339939086e72ee1cda29411ed0df601ee6b10919a5750110783c2d0e769d6c0d82e464001ccc811eb491131c0215ff10ede2ed0fa1b0ea070b88f1098182ef008779591b0a54ce1ed0df9a1cab47d90d03d29f0db207b50d2818cc1283528205c8c59c090d1d700906c4d2095baa9a04ef98870affc63d1a9337d61aab47a81b1bd3991ea9e00c1ec825d71c91ef880fbfd61214f3c8f00f2ec79a03c9694b0a23b370080c2cbb01a09cd00abf389018218b531ae84b8e1abf89191fa0de9013bf7cb510b6dbfd0d0a815d11c339de0a1cb1bb049bf5c9007d2a191a357d9a160343931c3fe69c0d498a4013d23aea07024d12022832431fd23cbd1d265bcf102e9200100717830fc2c877002e25d2092d364a015a8f831a424d921a4a8cdc13a94b2b0fb38fef0d2cb7ae076afb19030db8131d1fca581c6718e2143268b81024972e0e4873c20697d05307751d470173b2a90ae6a07e1b2828b41dae522e1e8bd944172ab9651f48bf941b3fc7e10fe43ad41026905e11bbe41f01d5e7d502e669d11d6518481a0eb117110500cc10a4ded40137ddfe088d4d001b0ed0301c6455e619d08d171df2e7331753039c0d086a980ff420ab1340bb640dba7368057e5d44037bd3181e3e19651a20fda21834bb8e0e51fd5e0f52c12903678c4203ee4a901fb18ba51a7010cb1420aaa41000861f101d95350540feaa03b7f30a06f270f01cdc90c519783bad19d55b5311ad6864117a17080f3c7fe310d7f30906fba61906fb54c205a010c2065e963909ff1d221ef1bef3192c0a9f1a926af31d7acbde10995baf0f171b091473887c02cbaf4b1c4495ee1e3ddba41924a22f104598d70de97fd50ea13f6307e3248b0a615f11068f8662072a0cf2199c06d71b2665d01e0215b81712f85b114c0bbc0d06003c02a87d2b073e17ce081896901ba7cbb91ef878121d0a7d0c1d1d3af7132f745612527d9412001a600e86297d04dec1c803cabbc3007dd3cf1e708b2f1e642cb11d375f3c1241bb800ea274db0ddde59b0dea7f64009b80de09a9ea1c097331ab1a06f7c61942fb3d189472ad119fb7d01243302111d864690a419804076cddb403ec12991cd250c61afbb6711b5050fa1cab47fd1ece8d5012a2e2ff1014401a116c48260aba6fe8039b4c0703fa075f1eef4d381c246fa0120cf2c61102d2fd0e386f9a11306dfc0ed454b7026863981c46fcfa19b72b091f9661fd0db7bd241362c2ec125d553808165d3606d954740809fd9d1ded0f111d2da44e1bd008d01b57d7fa117de5a613c6e736157d66750a50e45f0972ee14041d084f1f8935141f12c72b0ed3cc2714de0eed0de066a813cec91407588a43002909c91b16a93c1c1204b41d4bca231c3cb2600e2dce7d1203917f07fd8d0401227fb70480960e1e3ff0ff1a2da4721c4e279c1e837b641d7507660dc0b8b80d2abe2f03c613e100b38c761caecd9e1a9389f11c59f6021d33e33d0e6154fc1024eadc0634eb5e0686f4270747fbbc02b34ceb1dcee93d1be2a60311263dbd13844ac810d126790954041e0a72e96a0149b601044155151d2da4cc1e19103e1ed05af21b8ccf99199fc91311fbb11f155fcc9e0e88b1d811fca8aa0786f4a50313e1e91b9e44af19e1e3301a1d440a1e27d64c13efd43912a0eaf409f820a70593b53309809607070ebc2300e629011a9055281b847b4d1de1e3c20d5dd3620e526e980e2dceab0f342a870678fa6408cb4bfc0903ec1719fdd2c71eb4e3c81d5eed7f1262c60f0f7b88e1109bc52811f9d62b01678c430a64e5fe025a4fe019cbb5de0fa9760b15c176b01441b7db08fba66e09e8e313039fdc28053f12501e8fd0881eb43fa81d9360e91b6da97c0d3bf7f611288eaa0dd208a21015757011d4012c02fa30db197c6f5e1ce440021c6ce6031b02cdc319b992e511f93305137fdd7305a7647c0646665b024115171b7812031f412e131eabc2590fd5183a157fddda0e3933d90e5859a505a9468503aaeb030489d6d407423779056fbfe61950a2db1b4224681f40b3071ba6fefe105150bb119eb79611f209c202081c520a02f6830a39f7fb19d250431aae851a1b7726ba1ea0079a1cb6e3f10f91caf40d93706700c7fcc608d711bb074570bb1d9f11bb1b42a9211e87afa81d0b9c8d123cc95f14db9b2a01502992019576d51a76a16410c48c5113e108f710a0ec970f6892d0118ac1e30368c2a502941f9b1ee79dbb1a4443751b5df71e1aac8f350e844eb60e84a1c20251806e006635771bbada4d1e3053c01d4e084f1abb2c8e1ec35764100325f7125a612213682f8f0fd6dc880a4ad3a409e8e34902b3cce91c15bda41953d638186296401ea48d560e5524a10dcfda3b096cddf2061f468c045b10b20a35dc871e0af8281ca550eb1b1c1bd1142125031245ab7d13c1764f040be4820523701b0115ab2c1fd95cc41d73e87213d62e4c03123d53009e2e1d1d5a670a1f3740e21c41dc171b106a031451003f0f161b73149399f801c67c2a050768bc1b21e9ca19fcace01a860b8c1e09a6f31c666a1615f443730face0ff0724aecf03371add0571f80306d15c390007ae511e893f431ad346901ab5e3581ddd3453148eab2f10b21e730e3bbbf60d2e3fc909b4161d0a2b4f2309a6bb3609e415d21dcf64211fc8fc071c9456551eb65eed1e201c3613f737821380dd8112b3a65e02303cba050205cb1dff3cf01aa48da21a3101e51188bd2715e7f27113202d3b0915155f09fc9c000754b7061cba36091c333f5a1f1962871a6392aa1e9d81b60e5560030e4b30c20dbff441126ca20712bd842d060f0417073d7dd30399656d1b2fb9ab1e021f961c37c56f1ef5c9db1b81eb781d7a83760dc58c940fc960f210dff57e11b8b62a11991f140f1cb3f902c57c9c19d7eb191a0066d91e298f690dbff47914e5fa6d127ee1ab138256dc06b09fd506b04d94070c88cf06d0b8a319bf0eb6195852e1198701b21f84d1d8130506e80ef8127e050ec63a09ab2de403011471016f56b01ab20b961a6d8ad21e9bb4b812e4feab0d7e81f6137580400f4ba1420f954b1d0a2ed5d409132e3d049211040a582e691ff095021c91d0c71eff65f01318c61611104e4b13a3de6b04279030093e1cea04af57a50471f8940835dc8904a396110a3160f917ab287d1eee2efa1ce774d9105bbcb90d1739af0510a3d203d2a48a029248aa1d994d9a1bee8a3f13854a8213e1081114de935a07b6abbd069120f20660caef1b0315cc1b6da9361bc26bb31d926a050e9416c611b898f60da89b8d0a2bfda80a32adbb07a3e8d4038c05c7063074b21e14421f1f7dadda11b1311d1244af2b001bf52d0790255d084b20d205316a5c1f5fa6971c2546dc0fb3a67e1442b16103680c5d0454602c0a09f87e1d604a7e1bda00671f3d56b41dea37f419b167d60dad33ca14193fa60f5c0f3310544963021f9130013aa2711a6af0361e890c780ec56e700d54d85b0fdc03fd133a526913b12d6e01a8e6b806fb02501f09d95b1a36cfd81baacc9b0ea00a561383509012a9ce8912d4b77c08010a2e066f16380514cdfd031fefd11ed398381bb7d96e1d0a73881977a1ea13ff1d66139bfa6305fedf9302964dbe1c5a3e3b1d213baa1a9ef25c0eca42eb1290a1dc03b1ecc606f5f65a00b968851b5da5161f63360d1d7682fe0d5fea44109ea0ae1183bf60111de8840a68619e027e81811c932da01c39a7311dba88dd0fd3cc3f11a13ffa0e099f5a000bca7003e00d671f56e13a1e972ed00eb95c33138daf440656f5f40702aecb02407ef71cc51a4d131849bd13479f98135ae2e704ca0d750886f912077431851dd484ff118daf7313e9e8771220aa731382523f0451e4bb05af05fc039f714904747e431ce77e2e1f3b189a1c7c1dbc1b6793aa11fd39f8146e17650745bd4b02669e111d2208361ecf080615231f7e12c5e9d3089f15b0046aae50081385ca0490d8d9196b424d1db9eeb91e72252c107076b70db0d2d5144999e90789756b063901b705eb177908fa59da0447574705245cbb0456f0041a7bcb861a44c89214f4c217148fa7a612bb8ead0352da0d0144438a1eace1ce1d4f7908137c66a61421a6491388bde70572eee600a678301c4896aa1b2c52081a5a153215c36c5c14c6e5cb139510540f9095350ecff80807521d0e0aa8a73a03dedfeb1ce10c291db81737128bb73d0f381ce603d49566010a1ce61d0c03dc192d7b251481d96b0ef8bf6a0fce697809d7ba5a04f1849d00c149881a021f041bbd93680dfb5ef9105aa58114087b8a0759cd1809057ced07635041055183911e93b2d91cd183121a5caf0c1f0315141bde2a14127d649a131749cb1448206b08405ace055eed8b1ae703e41b8a68e90d78e9ec138bb15412cb52bc0398cb4005be9e43086355ea1ed127c0194db6b01cd008191d73c9be192e1f0613f3ca3f129593c20ed536a700491fac1c174dcd198047ae1abebc501ec72f990d5c69af0e4c654112fa338211b7d4e5079727d606e13d9b0a3be3e7034eb0e21de5b1411eee38121dccd4e9139df2cb1140710414728a4908a0103a0354c5ac1e4c6e411d6455271beb2d8e1b89baf113f63be10e147c83108d67d0058ca91008227576052790861bdd342e1f1f26321b617d751a4510431432684a1394181c0ab22aa31bb8a6f8120e6ded1406872a159787611434648e0a71f37b070d221e031c8c2c1e50c1dd1df4f28312aebc37140deccf13968f8403161972067ccdc81d6760011e32689d1d8f88581b3740581ed9cdfd132d7e3215afb284013113db09af48eb09967e641deb7f4d1d0bbbe90d98d36c14767ea8139c79210f5e44f7113bcdb1071ea767094f4adb1cca6d191f5113881cc1199d1cdfce701e1906b31156e848119f99ea066c340301c1c9721ebedbce1be473841eabeb2b13b523ce0a35dc590064f0511dade1be1a16a9c5147d62f4135e538e1232eb75072648ad05611c5c1fad0a671e5c2a3c1a1d3a2d154234ca14ba116a02e3e4941b5f87fd1c03e2f011a06d111484c92f14728ac206ae05b908eb6923051f9d5007cb4ba2083165a4196bc7531dc2bd571a7c987b1e06720c1ffd98ed0fa80c871388bfdc121a416e0abee6cc0505d82c0006c0281cefa9801e46d3481b525bcc10516ebc0d0a2eba063ec04f05a70d130a6a4de81aeca80a1f3387bc19cd4fc01b380d1615ab41751440bb42124a1a5f0512ebe70767751d073074c81f053b0f15b521a714bf7cd213499b7a0787efdf1b21e94a1ead8fa81a9a243a1c85e21513edde8d125f4d640244c3bc0216c2ec1cc68ba21f549007158fa7c913ba8e650ac25d020a766581091b21730552d04c1f0501011a223b241f4db6f61dbfa8921e5209c613cc52f20fef4cf113edda861007db9a051efe0709128a6a01f654a41e0248281b7d8e8c1a887234117aa6200fc5c14c1510de9312b03576072f8344006dbfae19eb2d011e687f691c322003157fddde11068b7902bf728e1ba679ff1cadd73b1b6d0518147aed3412080209074dba8b054b2ae31b6f9f8b1299067514270f690643371f0901b3c81f4225181517c60d1434e7bf01997b361b4744c11a6f9fbe194a59d41f6ace3d15f933af04b0a426085b62e9099688a3038cb8391b99d2ea1ecec0251e4cc0b4136aa69513b0b2e51235641202af70bb0771fd4c1ede2ab71a966bdc1a4e8d1b1bec428b0d48e4091222a45405dfb2e109ebc58305a850db07c5f21a01278497190ff9831a6a4c5f1a2b66941236dfdd14c85ebd12a3e29b0910a8ec0a91c45d038950eb1bbae4371ede490c14a8ce0113d920b506597b9d027620aa1fdc9fe111c7e1c3128fa5eb0858dc0407a57da60817a5ba1f70932215eae6d514a6d2d512e8ee9d05fe3630053dd9fc0576c1021a08355f127c6cd3121eb444110daf960206978104d3f6f31b3669c01c1ce81c14fd25fa136d9ce6007184f206a3e8211d4d8d761ed432121f932db41b7eff4d13777afc13fbaaa40a278be609e3cdcc097240da1dd246eb19d398c21cb353a81cabccc313b0337211f35ce711692d4b0afd3b770608ba850077a01c1c256f0a1dfd6f2812ee5d82129df6d6034800c300e20d74056689cd1cd814a01e589acf1a3368e012a8d253096723ac0ad8547107a2493a02cd6fd41c61cf311f2598551ec44dd7197682231581541b1557e892034ffdb41dd45b431cbc4bd619397ead14f53f8c125fcc56017760c201fcc789197cf4a31c1ce8291580d7a8145dd67312718e0f0f2d0a2209fcf3670aedfe6808236bcd0ace7f5b1cefa9761b7c46341c43245e1d24797b130606d10e314f3112be033e0772f38e078dfbea07a2a0111c66c69419df490e1bbd936812508701031ffa0020c16f36128e2c1b13489df601a233fe09bacb72055460fb1be98927132a0b600aa1aab31a9d06611c397e6d1bfecbb51d6303ff1294161c154d89a913a5578104c31021029308a21d2732581a02cdad1b4a59bd1baf5291133ec1d4122713ff144a1429073c8c7307bf8f4e1b7b6fb01b26ea281c6da9e51351027d06cedbcd0707c43c1c91d0431c0501dc1eaf71ca13db1a7e12326c841351fe4d087c1f73050443f6046cec570ad3e2c91b96e6ad1ba531681d0c692e13290bb01263432713c1f96d0299bb030565eab01fa96ca009ee4b5a0acc98ac1ca8eafb1dd929491e41b34a127e600d15fc259505607db61f2530f81bfb8d43156ba255135006d40974d5a7074a34de1e76a18f1ea6f4f51d32ed7d14566b78106db98f14b913c5049c99e705d85ec606f084d01bb167391a76070b1c1c1bde1a68e5d9112225c013ba0f2412d0c5c50602aed6039b517900aa3db61a954c7e1cca6dfd1db1e2001f771c9f12d7ad3812d534e51142388a000ff8fc0584c0210713853f1f01c3e71fe691e3134b12f0036875b31f51bddb1d8ee43313d7a7eb149a817c093958701254790f151c37e803cbac60078321911b9a1ae9194562d01f0fa6ff12c3ef8c0a0807fc1e9337021a5b5dd61d66bc3f15566d3914a2e241068b14d11b33877b1bf7595d1474866b123dc5ae12fb2bf300aabd61040ec6711f4a711c156c1fd2120eeef90058ca951d676afb1bb37cde1b067c121ccbbf4315a163a0140212fb07c4aad50146b1e7044ae2981a68e5db1d97bd731e8a35d41dd6a3da12604b7014eae85115c172370632adfb0481911b0231d3bc1bc7ddb31fe037ca12d046bd004fd23e1eb5ba37132b828813f8b6e60e424cf504a9f969041e5581048049b11b37bbf41f34e795138bb71c035405501b434d6c1b1fdefd118a38871332ef8004c4011b1ffab6801b39f9ff127d64071453f69b08738d940744d11e1dee612c1b0768131303145704f790b9037c24060681e394192479031c24a2ed19d7475412517f14144d8d9314a5daaa022604b61b27b7371c02eccc1c51ea42127e62d31335e3e0034575c40851313307ad70ff1a6ddca91dcabfc31af9fda81e1c1be010b1e9891257ec7912b3acb801c4cefb1f61afee087a8a8102ef8a1b1e53d6c81fbb506e089f717f0819e39405a94b1508282a651b5bafbb1f479e140f870be505d019541a54ff311ffda2ed1c3b376e132ff52506d348340787ef1a1a29c2d01924f4391bbd9d9d12633fff11844ede13040afb02f4fdb01eab70d81cc04cbd1e537a841475820a0729206b0225ed0b1b1f82171ad131e51ece1250146f15ef13e579a8079a04681f24a2401b37e4421d6860c214cad576140310a111ede2e508d24ddd09e46cbc058226c40a30c1ef1b2a3db91f92881a14730538156aa4c2123cc74f120391c0077ffc171ed05a271e7ad5ca140cf02712692f711253fcd506799ebc0aa6c0b21f5b90181ae6b127126ba62513a3e2ca04770e1305bfebc3099d85501b0a7d5508c085dd08f219b90516b9241d9c2fd71bf16c071db65e2f122b0965017432c219eedc041e3f1996143dc50e15bc092a149e71b814f933da0496e41b034c24251ea8b7d21a68e59c19511d261a1cc9f71246a7f51146a5280f5a523304ca0d6206f27003090a9c361a8f5ffe1daf1f681e9d4e96132f74571484cd9e0aadbd7b0408ba0e09b0f1531cd866ad1f398d80138c30a7145fce28120e698c144724681d9f965315aa6764092643bf1d5700081b31f73d1e307c931f2a7cd811815a3f09d763b2066c3e2609cd37031b5ca51a1da0b5241feb9eea11c3f12113af3589020e78d306371f730082ef491e359cb11d14f0d41185c99b1358e8d9112e7e0613f6bc3e058e48fe057c24341e0f18f01bdf20961f265dc11202956b0fac510814f8b4bf088c57dc03c7de9f0a7a8aa719525b3d1aba880512202f2714be0371143562b6060959cf0af7d8b21f4f717c1276802314a94b4707a8accf1f4f179712c85ead055f8c56150fce660a78a3fe1da364481333ebf90362691c1d162ef71f08b4f912b8984e000164f803b936451add67e31b4e64711d7897e61cf78281139f7126087483a801afb0b21f092d2714c2f5590e06ad19136aa64d03c48e4a0235af721e19beaf1feb377f132f76e31f70ed8e14f14f0714e20269130d6f8f07f96dfe1b03ec3b1e46813112ad41a003cee0b509dbdf72061cc04d1ffbfe251fa5a27512db9bd711527f4f0370adf60843dbb705bb6fb1077e06381faecd1b1c7aa2e312e5fcbb0acde0ff07ef417d1f6eed23059e2efa011354ca1f56631220b2040b145869d90423c75a1576340b20d7ccca1347a52202ddb17407a1af4a1ebb747408eacff11a98dc381fc4d24f1ed127ab122f7ad405d1b37c1f7039b51271923c03c7d30b200b5a2c1234e58a0584c057096f11a001fa99df1fe5be4f12b69e131374889204930ce91a60a6271e265bbf13231d2515d7265c0824052705c9c56d0a18ed9913b2aee8068d525905522c66051e03da00e800d81c77e9321c7a31ba140781e50dc632f207c873830598cba61c8285b11d2c85c91963363213395405052a1bd213048f491576ffea05620dc71a2e67b714298ac80a4c1605056a00121f31200a1e5284cb1f37babe0a7ff78808377169085279ad1f5cdcf91ec380c4140cf03712b0357c0a27dde205a3441f054c20791fea0adb134d0ab203e32e4a068a757705227ab709cd89f01b7158d6111eb2ae14009b7e00fc474a01252d921f2af5d811ae393e142125e80078f7300884129c1d4180691c92c69a1e4896ea19f2959413040adf0eb471b412b621cb084a349f1ccf6e91195fb02413f4c48c13b2acff00ec45a01b9da0c21f5e284c14b4a60706b511eb138ea7a0131eb29107f366c5084eabb01f7fd14014990212067d15a80abacbc0083f0d4c1e647efa1f4a7105055374d71c3ddb4e1d14613112a7d6320606d3941fd3262b0831134c0458382f048da96e1fa95b9812b4a88606e65dfa07325bf11a7010251fda7bf3114c12d8147876a01462452f0610ff69047a947c1bceca901fa33f5415a5c3c608bf8f9519a0638d19992e281ddd2ad61953322815dc973f15f443b301a2738f0aff224702c73c091a8e36a5119f7b39159a813f0364c7d801e8c00d1acb112e14cf42b8079307641509f78c1fb9d72e07972ccf1954a3f7113fc3dd0037c6cf1c45dd081427154f0a5abeff1f0187d214499d4b063e21341e7964ac1f817741126c2337098b66e11f977a5c146ba6b2069a5bdd1f7a854e06b9da530213d47c1bdd90501f0d888113893a3012efda2304e9e3c6001e630d20700c3314d040ce132a09e3032b637400f57dd81f29304609a2a08c00cec6c91a436c2212557587127fddc112d6b1300405e2a21f6e1ad21420a87a0633fac0054705c51ae3546f1cc59f911339d30c1486c7c01439d5e8079081931a02a4101ab25d821e040161157990741fffc1f003954a64155aaf771b08ba2e12fd29e707eea2861fe90acc140d6f9e062ca69d1f2030d8031667a5038ef64d153d421607e8ede407a85537032cb7e01f56364a07fca1481ca7eaf71fea83da040aa1e81cb873c008217f5f072f83491a47aac41435603313ee57e413c7e38f05f2c7851fa9e53313f8b6e607cc463805d257fe09245c9a1f44aca414e4fc3415471e3401f4a61b017760d81eb96908121dbaea14c8dbbb07e6a56f1ba4311b12a7d67908484de50add18b31ce254a91dcdcabc19a508e313740785074757fa086a52d203297c5708282a0b1a9ac8741f0b5ace14e4fc1e12eae65b027c53f91f844ae214afb2750a69ae88047e0b841b196c0c1519458907076dbc1f1a6b871306066f095ee33506a0be431d12a8f019d7706314ebe6ec03d3f6cd1ae6558514da1e721365bca3067483581d3ea8a31fb6aaf511f14d190af639861f82f058153253c819e4ee9a1242360014d3b9d113c85c3b08a855c20935dc5501716dea19ddd80513097b6813d3b7b112f0d6b404602b211a24d5dc1e8b2b0b14030ec312adc09c06ba272c08043e9d073f12ec1c6d2e711e4061651f86afc51a5e919214060247044d68721fc4e8d812b898f511d1bff0034b2fed1f62fb8c14a94d950a0768d21b94d1c107fb0286071d08c01f9aa7c9144f08790675790720987af11f801d821444a97c00be04350456a8b61ff9eeaf062648c30029f2431fef80751f181f8f064f4aed1f65cebd1279f7d409c080921fc7bbaf1fdbcc9e0381910e0932ad091d1093b31cdeafc61b1a06691da7cb5a14259834159bfcd200df08f80374312f1a743a041ed2a29d196e4d2312f937a606ba793a1b34ba761fbdc93d15960a150a6fbaa51f20118c19acf5bc0ec3759f12e8719313d532320788374f08cd37a71fe7ddcb0a7a8a0f2079df401450850f07d8b0132075667c04a5d9ec1a853ee90a92b5521c9b62b91fc9da710abef0761ddecec6099f6cb11f65a16513df8d7f05e93aa60817aa171233eb7b141cb6e411d1c1b4072d976305ead98c1f107967137af323053ce3e41fd026ee038a23871c42d26d128db16e08076d690aa4d98e1a1eb5c61f4f710f147970ee11537b63069268410264f0ad1f6e391314afb8cb0363039c1e783154144b12f8140704de006fbff61fd726901f35c8e204438eaa0afe2c3515fda6970892bad40a86a2221fa8651012d3b94714f0d08c069b517c1f1ac52d143950ee055504af1f72932408d06b8903a9a7eb1b256f33057eb9841ff34857127f62670a8503c31f85f0e81bd6f57012a16b140737c87d13c17aa71f6f0c451b345e7d1489b7c90695eed11fe1ebc8135dd8cf036c43bb1ff9c142141bbad513f935f309503b9a1fffc19a04ab89b81b1add101a9a4dbf1a4ffe8007ecbbf41dad85b31ecc82311f78dfa312184b4e0740b1ed1f477ff5124f0a6b044e5ecf1f1b98a81431ed0a121dbae2001cf58d1eba7ee214c07c7807653c71023d396e12ba92ef11d8a7e513e7731606d76d6c1ad6f5441db9401e126c23ac1457e6641faceb991f8c96741ff9c1c5099ce6b41fb1b860157734d91fe8b06c134c14740062c2d21f7a584e05aa9848080070ca14d0c3db08eb17dd0518a07a12462aec09cfc78c1a3869f41f4e1792122f7add071844e31ecbdef81de469ce08e5670115fba828150f65d70aa29b8202a0457c1ac8fcde1cddb9091ae688061fac8f5f146831860507c96b127ee18d14f8b8d105d5863f1dbdc65a12a94b4a0413380c12125d7e04d0199f0313e1281efc5af51d8d17901a9c629c19ffe05814aeb6fa09aa3cb502123dab1970e7891b969ecf1f0ed3ea074389eb062d9cc407f786cb1bf978761f2203631542afe604da9c4d14643f8a049bffae085a1ab61f28303913d926db0674daef1fd7f99e06d39a2507cf1e931f7bd1d205b28bcc1f0cd3481532e735150197d605cd93dd1f22b776094519bd1b22b6851c7377e71bbabb7507620deb03ed082f12d0468f147b6e1301a48ab103f7909b1c65ef301568b0a60783211220a14d1014a74fea00665e7a1f8cc3a51442b32605f8d85614633d0107c362831f82a4221259672109c44e9f032228320a2fd0660a4b25e9199f1122153cc71e14d6ad6914c1743a042cab4f07f270861f47522812cecbbc143f40711f942efe0685b1c61f99018a1f6228ab0482d9c704e93ace1377fd92032d4afb1f70ed5e157a34b41f0ed32907080ce31f3022b113f2ce921f8177a40421e0881df0f165157a34dc1ef6bf7c1cd45b10141f2f2613fda808060959271d76abea12f0d6dc147d66b7068a1e1120a5f3b914777cd20741f98f1f87965006bc0e9019b59b981fbf9c801f15f2ea111a3f8f13643dd61235628703b9dff51f9701781fa1f394142988a2190bf840153852c51259676604d257c91fc3e8611ef306f9146149bf096112071f60a60220033b6415b43ee41f77858f0a0fb23e0924b3281e333f9b1bddb950592e3079cd353ba0d17baae6e54e862224839082e84c1b9989b5f07a71e3178283d0060368c27c6531dacf159214e2d1f1b1fff94f199de7deb25855d36385537de42c6e79be628d653980a0e668c0afaef4ab205b2b2759bc372f216a71000c6d0a504df2aa8a4ce3904047251d24923dc0a48635154bf5b87102ffcb17d32a49c0bc8aa14c822398aa654b206ab04777151391d72ad53df48ffadfbbf3e07076282d4e9d896997e0a17a6745ad269ae85f4071c36586b57e3c18a7295b8385ca0bda063cb18d4029afdeee657907215734f015e21ce78ef54948f32731ff62870b47d7f9562c6f2c047b508651af0884f411c325f37237d1d9547499b95f1c305904ba5a99149fffc6e19ab753ad8b3c6c3999e9ee8d0d6b823b88a98026b6f0c9a5c1541f01552bd28503833a38962f584f9d61426925f794922faae9927fbcc75a4db77beb715b190cb5e54eb28868adbaf12e9ade38e65e328a3ad51c0cb5c3031df15f91379fa5db15888f4b23ce4f9eea437df44bdc342699fa56e7adf86bce50554cca32a59b4842297bc6f04f0c3b9fc87f7180af97fac2ebeebe5c5626b619be71c744f8419917e98836daa87eea8256a671902a1e30045184b3985d5eb04286b4a14acfaef7abb53f8a71747e36a9f931dc93b0d4176ae9df8400f22fab2e955a55a070b17a8d867977227d6cd7c8d27b17b9af0e8fe456f71dcf2116abf7758f22af8f1f3970bcc22e60b1f3ab66a83909b3529a9232fd4104eb958b7ff199a82a3ac372cc745d6cea09c57a4f71d7d7d97b6d4bdb5dc87be50ab1832fb8651494dea51a432decb01e942c0cfd9a65b70fd477d72507ba739130ffe03189a14469c7a53f334e64dd7c445cb23723a2862066d1bf7f7d5f1a1cd4336bfab8f1cb89f82ce50f13540165cc9ea0440dd30b6f2626f1a82d838673cbafb175e996048cd9a527c4c474cdcc678310fbcc31c6d32f42bee809963279ff37f53662b259034b79d86f95e70e4b3c94128a3f25a740abfc5d00bb9fca3e98d314d0b156bc5ff6deafc1907934a8f99c3b4b475cff798d6e66dc45fe27071fa2f8d6a173727b7d83739218666ca7496fa1f598b73a778e3d1dba5bf1abfa79f795d6bd2ddf7b8c7b6648a5fa11774a28275cc98a01d1b74d0b49263a2eade570983f40c20f2b7bcf5ac3dd7df1f00f3cdf92998972ec837375a5a6ec37c90d3d550b27261496fafcf8e34259f6e3e381df544f271c239cf2ea498d98164ddb8e424cfd973d5b0596d6bdc1a4c05026605827c1d44b272178fff95b6b9638feb809fb0b4ddb1e48ffe90575b8ed5231ad82305ad63d61222309632c7a81a5007066bfc757b4bce08ff88bbaecf6091364bd23c3b0e256e5a01d884f8aba7ed34a0663b19ae2103aebd4f519b32e283efb1056c62c9f26da94eec5aadb9b1b26cdd7b5006ad45ed264dedf7997f2459626197a1b9c031971b9ccdaa28d31261e62bce637c00e4b80f868825649f0c82529df35b6d4aa3b9831def6635d33c6db22a63fb24e95a3e1761828bb344c985e45aba16830532f3ecfc39e60d6b342a4a37f4e32b7162a81b6e668619804e0104de5cf608d7988c861838ee8d1da91f1c3c81d9a7cb9f74d44baa1fb43206a9258bb7d6ba70ffac1586a2aa2e01ce308ecfbffa122ad1f8d7c961c31b4149ea7ec400ae4498355b0beff23ea3b162ee57fe80beee564a82f38861aba4ba833db88f3bd45f38e96cf3d91916368cbcd3262c7620cf891ecb7c943cdcc5eb2483ab7823bb9cda440cf7f70f74e87503bd3aa09c733aff0c822b9ba6f45b68ff35cfdb8b28528e487e6bab0de37b90af7bf24c4cbd43c32375471ba52f6313f2c7c513fe28254021862438802a260d976dbd7909b5b4b630249bfde795051e58239aa024c935030f496e2d1c9c463d50818b5cf8af970c225b8d889370ae80ff5683dca64a1b7051e3aad3b3e11819fc13c851ff5a2d2ba7bd43b7f67b9674c37856134c3575e815afd690995d0d3c1702dda46492f50dff8bbe7132164931c8d6e710e930b8170b671f99ecadd24678849c138e8c65465274e4540cab8b8febe316bd688c5662cb296d6d3564c3c16c546c18e4f94eebac7cb86e818fd7bf6ee8d8c9ddd4ed11886bb7d0d314af61db4b78a41cb4357a0e15bcf3b237bbc1fb5ed6775231f6c3e2a1fa40b867dbf3de6b8c672d3b33bbff163bb838f34308c9e4ffc1a2d386f33d074c97d037b2274b9ceba3b7024b3770a1af1f6569cbad1b730892c9f3a4cce1ea9b3e0d4fe514feffcf87cf6ea34cc5c7489182ceeba6a2de441a614f66b8e8cbcfc5ed2b4a9a1986a58252affe992c12e981db3835090637ce5c3de6944e213bde57e902db9e05a8476e6be90d22ff61133ee751665e4f44c9fe4ce08d1e1b5387a696ec3675afe2194fcd3eaadf28e5178252c4ecdad3e3a768a9b0ab28ac6862898e409c55e2a13e4fb271de2e6f4db2ce34234b883b342fb99206342053c4349f84691cbfc0ba5f7a171f59a1c533eb96743fd2a0214afab5bf9495f989704e3152d2bc4dfcf055e85201e8b2f7556d3ae6f34bc47bb815021c278dc788c12616009d75d0ee90b2b23febd2cfb8560311936b249a81f4c8e1198e4a16c94e5f4c328b0c737b038ba6dcd23b44f281e440962929574d8d53c0c730732faee507067f1f24e1574732662872a2aa0b3dc61e202d5dd1248a09e6210b2d630d4e4f7369fb8cfd9adf979934f67a73e03989f0c0f7492e2d40d7be16ee2da06bf0228f63fcdb054edeea507609dd2be1fe7a1067c4c71d19d7e7a6bc705627616f681a06cc37612f7c839ef240eaa31c2ee3660d9b3ecc29f3ddb4d925596939419791950b8f0c235b7cc0db4262bf1fb703bc0215926ff608ad41cc696970667227123e3dbf7b786a3d1baef4821876be98b4b91983b71505993df2722be5b9b94b280e86f5c9c3ae7ad4f4c97d47037b6c791be38769f9816392b985335296d72dca208deab6f77154b474c16b23fc853b03ee9e1f58d3e27ef5ea68f6c50d12de4bb24b77dc4540730f69ba1e46de73be98128b63b4551b8c9f586edddc4f983f9810073213dbba3cbfee07088d238a4204b2e3367f3996975b95a5c8dd3bdf08914b827ab95c4a3308be68765d790a0593673d8de893225ae41e0dec5f36c37ade7687f9aa838d681ad589a9bfd105bd0d557b8e56d6603e2cd20f2f8ed6aad6b09b5b1a5bd5c0346011380b0399bda726edf8dac4011535efc658b2a2c1fd5a96bb53efc52eda2f51fa65da352282274f558f3871c9cefd0d5ae6baf05ce17a9a2d511782254344b639875b7c000b7fc46c3406486ec192a9bf8f1ba2217d48042d86c94ab72972d4a698646998526c068ea11939ae33982092f09b3cf0d36b54ae9a04e9db87883f912de848f4620d22eb1ceafcbb4387c9d6696b4e1758ef62ee7c4f8aab4083eead67c880e48f6d298f1c733b1866f82bb01e298ae7e947f06f56a277e99eaae9149d7cf8fbe688282b52b6b881469dfc9b974638517724de68815b465d78d651c4d16c286f0fdb0b462e68013bfa1c95365222cb6b5ac5c3424dfaf4ac0f0d51a45707d4c5e495b39e5b9a7fc090c688f2191943f26a977bc76618db157bdf211a198c0ca832c422604677b2b7fb82d467286ed6f9a094e0f2ec8e3a20e7fcffb5b8d5a98bd4c95895e6d304425594bc4db706d593f81a1ab2f1042e7566641abff0fd63abc246f887a467ca8df6639774f194a100861d0882019b1b672ac3c315a7dea84513589f7d8bda571651cac5a3423c0fdbcdf6ec62dfe26785e3dd7ff4d553ef7fc1cd0e44c9bed5cbada2adbc2da21d91fe2a2582a915cca7097f1bef49ea51ff7cd66a01ba13e7418ebbadb8e2e2aa333687022e95cff7d780b62c6e6d1200fe245ae0cd5a69f4b415557057c03e631441b50b4da985c646e04a72c5153a6bad88fea36c1a0b79f29e1df86b61021639014246aaaacffedd4246dce64e9ecf7a9c62090b52221e01eb9d4a79b85af586c5ea528b6297f53d4d8fe0bc78896090a0e2703339cae8f52a5b2b16016f7e7baf7d7d7103fae05fc6d71c533aba4208164ff5ef07cc846150d61a9c4afc9ee64bd9980417a24422ae76abb8cf2bb17529dec883113215bda13416da6b47eab264d5da584362b711746228329fd840084ebd4c3d015bf9a1c60ff0a559d288888289bf26a4a7da9d4c9f0bead67fc5dc26bd719384fa24ca4936b0a74119abfdaeb216a576b6f15ddf22fa4eb0ce6f9199e33ef785b87c0831d4c191b60fdde3b71aa7b08d538056e045ff23e3d341172f02037e139aaf9caec309cc71cd75c06ecc54ea48f4b03af3bfffca0fabacf9bfe43cfc6394982c69673c9cbe3875fe77afe3e94a7ac666e166860d913a07ea99fa8ef9f836b5d83b5a8903c6f875e7d66f4fff05a59644e7449bac4c6ef2d2d394edd951589a9daf59e7870989d77cef5fe43546c60c5137bc8941b4e6ea8544a695fa8a2dcf071353de07a1a87ce52313ddff65dcf169f3aad652d1886a5131d7100fe1858c1d1f572a5c5334a703668fffd0262213aac80af2d14fdfd429ab1cfdb4556371821f28398521f22955721f79f34dcd1b82cc5ff38470b3741b83b67daea7e4d9b31152ef9f3e73b0bb77bedb248f920740b4244149cb18f4fda5a40103b23c97671284148cd29bebd88eb5ee2600dc0e6d2e05f99371ef741ba3ea3881784632e714fb8fd2d15b99c96a9c66750bb2197fc3981b1cc0f227a0d9b812d20efd9c2f34e5d60cade6566d9f3482ea18820d868aad3d33976a338409393afd50884bd61be4e8e356f3c6ecbad2ab5d6cdb708475f7f1be967ff4294eb808a687d8965ff04d747a3a23a2c365497ede7d4a3bf171af4c8acd5463cce0dff5be5c4fdc02a07396be9f8feece003b018021af2c6af2cc39353afca81346e941902d688283282d122388520867bb9e4fa3ce991793908d8b5d67ac5b72e5d20dd23a340296f91d15af4f3f8aa900be98f250a48c4f686459af45efd81ff499498dabea7af0cf784197f46bb330dea65f43e608db36dd29212f4be8dca88053d7edce836377667c44aa402f4514892d0c2e8ad3aee480ce2e198d59586a73c209fcfe0b4194c268354f00e218fd3e76169e0856fbb5fd2968e7bf3498c1a29e0ec68834d213372814a72e675098b4aac9155e6a03b2d46d32c0f7620b0c6b4a26535c8c991e880829a234ad32029cf7d90158076c5586bc31ddc71212005c595d77c5876c622b8bf73291afb0eed80a4ea4a3f53ce7a83c580d3df209fb18cc9c988445b315aa0aa22ede86e0b7410be08468b32d6dc122d95af9d43d199cd59727a408ff7951922db1351b3567a24c777d01b7fd49a9deee71cb97334afca88c598224246e11ce04c38db3e1449bd2fd97e98dd2899f8805bee38b8180ef329813809e6263e19d2275c8488aa70c421bba00bb78b38aa5fe535572b3be755ffb1eed0e74f2d4680faeea7927db3a6b5b858349385f3fb8ec31a0fb9b071a59b278a9e9046700ad84f336adc19533d20c34a97b6296cbbb41c8dfda679621520e13c6094e8f644d0d41a6c4d175536228507ad8a67b52ad9a37fad231a1fc0498ac3dca0f28ac5218dd91c73a98f168477174467534ea1c94509302d174738fcddafad9d1977bb7e50d4c22131a54468a5daada063a8f76d357440f703246a2043e92b54d7b14d312f4cea245f6f6cf80e7eccda2e506dcade3487207ebb002519fe6382a1b1c9e81ea97527f390ffc1a091162246b08d28ee2977b76d721dcedf3da8c85b4375d801519654b7abcaf4820387c25d30a521db6254eb76fe5fd6040bd2a368a3f2943e88ba654db7f683578b8fb4f7f53ab76b8ecfc261bdc66d4050f35a30d5f08b329b1e306bfcb48782d524c43b496497abd73b81b68b4d592538dfcb1ce654568e18adffacd5bab9105dfea606ad3d2dc34a9fc7a0067c9b54f60c331d2da5c3d9466e83d9048ccb89c84f5fdf8019b9d039fd38b8d49e62e1234775b106474cd71a149bec5206b9e9afbdfc4eb739ff77183637784eedd78ee17624e8a031c0253697bf3603c3dd3313fba797685626ac14ffd4d0dc28b98b0a4847d86ecfe051411b83e31c3289396f64204ad0754ff835c39d39e2e183d89234f06e8791b14e6fd0c039f37f40fbae0dcb1e78154cbd16b126a199f421ca025fa76309297f790339c7ca4e59b017fcca8da2f6fbe4e1a5bcad262464fd468ff5c34b2ffe4f2c61317cd86c9262c8a1b9e7acb1eda639abb53747081586f281105695d2d22b0c2ce447730b09226e48b27c19ff5a2048b8532165e932f0190d1ba1a5754cbc76347385d0db0b3361b730d9a2891ded37316961146250b2c1c3693664c1c1b575751fd2f05d2c3ae896bb87662ffe78db1bee200004f170dc6d96decb37c75a952c4d7783d01cd0b2ec85e7a4dd0590088627ff2fd54b219dc40289d1bf5adaa9c973ffb110536e41b062c910a69d2656f96cceb972bc58049f4051caed924279ec89ff0b229e905ed75a26264aa6f92e5416c05b30c041f1e638cad15fe225715dbae0ad28059fd92cf6b3e5e51f5ea1202a7778ccc046a42831382bb70054964006b976b91e258a0f5ab5b26cf8a511d470262fc26ac72fe40f82370d0986f86488d78f991122dd8215206aed058c5705f23b436594c2b8ee6ff423a5d7feb7991ffd8f826b701f1d6d21e6a3dd3b81d691a5335aecc09d3ecf2606d224e1ebc07f3acf1ee3bdcd2544fc7e12246d8ca0d351c8e625f7e2f1bdf180c407ffccdcc384d884c6213913a659fbe804952e4b6c3423bbc1ef995e5fd84fe113ffeb2c4cdfa239ef67e23471228fd8d320a6783228ad6c87d8f24c239319b9e581e16c46e13225876e0e7a49266d6031ea3c2d61383141a2b2e01561202baae4a6e8bac949475bd07d053ed9c4ff9fb8cda2e6acffc062417d620fc9b43906d44d9e8964a518493c6b8344c145ac6ef163f44d3c59537bf84d32657cd75748d3f6f13f029140648cbfa1670efc294d37bd860e67384040dfd1592f4f6987021562a63d3a3e7265d061215aea537f513422346d12cbd1bdd9805cd40c5aca4f6ed189d0152820d8adfb60111b59dba01ae84a85056d9854e7f821d393f8bb64477dea2007b6149e5d8a5f948f31d09d6a83c9f3f692a3437e9c18bcecdce2c60c84d90766ee9f72a32511cd0ef589f4042a58129bfe4cf31982bfea2bb3252340e74d0b1ad4f29c1065387bc8c94eaa8ab9b5a219a623f519a7844e7d602684c22f59edc443a552c5d017863c50829229769a53a62cced9682ef78ea1a15a61d027bef8da6fad07945ab0d292d9b6dae225a38b23834b6c46af256959da125f47c1577165e7e421ccc94b531633ccbd374f2dc44cec90b08345271e68e0ab64d1cf0a1b81676f8fcf23a67005d6af6742779f0746878ec04499abbcaae8662e50b724e6025a00df077b1f3ba8727a4e41939e4afe82cd4f53d77eeded30f98a524daa4b8b63c04aae4c3e9a6dbef1586b7529af29d65360b7789a93535a8c79c22e240606bf54219277981e3c557378a3d71b36d2522097098fec2bb1f6fcee01231bc00d812ebaa459cba5798517a5e392558f3120333094241655a124fb409ae8a0fdc524225f326266c5f7ab6da4852df80cf67d9516fb5647022cabe7681379e1ce13477528f18da79fda6216fa72a094f78c9a52aa75f8542397c78831ecaab78adf661b82a264bcb841210dc6e2e3639acc5e877721b2483b9a6176b459ebdf2bf5897d84b4e9008aa32798c952a14a5468f06cdb8c27356f2bf71c202b4db0ed42b0b48bb476b62b61a97e059a629aedf180455c5655040927b62da9455e07f4996749e04dcda8266cf1198d64fe68390170fbcb0ac987cce659935e3bd2a8e5a8d23fd627e9826a528de0cc2750ba2d843f672c466319afc08588f94cd9c580ee5d91325ae8f81e6864f7255171afec4c4d8680847541e1e02d2eb515a527ef1a8aa6049852b2e9ea25118ec4887d6ac162688bb265d8929fa598a3de31df5c452b243763ae4e50f73100588bd659b050780fdbf2f45e72ab599bbfa7cae501d058c39733ac9c1bb9f933547997a995d03260cda3b765a7a0a225e4dbfeaf4f162106e434fa3cf2722e83c566da7028cfbc79eaf6e26f5aa22f6568b5815d29a73134688fffb8fecc2b874f49263bc5e95e12ddd598fbf5099cccc778c14e7c6eee81630a30440e71798b8dc2ad45342d39d71c2d4f2615d1dc6f9dda73136a858f1c3ab4a4ecebdcd3f493f48e492521f6a3edf157779992a2800ba9ff83f0b9c5ab55878d2f48c9cd58e7edc22eff12a6c5c13ab7727571a7915594f3867b58ae40f121b1ffa3a9ec8adf60bb331409521e586677861f699e4d68c64eeae9cb6c85347840999139ed4b97fd971b59b151062df3aa11ceebd0192228b7889d27bbeed468f837cfb4707462d44895095a25ff84b1e03a8dd4331d884a61760e40cfa171a2214ab245fa4372e1ef8656643219fcd1b7b62b77e34e34aa3d749bfbd92000aa7bea64d6414cd88683842e74ddd08640cdce667683b6f97ef6ac75eca4d950952cc118f5e004baec9ad15625eaa318226c0484e29ac14b8367a369d8e1ea41ba69c6193e6b3cfa658212a7539bfb90159dbb7694bc09fc7960ef3e3a6a45d07e90d5c21353d76e1538ad534dc91eef903c586aafab77887fab194904352246c3f8b2fcd160533d29573dfd747da7b8f0dbc3849d33f7a0ac5227ae76e6ca5cd6ccab008c3ee1fd7f395e7ff8a0a7d6a8845785bedf35d806411fa17f3a93a423b07d9e9e6e8f3e14579d0006cde6883e6779e8339744fb689db302d24ac9f42ccfe27596c85e8e75d9cf31f442af9175215689e4364cf44691d643b14ac638f234fe10325e6badd2af50eaf322f5df7a5ed42f07410f8473c3bf7b423f0b3e5ab2242beacc64adec562029ceeec363e1d1bed271d187123a88c32cbc5e0105cea0e79510ca600cbd2df733988a51633965ac919e2b50406254c824195241e1b1d61b371279f101bf5c771582d2bb447766455ae4b028e14c2d8a4a656399c36d86fe499f4d9d5f34aa6477c1e4b607524eb3e2c05aea20cbd1ad203aa27f8c19dceb10a45e39cbb893abc7577265367bd0f2cc774f17d888561aeaf6d2e9dfede647b3b989e3316e436e3e45687dfbc6d9becdb47f8c72d48a2d2d5dfed5bdbcb13a08e9d109befd274edd5c7a1a11cee4a45443adf274d79748b4009abefe29e3393d63dbfaf265f6d4ae98638e4275228e47396897521b53b8b7946b07df906a768789766937734bb11664595339e9d75b89e6b5d5eea94c644e492f218b6bd10621a9654f142ae30db408f619f5d2ec27c5e5d6faacb7661a3fd95ccb1ba520ead2438262db8ba1d2e771732022f28384d9b62ceb9fe68c922808a0caa8104499166ccccc8ca8a031f057ba3034439d47ad1c40da242dfd17460b31266fe4b617c9fc24c385618aa186882943528eab490e307aea2877622c7cda5bec9a8a42f57d157a4b0aefd803234ad67f476642161dbc694b200db326699a82bc18b29ca950397c71af3c6277c9ab93a6d56ce8a692f85c0545778ce02f5a545cd25de8cb14ae85d6f8f3560df42158132710cc4afe3f4f6e44566de62da4dd78242fa04e1fb77a61e6942a13b06f5d15daed762b01c87304cbb5f84cc4abe6314a33a0070c5b9ecde14f98ea6131bc507b9e2f106ce2bfa307b32942fff89c7d4580e6190fc1963a54cd569c99c32039c69c2244375ac6ebf17e7571d564d22d7744483f828c86bbff80c822fb9e8f8007ed59297ce632750b0f30233e8449aacb10f91e6a6ca85910baa929cdebe87300ddb6914b76cac259da43b2af1edd55ac4ac7dbcf954f0372dd761d75343c9a98b663551c9823a69640783e483e69493abce19aeeda7f87bedb802e336a5a566405ea4c8e16dd5a7142daf9893629ed7f995a186834d0ca2a726039f5d0d9a7235c617f00d8b23a95828548a2039e234ace2e87d36a3f08a1c82cb911cfcafe7320ea6e77a8e94308d292a0dd2bc660a3ecb14c2eeaf2bfc445b19dbdfb35dc8dd720af6aa8e6a888ed5ae82465f28c656264b2d1a0f03ae37180b101d15875667663259f11a12c734f8cc8f833ebe0061ca407ef17488465f5f841eba4e0975753e472fea65a80a18bb8bc6428b8a1b0d8783bbb4f51d52c2bed26844361648790b2a504d3393b0786f27cc58b635580f531cb4376434bc4a5342f7695fd747b40eed9762a84499820848b1a7dd18e383ecf539233bddec8169a5b96a5253888e3faa3228962988617dce04c106195d3d185ded4eb7e1e36972c35b9d64739229c5826111a8fa7050330c50947488daa8a201a6e23cda55a023d3b20745302418dbe04329954c086053510af96ed79f5755ea8eec7409e5db5bcbce18a50f592d9990e8be0982c6f9034fcc3b99083bdfee9c8df119fbe580ab56b46fc20e16649406518cf41e1564eead1f1b029403d502efb77134cc0d9c6c145e2a540eb80885b2ec23fa29b073eb32ca13f9d284789611769976fde4736de76fabe3b7f426983094e746bb3d4b92d3de0f0593758c54e95dce1379d7e5b2b4ee3037941f3f7347af5477282f48c499c0c652a39fd94c3349a133755b5322bf8653844b08651ad358f437f36542d39a79ea0c0f8d14c38715dc527c4d1b5550573768fb2e2b72ce2584cfacaa5" + } + ] + }, + "job_v2_decode": { + "kind": "job", + "request": "{\"capability\":\"wai.video.int_motion\",\"deadline_us\":30000000,\"fallback\":\"wai.video.av1\",\"job\":\"job-3003\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"media.decode\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.av1\",\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":300000,\"failures\":{\"billed_price\":0,\"failed\":10,\"failed_ms\":500,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":12000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":10000,\"provider\":\"prov-beta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793000000000000,\"attempts\":[{\"billed\":true,\"end\":1793000004000000,\"endpoint\":\"im.alpha\",\"error\":null,\"hop\":1,\"not_billed\":null,\"outcome\":\"served\",\"outputs\":[\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"],\"receipt\":\"sha256:07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d39\",\"start\":1793000000001000}],\"candidates\":[{\"capability\":\"wai.video.int_motion\",\"cost\":414720,\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy\":10368000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":300000,\"expected_cost\":414720,\"expected_ttfb_ms\":155,\"failures\":{\"billed_price\":0,\"failed\":10,\"failed_ms\":500,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":12000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":345600,\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":10000,\"provider\":\"prov-beta\",\"quality\":900,\"rank\":2,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\",\"via_fallback\":false}],\"capability\":\"wai.video.int_motion\",\"deadline\":1793000030000000,\"decision\":{\"decided_by\":\"price\",\"runner_up\":\"im.beta\"},\"fallback\":\"wai.video.av1\",\"job\":\"job-3003\",\"kind\":\"wai-route-record\",\"operation\":\"media.decode\",\"order\":[\"im.alpha\",\"im.beta\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"3fe0b709d0a08b368ae357c7451507dbed9d5634a8b38dde1167efb3d9399c16\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}],\"request\":\"2b96e7a6a908d33f8c71d3ddb121d6197c403b79be93a4e41258c9fb5cc69ce0\",\"sig\":\"5469f5d35639b087e557ea269b1a0d10e36a1e9a508e656de7f0827d27b5478209efc01735a16f7cd3ad90d6cda663aa0a7c0969fd4d3d22f794d354f20c8907\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d39\",\"kind\":\"job\",\"capability\":\"oer.job.media.decode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:264780af8f8d6630e8eefd2aefeb88c06f931c9148d7209e58165c71470c7570\"],\"output\":\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"},\"work\":{\"status\":1,\"outcome\":\"completed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"12.0\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"12.0\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:42a249bb6894b805cd219d60dcba4b0d46a6d23ab17edd6318a5619e4c64ef6c\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"8a6f8c44f7c8d89c475b078fdf1b49331c750b8cae36a7d40c6b19b869a8c0139ba99b0b0f9146430e71b761b746ddd99350d8d1ba1960a515304f39e9c4b405\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [ + { + "receipt": "{\"profile\":\"wai.video.int_motion/receipt\",\"codestream_hash\":\"277865b574029f700f4fac023de3ab06ae598ee6f8ed726444e91442a6bd59e9\",\"clip_hash\":\"3492566e8e2682e3b3bac083b4db02ef8eba9a7f15d9faf0e27feee0f6eb488c\",\"h\":48,\"w\":48,\"frames\":[\"e1d8e8f8b5c534be1421e5858ed9137808ddb849bdff2bf397beb32568d8eb69\",\"ae7214babf5bbd6ec279434740f3271be43d2392b8167813fa557b5c4426fa14\",\"b3ef86db27b82d303bc6b612cb224ad55259b4f2e2c0461c74dcce188cd64b99\",\"3906f91010bf1b9ca14f6e2ac9b499589ac02ff4465e1d9764a22443a8b29c22\",\"bedb1538c2071d705d2d3ab2df2c569ffed440278494649f9bf1ec881561c519\"],\"merkle_root\":\"0f3fe4aa201c275c10289c22f31e7211b555627b33a251bbe33d094abada6508\",\"work_pixel_ops\":34560,\"joules_micro\":0,\"uj_per_kilopixel_op\":null,\"energy_provenance\":null,\"parent_receipt_hash\":null,\"signer_pubkey\":\"4a29b9b42b4c7b8d947b226d503cfa1ee8b69a5cd3e4cb88b30db023d6d2bb8c\",\"signer_id\":\"did:example:sink/job-3003\",\"sig\":\"a65d17137cfb32b0d81d2f87ce009c65efd5e1a1613c3e1aa472988a577ba59330be7f1b80f74fdcd687e4f3ebad1f18f93d208a340a16be4cd4475941499704\",\"receipt_hash\":\"a517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe387\"}", + "codestream": "57495631010100000500000030000000300000000800000006000000d5ffffff590000000000000004000000090000000f000000160000001e00000028000000330000004100000051000000640000007a00000094000000b3000000d8000000030100003601000073010000bb0100001002000074020000ea020000750300001a040000dd040000c3050000d2060000130800008e0900004e0b00005f0d0000d00f0000b21200001a160000201a0000e11e00007e240000202b0000f6320000383c00002747000012540000556300005c750000a38a0000aa9c0000edab0000d8b80000c7c3000009cd0000dfd4000081db00001ee10000dfe50000e5e900004ded00002ff00000a0f20000b1f4000071f60000ecf700002df900003cfa000022fb0000e5fb00008afc000015fd00008bfd0000effd000044fe00008cfe0000c9fe0000fcfe000027ff00004cff00006bff000085ff00009bff0000aeff0000beff0000ccff0000d7ff0000e1ff0000e9ff0000f0ff0000f6ff0000fbff0000ffff00000000010000000000feff0100ffff01000000000000000000000000000200fdfffbfffbfffcfffbfffdfffbff00000000000000000300fdfffbfffbfffbfffbfffcfffbfffffffbff000000000100fffffdfffbfffbfffbfffbfffbff00000000000000000000000000000000fcfffdfffbfffcff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0400fbff0400fcfffbff0100000000000000feff02000500fbfffbfffbfffbfffbfffdfffbff00000000ffff01000500fcfffefffbfffbfffbfffbfffbff000000000000000000000000fdfffbfffcfffbfffbfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdff0200fcff0300000000000000000000000000fbfffcfffbfffbfffcfffbfffffffdff00000000000000000500fbfffbfffbfffbfffbfffffffbff00000000000000000300fefffdfffbfffbfffbfffbfffbff000000000000000000000000fdfffdfffcfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0200fbff0400ffff010000000000000000000300fefffbfffbfffbfffcff0100feff00000000000000000100fffffffffbfffbfffbfffbfffbff00000000000000000000000001000000fdfffcfffbfffbff74420000280b35593c000000a214bea9451501b9ad0cbdbd9a309164812c7ece531911d14717c3dbbc1d27782217989f7218f20d121d7bd4ca1f3eb3ef1f71131429e2d1f626c3e7ab249c33af4fe2d2c042a6d2222fb9b3c460c33836571567e55a40c90777634123135bfb8e1357858f0dfd6cd3316844ae2fdb041518b067b9167f09231b1d6f1c16b7df311ea6450d1ea29eed1ecc320c2b747de0206b34c82a708a2525b67967473d53e643c54f6f2f42e6355aaafd6534aabbdf5fe1a866406fac26314f6ad812ef006e0dd2c39e124439f5306ba6e0396f65ff1627ef771e0071f21b088eae1efd0a7d22d53ada205042fa23135ba627dfdecc3c473a7353bf1ea7435671e53209bdc9581998ef568e94f260c2af006595d31a5d0301d30b0e96f22e27c43d162997a218be088f12dc9d0915dff4db17246c1a3c61066e3807ec553cb509743e78e21d250c19332ef30e3d2d4f94a0275d0ead4e59f7ff403f44c02ed1b145563b075b55c0ece2599ea8038a52c4e77287a40b3015595e178405f01716799f12508739158ce39537c6364439c2c61335c774823feb0e4a46484b29464146093e52ba6e2e3e5a0631121b992d5a46a848c8478e518c794638949ff05b4c57d23967cc4b57d3bb164147bebb2f4cd1452f40e1701817cec818f564ff13f4072317feda4f17504f253558977544d057484615df8028fbee312a5a55ed2c1c72d1257130d62be71dda51a0a97748680d2735181dc85721d3923f8d192f8794fcc96be998eb135e56840f812d952b26dc2f2f8537db1701de931a9e0b811c99606b1d7a72b81fe6796623b2e3442266abe726bfe71c26713b582970ff964812b3a7511b88474ad1a39d60fe77fb5b93faa43aa689e37f22cf656dcdde8d4a529b091869c19a199bf5af108ce21a33eb8ae43a8485f63a7c0ae7f3e9d6d3fbf35320f44e2572fb823070f38da5d5fb4cd37f3e167531443d7027341943de2d2e0dbe4918ce0f53b1e5a7368b2c3c6ff4ff9044663d54810e945168c3b1d019852e9412c0563e10ce0287359612c8365ce0fd34c5cdb9f290f0e017571aaef2f889ca179debd4f3065bae18380425f4d7c9dd18bb2cf626ea6faa24e3f4384b1da15a3d6df8b52cc90b935da2e4c23b9597355cee7f1945393e249b7b14ad729ff91432962e6218224895175df6f11b30546af34ef81f1840d4b4f24290fa19e90d41f3792fbd17b307eff2702189161f1552f429b1fc18154682320160642d6a8c304b9a74645336beb060762fd36780e26160b5380e4500bf316ab3b6594b76993031ace92b2efad9cb178983121b9d4845f4ba36071a9d404af3f9d4f2199f14cff37ed44717baad75f448628d19af3421f46a8b0f19184461f3ef7bc1178d00634bcf58624c6725ac619927f15545490f360e0fb877c6814c6b9ea2f952ccf3a3abad91da10ef63f3144a0f23340223ff35814709f4d3516c16e5bb75f3a3574719c25228f4b5a03e1636db84f49a58781762e821f35742a2181bc2f7f397ef311637054630ad43d250643a45395291b55b725ae5723bdd1b62eae7a445bd65319f19c63568c61a5b1206b34d3bed1dd63786de01f49a49affb2a9cebf3518ed9fb7f061bf402f2bdfb0bb9c0f344eaa4fb1bb58df3fb10a4fb6bcbb8f3bb45a0fbfbd11ef477204efb6ff5815087d668629a2a0c5d17e9236a698d0061d79fdb460b2f26a9c24f33529ee32911b3aa1515876dab37a91b8339f13feff22ac0af17a839caf36b8b36183cace0f27ca7e419927205f46713bd1740d4a5f49da36019a6baa1f4ceac2c19b530c1f2eaf4de19c6322751ef91df5b92e05f6533f2a760db246a7d1551e266a304d149e19ef5ab9b67c917279abc17e5eb69fbf214f2182014b4fb9ffe3e163705e1fba23dfe17e466a2fb4cd37c16dcc16ffbaaa6f61663923efb92173218345ca6fb512703175f6a95fb422b751962216358fc9aad68a047125962cd87430577849addf21174af2dc5499c4fcf8778b8293377e4ed3b12154cf3afbf46fb6ab6baf3dc41b0fb4cbe91f32c0b39fb2ef0f3f2262a42fbe21813f3cd5230fb476af8f3870f92fbefea62f47a7a92fb7234cdf297d11f5d8e12023c55bf666f4ef6005c8d58bc9549953d730699fd4ff8264fb23cf0ac1886051a1c4d05891af4edc2fbf792baf24163bdfbe896c3f32f65e3fb6023ebf2ca07d7fb66774bf4993ad1fbd99a01f30be2a6fbd34630f3275768fb7ef1a1f2f78972fbe65735554ebaa9390610c05a5315734087513d8c09862074f653884a096d36bad118d01b4762691789a9a4fb84456418eb0ca3fb4aa9b419eedf99fb865a481883a740fbccb302171e6b31fbdcc4a318d918a3fb2772ae179e15aefb5dcf1b17b3873ffb7673f4189ca65c5d080bdc43f1e1b278e9bbf0411aed639db279b76db39473596dd293164dfc0317fddbabfb866f2cf49fee5afb376ea4f3351975fb9baa96f394a45afbd65b6bf333ddaffb9de9fdf212c3d7fbeeead4f2262aa9fbf329a1f4fa10ccfbaee586f41f6791fbe442375aab92fb3ebf0cd287434e9d6e5b5143a22f6941660f17d858c6629c18cba73c167536ce1e8e78a81944d168f419b32118417e79f37ee3a4168ea062f3684ff8160f7514f3d3335e16d0c984f4e44f5716db178bf3f1e44f1765e6d5f39b589417ffd4263cb1b60b56568bf7410b9931975f374f710f5c7f4fa42325bcbf1b8b7648524f17d3a2bc1d17f181fb389846f3eaf47dfb8dede9f2ef7b22fb6cb646f4429fd8fb1ab5a5f4cd8e2ffb7dc74ef4164ac2fb955678f3aea1abfb511264f4825bd7fb2cdbf5f268318f5c44110177dd73146b7a24ef4d9557b1ac71c8ac855c5302606910468a110d2833d76a203d85cc1c16f25d02f36cc7671902a893f3c335ff186fdffbf23bdcd317eae2b3f3dfb9001a3c8153f3a8edd118ccf62bf491591a17bed596f344cc8916cbf73c423ef6c45d15bc03651b1912a83850df6979ba2a6292c2eebd5d91e87574332d1ec8640e210884defb523cdff2811f84fb900283f397e066fbb5636bf4b5af3afbe896e9f2ed4ea3fbaabb7cf42cfc51fb744940f4fc3dc7fb444010f3ebf46cfb40019ff4ba45685818c3743cc9991ca49c3d626e6cdb6d54ca28d67ab141e2599329871efca9c71b6444e22057e352f45dd8b917feaa52f42bfc1119743121f3694f9818db6c99f3d79c4618989917f426394b16467b0df3b1fb8f19521d21f48db4ca175a186e3dbffda754ced3533d92a3eea77ad2e668dd293056741d36bf0ff6d877943fff1c5c2be22145ecd620c546c1f3241b6b1627e58ef43e187e1951f342f42ab1b917ec3602f4f8a719192312a0f21e3ac51704a731f4981c4f168ba270f48c969c181fea6d40d92c977aaa69c464c1fe0b4fe4ac6e6dca35ef5f6aa19dc29fe940765b492821c377c822552bbe2132b22720a4a99cfbe66ccb18874f90fb5de48618e3bcc8fb7a9dfc174fca80fb033b2e19226885fb5cbaa018cf7481fb4bbe3b1690f45071cf3b545fc7dc4c460fb904a5f494e4710bb28c59b37201bc93c3b85cedf29ed26f8cac231756f41e282b6e208e484d416f57f1f2d56f3617c0a984f402e336196a0dacf401f23a182db681f4e431cd161e6be5f31d3a03177b0239f33755483d85c9d2624864d23f6bb7c5a69c7e2164d4f8ed6167d7fdbd05c2405ff28607d169ffc3238fcc5423c78c9346c614a93f473a2b17750683fbeed5a017f40664fb11227117579a43fbf768d91957ef44fb4994591639592ffb3898db867e356462c5292e4270ba30a3145c994dc63817c2b506ff790c88855f7484a1d36b3cb022b49dc01f39897e3db627e7453b7eaa47ee9c181a325d08f3aea14718447cc5f3ce9d6d187dabeef346352a168c4c9bf38ff00e189a54f0817d9e5867e164264acf9f89a0468af5865b1d0f5d44650780f7a37565a8f4c0ceb96346217425be3f42ddfb460186a443dc4f4f39e726fd2e11ac22fba65269162b0d79fbccdde017447c95fbeeead617a64c9a609f26b64105687099d3e8f96edd6e714832a030810d602862a462e0c908e95486467e4f657a255646fefc1b3d6612ce46f05c183a0aa2e63122e07a4fe77fc847dfdb81f4981cdd5a7e25095e2496ff7c0d982d61f1b45a40c98a5da72c8cd36f9bae985ea04c49826f6e0159848c46d189116c7425229a29dca5753180914230f7d87f2cd1e2294a23bd653c8f2c033180eb015dc4796a35ffb37e5d2a91a83e040b6f9551375c7318d897491c79c9bfd5a26b563d7258cbb89e8e7b06429a6fdbbb519019578d2cf852092d88bd0f2a78859a2f1ffe22519dd8cb507fba725b0e80ca5d8ed18c6087f6007e90e4ac6bd0224e504285c6ad5e2a4885c47c8e5608003a80cdac406c2de6e9d9c33b3d881826ea313c35a52f98773329023e2e2f644eed4c9fd91548d5819c5845a9c356a9e281411746cb75d8b9686bb07213513a6827af9e2d2582d3aaee5d0a1e1582463d496d83be81d6d0003b8586b2b42e814ecb2eb4b31b288dd08d4a6d71253f6f90872d7f2ee65a725a8f582404ef5c515ac37806644d66e187784bf25f74a43c7dd98747933f580caf12c97de8796af508f6ce38d753833fa7e3df673b922672b38b4a3750af52b2e56f46a293d2301edf675a87c40637fa24ff5de154a43f0bf38b907403487346618150454a15be8935547faf98945cf4502f7649b7fb6993be0d924ba7e87e5c44373d6a05774e1f29b0405671ec2d2912145352a9f45d41c46d625518ce670cea41617a3a074385e691abd1d9156a1d614d5fb54f097d82d80c614b6b92cfc8bbf18ecd7c70d5e7049d93d1e01d3208d0df28de97dd2f92b2384b83a3414fd99c8754c10b9e5dd1be2056f367ff898dec986d36884b48e0487aa87651128106a3085ec747b37f462bcf65f40a63d5ef3e7f7cceecdee0471af487ef9a024980f7d83f5964932f413bab5da896195fea92a65bb5e08a7a9bd68e57b2e1444310b9ef9f9b1b0772aea0435d832578761abacc584d3588cdec05e37241fdd2de96b2b67eb007b4e5f9d4ef2a8742af5235a45147c3cab7323fd344569e919373f12bd5554e858d3c3b21c295a1d79c4a4fb2a7b79f3ab4817fe0416134b576cce565e369d8770ed9c2924f8be0dfa9dd680fe77af006c4499b2cf442c3a8c83284915263e978a0343afd905502056046dc7ab6773c132468e7578f4cfde095720b8e785a720e4bc40228f788b0f27669314a5f931b46bd7903017f8e10890fe23b330b2f9651075346d3114f7bd0563a61aa2b540a0abd34d4772278bec85e703c9d214d3cb2b767c686f94e8433cfbe3fab6a77d952576510c5cc764230fd772df1fee062380a787e5e1da520a88c3e08b7c330d28d614ff959b861ecc7795fe87c22712ae536609e6bee407518e19d641c5b653da09e59b8800e89d17848545190aad2538d869bd717dbd8356a67798d9ec5e38da75c9caf09b6ab547b3941643edf2f02e64254d50e36362c41616048da6c425bf9318c40ad18669821964ec7cbd2b8714e8f5dc27626caff71a47bf64d476ce899f18c24556f7820202b9b3fc5f4e77ac5be8c1bd2e3492682645389b4b359578edf64a5a823571c07547829153e647579c44813fa75b8937cd5797249dd5803ee0386f9cab266917789d973c3c989dff5e0de1a65817d238899a57e9e48eb67c3d0321d4dee57cc778c5525bf8f542e90828a8b72085cd25067411b57e1a7d11a4f67da559757ad36fbb9f6f3c55cf6723acf5d58348dc055fce03fd929925ba3f6e40db6df8f0358c8a335945849649d783b52b0006124cf4042c3f16a854dd4a7672206614e215921735710d162219312c171da4b7649882772eb6ac18293790f8a6ad0eb8a98988789622911a626f368e825d45f92441e6949bc1b3e57a98a2136eda230713b4b6c6175aa129315646973336e21535ebbb8b8a549687da77a9c603751abd14723da67adc45dd8ecffb37995aabce4d743db9059e992aa435f87ebf2069785b20d1282e032f87ec90a5977b5b6eb7ce5e14e76816f6d8aa2a99d88a41cda754a8eed7955bdc677bda57b7c9308d8853619ea8795f972807be4487ad3c6ba8177c1897f6ea77077cd107d7b0c6eb9775068bd82b5994983546a8b789ca4fc7e30fe328a23afde89fc09b97d0dc4b878a796bc885f381176c0dedd7c3009868708763778074f1483b056e47b2d2e6f775e060d80613be47905e3c28197a2b2867f2087840da05978d324ca77d0d2c3838b448282d320027d0815b57a46e25386e546797aea5eba75c4748a77a68fe6769eb2d488d27ee978dcf669752152f679d5d4447e23d3767a076168784a958b79e1e6cb7e174abe7e0952b07a7e773b7e902dfe83891d937b603f948047799278c0e56181423661814ddcad7e50682c7bd2708e8791bd117bd3ad5d764ab9e9851e6116883d29db86051203825f38767ecf081c7edad64780ccc1007a419fa88156cbfb8877f0068a366cf17ab74967805410d1775c0ec084f283567a15ff0480a7bab185479db782a0e0027c86b9e58487498f89cbd316877cf25b801767548ac2714878a7a81c89caa1d885c0633589a0289b7edbef3e82b44ae88619e8d979c7e36585e1ac7d81e3dea681258e21841709f6844a668580588df77ba9ec97766b4321899d7c8f84f0b64b880840f485a1533d851767a57d4a544c83b06ffa7dc8b02f8747de5c7fbfcc1387f25f5a8a96d15289712fee8898a5408dfef27fb1fe337a96b4d9119e22eb87a7befdb497371c3793e2cc0aac6839ae8fdf2214934812e67a0fae55765e185b83fc9293793110d187dcce0e868708c67c2d76639bf921f880fcbef0956f67119f67b9559a35d5fb9b7c1ecc997a8cb6b78d5cf38c291b8a8b95baa28623c1f77ac0c1d18300ec467e9c6e94869bba197d07b41b8215ed717c33a3518a2a69078e6c91f6ad16430393da5506a55aa5d0037315fafc42ea2304936366d8c6a231a413a65288914a4878fdecb7772cc2ad83e9a63a83e6830079d593e17e3d6ab47b4116c192d8e6c68cfe19c9af3ec9c39005755d013a19f177bd9ea67a4d820f7a4e487c042afd998ae5808088048d1c7cc641628a98e6237ed84a2e7b4c74f67ceebe667d388172975a9ae8afa684c0785fc93092ba7ee176bb07db75b140997b504ba975669b2c865791fb8b03a2327b42ee2879af368c80edb7ac827a8a198220b7b9783bfb7779379079828ed03eb60c7aed938ef44a98ff16557824090280d15731762a53287703a3b77fe63bd287bed734819a8f2080aac48c8253cc6a75084b27795ed0db7599b7f18705651188868021a7a69f5eb33e38d97dc4fd1985411d5076c1516a76d8de15829ba8e8861fdc0f88aa783f7b9aac607cc4b52478d9b68f7d03c7a57974203779ea94e0764e1d8f9d8ac846a5eb023c84085245853201b782e10ac287e06f07774edcdb8465e7e67b4f201381f6363f8327e4cc7f49584576e49dec82aad62b849a18e57ddab9dfa1dfa972a6a2b7127f6d3b3278c7a2f881f0af98824535538250c2998900cf9b88288d2778e3a5a29607b80c8af1e1f989ebb4ae7dd81bfe750a478a76390a5b7b16d7b9993e2d42cf578d667a5a367b78e9f23b7b6d993680088c68756815f1891602298a214723abf3ed7f8f93785d8a60b62d7f9eb218890b14197c055eff793efab48717d3f3b1cef2697a0b0daf7db98d5c89fd22457b7ea64a823c2d0d7cbbea0f763d9900fbcd7c0993dd268a901da4f37cdd3adc772d0a257608a94f6af2ecfe8990c841a548ad0f0355bd0b81c8cd508356dde386276d8987e4c8a17eae24597cac2c9685aa9cc780e78af9a7128b35a7e9e43f76e95770804540f4893590636813988480ba2f139c9f0c55cf83ba19860744d489391892880cfe0388f03fa186e898e57bdd04e379cba8b8fab785aa7d307981941cf013891e2b397be66ac778effb7b751ce013894acb3e846196ee03de219d897ead1781e16f55890797767732717b7de9e02981710be977bbb463fcf62c2695d6343a977160de77eb897f7530e5f883ab1320711d583f8542c6327aa93f847c26e8ae8708649b7e8188db85b068b58886efc983bb205d897fa99c8468f85ef91cde28a52f53e29aed1c0d7f8d8119889b02c485d946ab664e23bf880482d580c720ae03112885d3da3ef5804946a079c54cd5818cf8d489cd3b628376f4f882b02727872cc97d22c71cbb9c815fe9843299d185b9f9268620db128aaa5432880e540f7cb833b28a1d5a6dd08ba32078d731a87a3e5420770bf03f8511f95e7a99760a8607a9747f5599b1fab4e9db81987a0e879b025b7c8d6f6978d1bc797d09ed717cc600de87c2131b8498b4da03fa05068478a4b287491ec17eaf7e0c897045e87ea6f48782d212087c4ae8261d0f6f8a88c0755084709f6979ab8ade7818d3fd752beacb841a37c8786bccc77c149311847b83808ad929b8893b3819847bd2c27b19348181d8928287ace0be81a2481c1b8b644980cf780f771cc794839d461e7a85872d8038e63b7e25abcd8744d4f87b76233aa0aa52ebd7dcf395882d352a8351529c88f9ed62882f1b3d8a2e67d87b6dfe6bf8af405a83b1c9a7781e89ca76b46e807b4dd55f83761f5e88a1414e8af230b1851248a69d78bd977f239dc87a30b68d7f59940889c67e1177fd92fd861dee88864cb1591be244838471e77587929508875f678889cfd22b885a6c6081052f387e616a7a95bd77bbb1b62c138a067367797a4de184bef4d981d4d4f285ee3ca07ddad63c7a8003257fe6a788793612258267cd397e8529538850e641762ba213796a18c57ed784b7a52fd508a5ff20d6869efabf75d4df5f8a0e37078a9a432585d194c478d9b3b2786337658a8ca57d878c9eac7a19cf377e01f38482fee8c97926b98085796ae89e949cc590dc73e87d162af77c02e8088786b96a808534d2869636ba7c3117c086a46f587ac74f0e7ad36cd0806677b183ef845e870b1448822f4aa087dbd2be7aca2314810d587d869815da803de1e7855f800b850d17f47e7a1e32f90724a69a3f96087f43ea127b6a182a7bfd348b830732597c4f97457bcdbd9182687a998096417287ac455787b3a8cc8246a11e03b6260486f3a3837effe43b89e505de9b95289f9334b3ab840b670f7df76c63884d12b084dc574579ebb4018104286881d85c12861f1510767af346872d88fb86b01c9176e2bb40dccaa58cfa8517f60409c52a9ecaebf394ed2204a1499d827e71164f818c8ce57bf993528a8dff547c5a128f78fdab6e8acf492e82caa1737939ff837903492c9e15b105837ccb6c96d364cea13718beab45cc63a4dbb267872ee9ba80433d0f89b982877b7aa0437c178bc57cc9db49812ee96d839b96ec7f3087a979a9fe4f8942f577a8b8aa46a5009723940ef30e8fdd242eaf54b30298a5b8d579ef96f8844b5bf77d5e8fd989c2dd558aa5f488833c105b7734aa5889366c7f787df91d806ecb87859e787d9079ff13a63b6b2a8b01851c8c0015a1a35783748ad81b147ec9a56b894303be88adf98775b82cea775b4f787ba9ec7675b3313d7e4d8de588bcf81d8969f4238d5e69be94a58fecaa4121839ae315a69706ddf68a3c56d97b031a4487a743597a04bca87a08df6284aa30628a2da15488948dab86f283667e2ded9e895a7ef0864a1ece89683dfe7946884da33af14bac9579888c54d36097cbe562899b6efe818e3cda7c6f139b800d6a0c842c6fd87c625ffc79621e5084fe4da9803ad79080c31a237694b56d762587fe7576d051879db28578da6af183a7ba867b838b1388eb4f7384144be37e35e7437bd647c37642b8047bac91fd8509359281e07abc84e38bcd7b2ef4177e16d7e4829677b57b6a3c1c86ffaeea7554a4c381e629cd76f4b5647af3c05781599421804f32568846ba047bf5f23485aa42797d24c8e1823a8f7d7ef5c3137cb9f9f17d9b79c5771320817ec486607559163f8aad94d487d96a8478604ae689faf40f884899338a71ca6f8052b3ca7934c7b279ef72b6833c2dcf87157d32833183f87e41530f850d5f2f7f6271647a08dfcc76e52240864fd8967f99ff6c81e8509d75436ca985506f117690e56b82115360820063ec842f79887b035b9e81b91d167da253ea76c2179082a27e977eeebe1482cc8030886afb707ce3c56a868b4f457870aa77776ea76c77fd1b65780504aa7812bf8d87f5700f7f4a42167a2d9aa485e8eba27a02a7f98750398e754c7f1c887ba3f17f01a0b27dcbba247c8da525856b67a37ac57b168437f122843eef50897e485d7de3cc4683d97ca77da1c35f7b1e65eb79f4b56a88bc1597889e305e7b62cb8975661d3d7e1b6dd27fe8bc4079c2f3808adaa7f8865c81887f9797c6852b613681a2003e7ca021df7d2683247de48b3d806d107e75b2c9a0758575197e3457fb84c129f88193ae7b80eb7e668391225c87e994eb86a62a357d2003e5822c5d6989eb3d3d89e4e5fb82447a8c7eab8af6799e71b775277fe87aca187d82215976893f7f4277bcbb3d7aeab82e82a4b01789650b0179d29442896852507cef31227c8015c47a1ebf568a159a7d7d797c5080c1995f7b5cdfcf7e7743fc81c01b817e6dfeb0770e1e5479b355ae7be5cf2d8905addf7b8d5d8e83f57b35834e903f77ed5de57da439b5794eca49779e6a8d7f03743b88c0da998279b2597da81b237ca9466478589160773815fa845326708352a80576e0dfed75c23b5d863773717622b332872989b17f3d4d2a786f7f6586858e6981eb61547e87ae438220d4b781ca47f88066367f77171f6a88bd47c281d086d77c69edcb7881ed067b7a423b84e9e73d85d3a99788c01bc985b61e8d76b1b04178483ff5807d0b4b7ddf077f82ea658b811eb49c8866adfa7e3dc41d861bf6b97b1da66c8463379688ba6c5778bf607b82eed76178484af37837732a8261abaf7cfe95a67f144ba6784c62e087cae92979238bb68159c3217f4d16e97d58695287eda5f579b737557e8a4804765d5d4888738cf9790689308957215e8069a5c6889500347e88bc947e6cb65577c719ef8680d45c7d6f8aef86feb97182e5059a7b7b08898a5ff7cc7ae2be8b81c89ebd89ad77c57532305b85370ef17ad5c9d68482fba7880ffdf18283140b8a546afd7f4809617e5e7dd8788e9a0c83ce42227ada17358838520b785fcca87d83ccb57e3cec797c81ed177d3797b3796f6d557c59827e879f99c49d4094599d8f2e11a25021b88741121578fcf0f187ab6d9d86fe9540800201cb80da5f0f8072dce8867182408610c3e687b517098405940177a3c62f87a11de7a140c6518b772ffe90d0ff517a6337bc7a4731e884f009e481c9ff5d7e10aaaf85640f837a9ddae585f677827570a3df88fd176c7fb821e581e3141a880da01185b9c74d91a8d0adb5a830b98a98d596854b503a7f71f93979f199b87b576d82856732b6802081e17513731f86aa71de7bab9c0b7b9504b77dd33dc588c3081d8711a6d69ce9d132b70f581690eeb4c387ef1f3f891488ff850c6ad17f65c33c83fb556d7a7593da766c6ea289b8f2d4773175507ff665ba7b1b1a07889b55d5872eb3a3ad2635c08f9e5cb1abf8cd4880b438bd8207fc1880c7852a825ff03b799761ba7d45ff6e83f3c032836bd33c88f9528b7842413a8acd5f41791241c6797e00768626b90a94288aa1a5666113b2936c9e8674c93378bd4b018435dcbc896f86f58183f0878944c2787e8bc6a3800e95f28030ab2f84eff0738796e3f086a3bb4a787ab2db8e8605e8029dba41fc0fec099202a3146465e9e48541ca737910aaee828218f280c17cd777ba82bb7f86543685b164ef7c2ba9438786dd3a8a7b507f0163f5d885402166773f8ac7876b9d607ce33c1c7e19b2be8724cf6d7c03e4fc8980c2947b38276678a01a957f5b20d979fbb3b980449eb677a3f51a7f85875e977409adb1d85985923d3d9285a373648968b7367a99c2bf777a4d5e8bec6933b49ebb36866d3b2a857b913e801439228606bf4879af072c7846471082c4eb50792a9bacd048f7eaaf50a4298c43f866892c81747939ed307b3117b0807c33b579b10ac6ab76fefd84ed4008863e54757ee60c6c84d8e57b7d6f137d7befe98b81fc80327e5272b490077466a3fa75cc7bd93f9b809600d4816a061682318eb88537eacc9f21a31596839c47862c81877795452d83768f2486d13aef84288d59805cf1fc7da8802b7d5c2bd79efe2c8a7ba4035a8adce0c37c9689f17f1addd17ffb0d3d76923ba99a5f20aa87138ca276bc035f79cd58d37a36caff7de1d482802d1158980da6d278e6c8b2b0243f45784809ef7ebfcca47fc88c2e7670912e824b6d88813c80618ac0073991fe161885080abf80bf4366782a53be7d00c88f7c081ca67d279ca488d6e2fc838529d8da6786987e49e16a8672369b85ea9bab7632300484fc094a834564e5821320058750819d787050477ac7c6fc85a97c4c77ce05b385d731aa81ec7a6b7b21116d9f402da080b61ed37b640f807b9557458322ba2980bf02c67f26cbf57f844a31f92599597dcabe038254c80a7c11f9247eda30877de65f277dacaa7c751e2fb2862d35b4d8ab39677e7c740f822d9a4b8286fa6d88fb38668752b38b8981ac3286cae9891c02f27487ab62bb7a1fbbd7830cdae57b0009c67d972b7b7f732b0b8a8c270a7926b9557e26b965778754407bdb421988008793830761d8810386eb891e616e7dcdfeb21daf446f7f4d284f88033e8284a97cc4898d76f6794403cf75b181cc8384b694886398b385b1ed06868003e785b80f6c789337238259b1cf8602d2ab82d17b4076c8df6b76b19eec7db223cb7af598fb8416b355867f0e5387afea5e8336d12c79d8f7827d10ceb685f72b9b76943ec675625f6c7b8ed07d7bf0e51289590b7789512ae7f942a87d193bc3b7860cfe8b756a23c6798e6bac77e4c1b776f9a53082692e80857c69bd0294a0e67cb08c0388f86fa6869b434e7c16188e8164bc08860b8beb8269e2dd7fec151e79bc9e1880227d888822e976806f499c7e152e227e8bf5fe7c00c82481e898fade846be38140e0277b84f7417c4f07417e06246179c3130784a5407a7d9868321b0570a17582be397afa231e825cc2eb795e065278485135838804da8666c69177ecf1107f5355087c41e7a28673c63484afc6d57e43856c7d52fb6b813af4d0844c1f6f76d44f8783c1e17f7db42da482acf24e771cfd3281b546ac7526d60b8748fe1f983c79bc753462cc825ed78578bda51c8887083f82eb0eeb84495f067e0fe4491cabd286868a4831815475fd818f38ea777403c98871e7ef7ea3c6678512d81d865d110f8c34698d7554afad851fcdd8810c87aa7b7576bd87b58e8d783051d57750323d8688983780655e137f06774080977ead773b79897760af1f7ab713d97c320134a58490f57fc391ec771c748778eeed3a83d8e5cd7b0c1b317650397e751e2d439514250f8869f46e7e32011f7b923bd47f1415e87cca2ae676abd23088e0933786f3370faf90fc5c7a11700077b044bb7d6b67398893c04976bb6ce7844caacb8e90150b8a47387d87a7267a8092e8f383250cb87f92304877e0684c79be2311806aa14e90e6c4b184e8d9447a36415e7e985d2b781cce728a5505d084eb7edd94a0c6317d564da07d912216873720188445ffa3887be4cc850b4ac98349c4fd77b0035ab57743148037b193853c104580ad82d77514159f7eb4c19d8ad4e6aaa8f7030ab738f7d0840fe4f07f92831f80181bbd80af198a8857912a874cc3538aa3a9b184886909a28f67ac8db04c29208044f37b744b1d85543f9976bb1265857df9789baf534c97fb418d816624f780bb2b107f3e951479f5987581800a257985c88e7e6c757b7600a4c1a0b45b9c9448f01495730fb57c8b73cf849c925379f7070f94c5f476aef6b56c92385d8c87d66b3c89f469477c88869387e26060883f981786026df37e2a19ef88f051149ed7d571ab211d0696fa4b4c925b06cdf90b12b2acea4cd994d5f38fa9096b1baa1006b2833d1705846fd93c7608d46e834a25df80a5acbf794cb5a77e37326d8a1b3e6a75d1efd3932d0e509fdb5a679bdeb55f839591fa9214bbeeb30790b58de9e509994ae8207b4929a68874c20377692e2b81b23c58827e0750779f499b816087c97dc582d977e65fd27dfad0327dae652276a0e4e380c964e3814df92e81d70d058694216f790b798d810e953b86987a5c76f1631e7a3199107cecbb598a1b5000879416c67a433d1e807fa9d0788b7e6b7d6b1f6b80f450b3784ad6cb7e7f3d7789b09e05783ff6838450b7a67c10fd09819ea75b84483429889117d079eb12ff7a64ce877e86dd3a7e44c2e576c4e4c78992dd2184b41b1083ad8de681a2659884516b99797ea68b8a7c3a96812140577d7050d186273ea2868625a48003f62486497c2d88cde11c82c797597a68273a86fda03f7a72d19a8025cf8e85c3e48a868b3d3c8216a1b67b863b8c7b9eb9ee81410b977d9bde3c7bcb1f817ad4cd4283a743b689f40f92893852d2824564128963b528848678487e4cd9178a6b7933817714a683b4a4d1794593ff83b695d47e01c4fa7facb56682ef67a086e7080681fb67627f9dcf917c8438338385bd647cffdd427886d68784084b84788f721284ccc1ae804a8a5f76b0731179ec61a875d319af7742add57f49588b781ff5878382a1be75ad9fc286be0da075eab1bf8001057f821ebf5179a17bce7f95c3768523d345893eef997f9803a383b5587d7ea65984813428377ccb4377750e1eb88273b48686eb199e7d47431b837e5a8c76a2000e8217f7a989b529a2871d00c0889cab9b8092fa3982b886b4760832407b0732107918d3578636b48d81ad9fce7f8b4f658a51ac688904d5e378be8fcd7758862e7960512d88e2602684f06ed37ad84ad7875f38518621ac3d84c5f94f83c105c17efc6e887f88864f8349f38381003f2e7a1c0f90805953987e2d11df7a75b7c276c87a1d7633d23b83f3c07b7f271a99754485fd89ae19697fcf49c475db428f75355e16875ac6f27f986fb77704451081b5ab4f8199c9fb85ddd5ff815bcdc98699d0da7e40aa8478d7a8217de64da08891b21a7b6a4e477f162aa184ef848f7963e4ae7f55b2747ee8aae78113973e85bc15dd7d10eb9576c3541b853c511277f7e38d8129ee7c8277de3d8425f39989f3ae567b08c297791d942b7743eacb864c9f9581eaee987a2bfc8e89b6255189a1a604884780c6894f322383d6c503779d874487740ab27a1987977ecd05c47d9e42d37e9582c97e93a3827a8b07197b60807e88ec27cb89c33ed2779cf7a38491b29d87e8ce317c7606967c1cbc427ff2a0a4895ca50c84099aba75434fd6808ec5db790bbae582d59a267b2193377c198e02882392d9786ce58185cd223a764444b782d5ed938493f6fa88497cbb88a547368407df8277524747800ac52479c3ef9379b7ef637d0a7d448ae505fb85d2000b81f89e868a14eded78354c89764d69d6883a67ea761f730d7c1660c57e4b910c7f4265d77adf24907994d9e97d9790c1794b25d48978b6ca805ba2e27bc9e65c825d47877a0075ac86e4f7ef885260a5894e07c382873e7f7a765976775ddb657c9d6a5c867224b68795a61e8a8b32bc854df9c77e2bc6047b471f6c88dafa7576b252ba86dfb46f7752befd880ec0ba89b9c3e67b955e41806d104688ebeaee817da6207ebb5ae182a6f4a0802140548aa224798a7d8296828dffb27c268397866c75ac893ee4f184c092557816be177d6cf78b8489c31a7a8b90237e0af46883a3bb458803d91f7f9653b476079058880c6ad07ed731e88555f31a8873442379ff13398a14f8d9820ffd8f882093ef7c55feb27f2c15658a7e072788a4931b7b7afaf276a3bfcb7fe65f8b848b0e817c89f27c89ae2b6f7653721d7e3a842777da587b7e47a8b17d85eceb7e2451a7855fde4e78d14ceb786f37007e717006847899d67a8015b87736eefa797b3712870022057a8176d47c810a5b88fc1b51832ae3317c6844e189980a4f86a13a727f5a5a8779c873bb79335b6c7f58e0be819283c283f594d77c459a187c4f3dca88dac04689497cdb7571e07b76cc02387cb3de3e7e1d82c389e2b3d77e79e1c187681c76786295c77a50157483bd35367f2dbec389cbba5088dae83a7827781a7e48f7e084e31fb586c9359a77f83d0b7e02cb9a89ada61b7f89b1e87a67d88c7e6707427b99938e781946a582d18214818af57b892ff7ab7ee8989c83f05c297f6f49ac7b60c87b87f337348746433583d576bc75c06e6582276dbb7d4045f27f54ec7b8095e77f8111b8f19346d17daba9fa6da11cf467aa3859288f3cc3728b9eed0699dce1c498a94081abcc74dc93adc02d80a611e69689d47e76d8e5ef81f8df167bee356686fa47db8079296890fe180ca68ea14a8fd585aea5e57284b721d15690735e838c7fa9fc90139b619ebd8bbb885e595787155da79923dc97853e25f6867c169a89cd4d7d8155b2fb7ef283a7b6a01fc59039f30d8be3f2fcaa038f8c914e98bba90e3c390475cfe121366e6c9c95282d8c24ddfb76fcd3e8a12ce52f8a9e9c2b7dd731f887e5e10678796af378db30477dd29b5e91d6efb598e5c645a6c33d249705e638963a36d927ed7b3f7b468fde7fe61793872174c38c3c56c8806533e4946850c47de95ea0881d24437ecf66a68911ca7183257cf48036e333b14fed0a94b7f8369e40c24ab15e273afbf4242f7bc014267d0d46218697689281f3c0707d42369a96dd92ef8486a7e285868a19877702ab7e74c2ba75911089820964c58cc1bb5a8d0d6168ab7fe96395f8046584913b5e84dcbc9d7d691c4f781880ac7fa4270798fc66e48569596e7919b2f9850b92ac7fbf720d7f5d9a7475b3b304b5ae023e9c438c2ca7b54f16ae68e4fd8838b7e27e9bfb787efa2ae5838a890d7e50f8278074ddea87b8a32d8a8360f575be9a587cd02c0c7fb07aaf7fe7789076ac2c098d48130bb71a90919c94084e8ca2e23e82e93a1c8744d405766af43176f3135e8af881de871356c17b23c142a4336d307fe8ebea7646c51f7bbff01d762d648178ba9bac76c395cd88e8eb12057ce8bfdfa887df81df2b0b8a88218882fc269a7918b6a085ab2ca1813feb8f860249749eda88c17d924dfb855f5cae8124b6bd8722e96f79f4a3c37677f0507ba3a6290509290add8ea2a189b00a0c83699ad087dfcdd688bd35d082444b5381864d367773a2068d65335879d21dee7c9cd324817c45bd793abe9a874f689495c77f489a9d579b87bc5d58813cc8ad7b4385387c0e66b7818d118a7d66129b8af10519864c0458a4fb9f2586dd3a327a2bd82c8087913a76c34221860ecb6b77001bd794f5078d84332c2a7b60e553865d064881db78b57dc3e43185337fb481f4b58376b372c08951e20a857ead35856815ff87070e4e8afdc4007de575328529774a79921e897d22a158fa6e65bb79c5579677223ce77887ef4a8381acdc861a660d851bf6ad8548a4ac16a756c877f57b6a7858b56a879a0d6186631a0281c6bf6a87194d5c8932e4969bfa8ccbf9895f23810a3cf07f65286c78f45bbc7524f7aa84178bd07e3f08cf83d9ab8fa3c8e08576fc02a08a8bcd767df2d64f85af6114827e7ee886805d0476e6a01e83358240fc52a107896e9cf08443329d7538f1f7777befdb8471d5da79adc3ef7bb534d317d69949a6c15000822b97cf78ba65ae790bafbd89fd4d7388d731618871772b831631ba7fbe213a7d233828890a8baf80122b39868a89188a677a57843f5b4c7b895ef2f6a8600f8da00b8d7672a6f5894c7b4788a22bf5863b8bcd7b36eeae7cbc7aa388c0c8e27cb9b1a97f18a43e7ea4155487f1c4797fae5a397d739757783cdaa27b49bdd0b0f72f2684eba23585974f5582e0bbcd7f89f90d7b1d5eef7f7c0f586bc4f47e797fd19e1aa42fcf7d7b08a1832ad13d7c08f1da80f612927d6ea7ea825ba91582df3d60b877428d883129448aa6a1a8846f91f9772b61cd819ba8488817d32b85f3e4827b464e3d1ca62b8d86045e467d770d3e781c5064851cc3268677d3407e6ad78d8027eb5c9da485877c3964d1773c6e7f80b9287481069b7c7d71e72d768671e38039e2f47c8737c1849a065e82acc70280fddad8898f09ac893398c088fd17828828f2fa8ff3a7b978bddbfd891bbcce7cd8a43685f421b5879893427abe2a5d7697bf85825123907933e4917512ad6c7efe17e689528444878994ab7dd2121686a3203218f9ccfbb539f89d83848054883afbea7bea82be837a784089d74359823632c07c7fc62489ba9b2b86aacbd77b6fef3787ddf98777f641ef79bf6031824e12818604e00ca3a529537affef3e821e12c889d10b2787e00a2c7a784ac0764444d9838b73ee81f4aa2a97f456c188aa1e7d789f49e37e23558979e30dd37d36d11778d02c98aa1cca728171e797839ed69f840b094e7c2efbb8805fd3ff8517a4d181051d8582ceb2c3800cfe9eae3e68e2814702ba7e21befd811b7f9383e9b1567e24925198062adda32dbbb07f51d0827d6122a880e0f14c850dfa87893da07f8314d4a184ff784e83bc277b7d83883109d35d4a8746c5a0792c44ad75dae83c7b9eb9a0825c7a1b7a5d52ce8506078986a9466684c7fcf1898c81f8824fb4347dd606fd81d8a42c8af1053179539681856a7dcf8dd362e41904e8497e9462097bc026c016948e1b8652962278811c51853e421278d9878688614d6086cd29d0821c21a97c8adcec7c6d87147671ce407bac0f55806881268f947260a23b13310b5edfd2a1c0c7f8940b8d7877b8c70b775a94d57fa43916770c1b2089645e357d593a168549cf977be181487c77cc1386e845a07535f2b68cc3f93d8f3201b17ac14abc8a8e117eb15ff74f93059ec07cd0aa487e5ed0d4894d0bfc8508db8380e04b67780134877ff9a5b77605c37786ff0130841ad252763105e8a7cdf2757929c75685b799a78a41b690a64996109aa444b7781e368c7c151c1476b3433378a7557c7dc6249381bb4f0d7e01e8c384f2d645887c0fc07c865f978c4b78dd89d64e48a8f454d57ddbf32d96a030748c39814a86ace04b8015be4b7eb8fde777fb7df485a3973f81e1881f89a6ba96887bfded79b98d907d9993f17ac0a40595b5684078cf95c1a99852d1ac70f49fa4fb34fe9073a422856b26b07974203a7613ea107f83cc6088d6e2587dc16a4c80414cba885367f67e9707a4890619d8850c673880f670ad8be94c86962f2c84a966d482915be34883e82c40784062b17e5ee96e76f09d1b8650b0cc7b4784d3877a25967d8c441d7df761db7f97a93080897025826283207be7378684332cfd7e206f437a63498e87e99f8375b4f75189bf8b8b7be32af98687c08479b7aef885f88c6b7d8f846f7bb3e9da7fe558957f0009dc8643a96c7e9b148879dbc08a8215ff388aaa42dd7f4a5ff0811ff1f5818e06e47ac8cd4a86f6eeee82aa30b87abdf8cb8432542b87761f5d86f3b5f486b23c8077ee9ac2777d4ca1751ab2a078171f08853d0527878355ec8757913e781726a784ea9b1c7e45db0980bfba027771e0358258eb2e89aaa7b47f5db73d8a47802a7e321e8879cd346383673d8e7ac4b55884a2772188b2a1717e6976c180ae9b567859579c761d69ee7556b9cb7c9bcc00847e071c82ac50d27a3433ac7948af2d881523bf894b91237b1a1e3c852750dc82ee23dc7840452f7e8cb0057b6d34a688a7f0a275f08be77df90aca76059f577c7397527c7d94e488f744fb83783fed85d5939b8708c94688cfb55b87f8686577fd51968287f6f77f337fbe86165543771acbf4779a06947deba203803e013b8a49172984a08d288449cf7d851a308c8172891783a59ab7898231ee7b1d704d848613c57ef62f6b81dcfd4f8026b9d276339c607d0b676a83f0d3d784e1acfc795372c67f94212d875410a28113cda37a1ad69d85a7d3d47ab6e8107627012f8823792085b2c5b689fe4230843eaee281838b5c7c92a70687ec03157bee18507a9a351d8019295b81ca605a7d1004fa819dab4179e63b4178def95b83a56493860e428676c7480081dc339c7f00feb180301bc287f90a0378d8c1e17a6993787ebc03b389350030881cb133894851ac754fe3c9757a3bce77bb5ac287ec6f8c823ae93f7c3e78068122c5217cfa0680878cf8e678ead59586af858e76f8fc64824caa7889d3a99581f55e177d90c1ee85430ef689c81cb975e0b45e7ef2e8f1820350b67a2d52c081925437839935b97f93ae69818a7e838367fc8384b5e10477daf33b87a7c180893f7f5b8100a4f081c6bf058280f88b85273e0b7f0f374584dcc70782d2891d7f00ab0b7f1e19ad813f50de75676c0f7db93a287f5e4e7583c117797af75a9e773e951688613b787bc217e47769ede279fc26547a405786859d4d487e9e54ac83ace08276357bf07c9d87be829271698a439ec77bef84018a124f4d88fbccb8778beaef890c879076ae2fe2885dff2a7aba41178a9b8b9689aacbe97de235658477559f819271118213ea9089aebfd081aead5a7ad987af758288d4891aef73819d8e8378a9c80579c0f0cc7805d523830a2a2c7b34aaa67d9c09937502cb4f8399110585a810cf7aa48c18812e3174836bd3ca81b4c8bf7ba55280851385bf7a23cc9c88e111248a3f7ff9836565b37b2886a389ad82808143d8d67b0fc02a7ded52378414f8ea85680a7c82021ef280d13ab77ecc26c478415e777595212b7637ea107fdf85e97da2d1d57877a85a8f054fd87817cc73785eacd181fd4d1e7ae8507c8608649675ab49ef753ed6a17d82594b8a75be6684e994417ed008b18982d7a68085346c75527dca7e4cfd827c925fb18a26fb9c7d83969e80d5c962781e2426808f9d187f1c7b6b81bd23737d36ad907c5ccd9b88c213bc7a2044cb7da30eb3848296f97a858edc7e66f5c1804dca5c97e631ac8383d3e9924d704e7be766177fc283e37e0940a081f5c3a577effb0f78d128dc7ef283a3849ff6ac768db7d7864141ba88f4fd0f85ae908783c86fdf7aea1d9976c06eac76d5395c7bff787578c2e8a180a0864e7b18d3047f8188748722b30178ddbcf278d68f468626d2a6818176b87618c81588a141c77d688c5799bc773b7706b86a762f8fd0795bd82a762766388564453c856c63237a9993867c28980d81e372fd82d659ef7c1d1de3817f0e7e7dd36cf77e48e5af80200a027c2b7ea4805127f67540e4ce77fd0900783fae4978ff664c801c57cb775701257d12f56581c313ff8387e42676cdc80a7e0541767dcfefb37c209eec7ab27d24874b3e52908b18f993d8534d932c7e948a6a2a6a81bce6f381587bb77d9feff67ebd766a7e14d49a88bf55a3791535c2888326787a68a97579943e53898613d986d8a4c189c1bdcc85633e9d80a826da754c1a851dfd44aef8d62ba41e5d0958f764995a18c37b007fb563ce7f82183f7a42d1b57d7f0edb788f604c89a6c53f83c6f508863d712182a796a8b87bfc419c5c4d928c461498b3c64e467df0f00577cbb3bd7cf9b0af84652f06779b180e7630af657d3e83c487f88c648321596d777838ed8534b14086f6483682494d52a54b994fb14cdf889674ed6fe45cd01677fac9c77cdae8f77eb63b028737324d82d2775d7bfb0d5d7ce1a574786c8be787446fbe7dd4cdba808b3d3e7f6f081176c736929aec6cdb931c365da2f60b657a63e42f894e61fd7ffa064277e70c1080eba22c7eaff558792e18c983a481be75246e828625a70d7787dd30804b1a267b30c8b7907cb36899915363b8a8da7c832c2e1c881eeaeb78400f5279d4a987769820c27d35d5827d56787d7d35e7d0838aee81787bf6f485b379f08946ba9e85f36d258811ad0cb5713fe3b036c48f803b9dee809a182a7ef8bbb47a816fa786238b207b02837b866815257d73f59f7c2c27247a456f3f8a7df9bd7a65d5ae7c446817839bde42b42288a1ae2704c77caf078d7b2ee94780d796e57625ec0d828d2e037ae850fb8070577a87aa8a7f88b9a6d080448c2a77e563cc89ce9c0e79f6a63779b5abe08996362dab3a1b5295f3a0c788b0816586d5b7c7830c990c78718d2d7ab1520c7945c9ee76279178835aadc77e936d187b67e3087a32c44e7ec7d1317758fd8d7c7db13a9d7462d78fddc781813ad7a88792a79383b4fea2758dc2c989eb612b78cda49f880c754177d7a15284f6e3418453794d7fe8624288e2fbbb792480f88789534188638656a9a84e11e2c2212b82fac52c83c91c0177bc320c81463c8a83a6d73f848fa8f3827ef5c586fee8e884bae36783cb26f87d28fd03897ee3f78490229887bbc6f09981c9e595298684870f9102839f9c44890022577c7403908286427e86c83960881696aa8591a06683b7b5f18627b56288c3c7a28517f01f898dbed87729f9d37fd8d3af9a36f8527b9f8ac97fa81b897950df3377dc74ff7d172686884b2c5e7ce34ea786a10be987fb8b28814606588577141781d0ceb5780080dc7b35b8089af50605a632ae6380b113b9841f448b7c53af8e82629c8e7b6d462c84b529f8853fa33e81f3541a7d5da56888347b008ad8f76f797a7175779db675760aa19a88e6fa9187b1590baab17eb086d71fb08185b2638ab04017856421707e37d805881cb15d88724ffa759038b588f69ba18984bddd7b47cc747938328d8319a72d7e1ae8ad862912c98eb6d158a54eb704887212bc76e02002850249b477f2f3da80020c547fa9222488c3b52c7c5b7edd815e06c4897fd88d7b30ecaf79f2faae8243c6a888761f9395281ded91edd4141ed0d5b978f28ecf8091ab527827aee97c6e424082b75bd187f7195d7c9a7df67ac230ce8419a0958948fe517f51c93877cbd7fe7fec03fd81652fc6882e1c87996f89b81c7afb5c7a5f31277e51b72685560c9a7f80e6cf7a86cbcc7cb64d1778f2c4f377c4eb0b83f3ae66890e01a978324d7d80597000884858f28894e06b6e7f37fc75b98dd887eae34880108d7b877db89d7722e2de869b79b580e99f9e822fd347852df4697514cd9d7fe032f18769db56862380f97f929572899eaeb77bb3670d85bded4318a4fda9827219bb87696b6f79f05cbd858a7e6d8901e84b76f7a2c97cda5fd17fbc7a1e8244d4ec8081234387b7494478ca6b05859607b68926aee289951d3d82e6b2a1769dab9f826582fa75eac33276de3abf77bf1f7a824bd2867eee2a257e93912887daa739834ffce37db83364850947b6875cd437897c1d8d7fa90cc4855ef0627bc0e5568409ac0d7fea82ce85b07afd7eff01eb78a8802189e84568772ccd0c80b2060e7fc271587d5343288876315283a33df2894dad79822b0e6e80b9b1dca037593b873416db7a3e4db47f87d20c89e8ce2aaf8d2b4d87b39d3f7908f86678bf43fe821016298197ea5188eadc098aeff09e7b3ee8858894b85f7d11b12c782ef4e396200a39180823cc7dd0a3477c6ad73278c7c6d4ee5bf2d17fcd6a4382b4c84583ab5b6581b8d90a7d0d46737e1dd5007aa0083076bdf83a7b62a7228138a59679ac983ba1759f3791f434af93ec47b7156889baedb06e6a8c964b139ff953427a3de10f7917afb4882cc93682cec40c7da128338a331abb76fc26618946cc1588e546a6877ff118a6a39c919a6e8d7598e435f3adadf59f9050ddb694d615" + } + ] + }, + "job_v2_encode": { + "kind": "job", + "request": "{\"capability\":\"wai.video.int_motion\",\"deadline_us\":30000000,\"fallback\":\"wai.video.av1\",\"job\":\"job-3001\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"media.encode\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.av1\",\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":300000,\"failures\":{\"billed_price\":0,\"failed\":10,\"failed_ms\":500,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":12000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":10000,\"provider\":\"prov-beta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793000000000000,\"attempts\":[{\"billed\":true,\"end\":1793000004000000,\"endpoint\":\"im.alpha\",\"error\":null,\"hop\":1,\"not_billed\":null,\"outcome\":\"served\",\"outputs\":[\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"],\"receipt\":\"sha256:003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff\",\"start\":1793000000001000}],\"candidates\":[{\"capability\":\"wai.video.av1\",\"cost\":480000000,\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy\":10000000,\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"rank\":10,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\",\"via_fallback\":true},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy\":31104000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"expected_cost\":1036800,\"expected_ttfb_ms\":300,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1296000,\"expected_ttfb_ms\":700,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"rank\":4,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":967680,\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"rank\":9,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":898560,\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"rank\":8,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1054080,\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1054080,\"expected_ttfb_ms\":10100,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"rank\":2,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":864000,\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"rank\":7,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1071360,\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1071360,\"expected_ttfb_ms\":280,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"rank\":3,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1382400,\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1382400,\"expected_ttfb_ms\":240,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"rank\":6,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":933120,\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1333028,\"expected_ttfb_ms\":648,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"rank\":5,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\",\"via_fallback\":false}],\"capability\":\"wai.video.int_motion\",\"deadline\":1793000030000000,\"decision\":{\"decided_by\":\"price\",\"runner_up\":\"im.eta\"},\"fallback\":\"wai.video.av1\",\"job\":\"job-3001\",\"kind\":\"wai-route-record\",\"operation\":\"media.encode\",\"order\":[\"im.alpha\",\"im.eta\",\"im.iota\",\"im.beta\",\"im.zeta\",\"im.theta\",\"im.gamma\",\"im.epsilon\",\"im.delta\",\"av1.alpha\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"3fe0b709d0a08b368ae357c7451507dbed9d5634a8b38dde1167efb3d9399c16\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}],\"request\":\"889abf45e6a9ae51a0adb6b3f582bf66ae06cde717416578ea9117fe030ed061\",\"sig\":\"8c88126dc052e73fd3310ff00df12e0976b11af1d23474a3acf448c50d6e50034904c739950bf1c8ba7e2b8da968805ea6c4a8d8f5793aabac58dc5cd9fcce02\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:8c4548f5a0e497ae6257f82ab35a19c91a7e1489007119c03e4a299dbc0471c0\"],\"output\":\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"},\"work\":{\"status\":1,\"outcome\":\"completed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"30.25\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"30.25\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:6080a89fdfc1f6b08ac32fe75f1528dba2f26e652e6a1e04daa6e96a76f66f8e\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"143b5c365dc8ba8e460c4616773bd01da1f6b6ed47c2f28e454c2bc1797e078c09a895fc34aed8533f5d337841539a52fe982dc6b9d3fc829eb1704a9cc0e203\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [ + { + "receipt": "{\"profile\":\"wai.video.int_motion/receipt\",\"codestream_hash\":\"277865b574029f700f4fac023de3ab06ae598ee6f8ed726444e91442a6bd59e9\",\"clip_hash\":\"3492566e8e2682e3b3bac083b4db02ef8eba9a7f15d9faf0e27feee0f6eb488c\",\"h\":48,\"w\":48,\"frames\":[\"e1d8e8f8b5c534be1421e5858ed9137808ddb849bdff2bf397beb32568d8eb69\",\"ae7214babf5bbd6ec279434740f3271be43d2392b8167813fa557b5c4426fa14\",\"b3ef86db27b82d303bc6b612cb224ad55259b4f2e2c0461c74dcce188cd64b99\",\"3906f91010bf1b9ca14f6e2ac9b499589ac02ff4465e1d9764a22443a8b29c22\",\"bedb1538c2071d705d2d3ab2df2c569ffed440278494649f9bf1ec881561c519\"],\"merkle_root\":\"0f3fe4aa201c275c10289c22f31e7211b555627b33a251bbe33d094abada6508\",\"work_pixel_ops\":34560,\"joules_micro\":0,\"uj_per_kilopixel_op\":null,\"energy_provenance\":null,\"parent_receipt_hash\":null,\"signer_pubkey\":\"4a29b9b42b4c7b8d947b226d503cfa1ee8b69a5cd3e4cb88b30db023d6d2bb8c\",\"signer_id\":\"did:example:sink/job-3001\",\"sig\":\"74b028a210394b24c9ae318db1a5385801a1abfa5ec78fd334b839eea33d62a162b80931771258ec06e78fad127f2a2a822d3cc6c5d92be39fafb646a7cc3604\",\"receipt_hash\":\"9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae\"}", + "codestream": "57495631010100000500000030000000300000000800000006000000d5ffffff590000000000000004000000090000000f000000160000001e00000028000000330000004100000051000000640000007a00000094000000b3000000d8000000030100003601000073010000bb0100001002000074020000ea020000750300001a040000dd040000c3050000d2060000130800008e0900004e0b00005f0d0000d00f0000b21200001a160000201a0000e11e00007e240000202b0000f6320000383c00002747000012540000556300005c750000a38a0000aa9c0000edab0000d8b80000c7c3000009cd0000dfd4000081db00001ee10000dfe50000e5e900004ded00002ff00000a0f20000b1f4000071f60000ecf700002df900003cfa000022fb0000e5fb00008afc000015fd00008bfd0000effd000044fe00008cfe0000c9fe0000fcfe000027ff00004cff00006bff000085ff00009bff0000aeff0000beff0000ccff0000d7ff0000e1ff0000e9ff0000f0ff0000f6ff0000fbff0000ffff00000000010000000000feff0100ffff01000000000000000000000000000200fdfffbfffbfffcfffbfffdfffbff00000000000000000300fdfffbfffbfffbfffbfffcfffbfffffffbff000000000100fffffdfffbfffbfffbfffbfffbff00000000000000000000000000000000fcfffdfffbfffcff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0400fbff0400fcfffbff0100000000000000feff02000500fbfffbfffbfffbfffbfffdfffbff00000000ffff01000500fcfffefffbfffbfffbfffbfffbff000000000000000000000000fdfffbfffcfffbfffbfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdff0200fcff0300000000000000000000000000fbfffcfffbfffbfffcfffbfffffffdff00000000000000000500fbfffbfffbfffbfffbfffffffbff00000000000000000300fefffdfffbfffbfffbfffbfffbff000000000000000000000000fdfffdfffcfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0200fbff0400ffff010000000000000000000300fefffbfffbfffbfffcff0100feff00000000000000000100fffffffffbfffbfffbfffbfffbff00000000000000000000000001000000fdfffcfffbfffbff74420000280b35593c000000a214bea9451501b9ad0cbdbd9a309164812c7ece531911d14717c3dbbc1d27782217989f7218f20d121d7bd4ca1f3eb3ef1f71131429e2d1f626c3e7ab249c33af4fe2d2c042a6d2222fb9b3c460c33836571567e55a40c90777634123135bfb8e1357858f0dfd6cd3316844ae2fdb041518b067b9167f09231b1d6f1c16b7df311ea6450d1ea29eed1ecc320c2b747de0206b34c82a708a2525b67967473d53e643c54f6f2f42e6355aaafd6534aabbdf5fe1a866406fac26314f6ad812ef006e0dd2c39e124439f5306ba6e0396f65ff1627ef771e0071f21b088eae1efd0a7d22d53ada205042fa23135ba627dfdecc3c473a7353bf1ea7435671e53209bdc9581998ef568e94f260c2af006595d31a5d0301d30b0e96f22e27c43d162997a218be088f12dc9d0915dff4db17246c1a3c61066e3807ec553cb509743e78e21d250c19332ef30e3d2d4f94a0275d0ead4e59f7ff403f44c02ed1b145563b075b55c0ece2599ea8038a52c4e77287a40b3015595e178405f01716799f12508739158ce39537c6364439c2c61335c774823feb0e4a46484b29464146093e52ba6e2e3e5a0631121b992d5a46a848c8478e518c794638949ff05b4c57d23967cc4b57d3bb164147bebb2f4cd1452f40e1701817cec818f564ff13f4072317feda4f17504f253558977544d057484615df8028fbee312a5a55ed2c1c72d1257130d62be71dda51a0a97748680d2735181dc85721d3923f8d192f8794fcc96be998eb135e56840f812d952b26dc2f2f8537db1701de931a9e0b811c99606b1d7a72b81fe6796623b2e3442266abe726bfe71c26713b582970ff964812b3a7511b88474ad1a39d60fe77fb5b93faa43aa689e37f22cf656dcdde8d4a529b091869c19a199bf5af108ce21a33eb8ae43a8485f63a7c0ae7f3e9d6d3fbf35320f44e2572fb823070f38da5d5fb4cd37f3e167531443d7027341943de2d2e0dbe4918ce0f53b1e5a7368b2c3c6ff4ff9044663d54810e945168c3b1d019852e9412c0563e10ce0287359612c8365ce0fd34c5cdb9f290f0e017571aaef2f889ca179debd4f3065bae18380425f4d7c9dd18bb2cf626ea6faa24e3f4384b1da15a3d6df8b52cc90b935da2e4c23b9597355cee7f1945393e249b7b14ad729ff91432962e6218224895175df6f11b30546af34ef81f1840d4b4f24290fa19e90d41f3792fbd17b307eff2702189161f1552f429b1fc18154682320160642d6a8c304b9a74645336beb060762fd36780e26160b5380e4500bf316ab3b6594b76993031ace92b2efad9cb178983121b9d4845f4ba36071a9d404af3f9d4f2199f14cff37ed44717baad75f448628d19af3421f46a8b0f19184461f3ef7bc1178d00634bcf58624c6725ac619927f15545490f360e0fb877c6814c6b9ea2f952ccf3a3abad91da10ef63f3144a0f23340223ff35814709f4d3516c16e5bb75f3a3574719c25228f4b5a03e1636db84f49a58781762e821f35742a2181bc2f7f397ef311637054630ad43d250643a45395291b55b725ae5723bdd1b62eae7a445bd65319f19c63568c61a5b1206b34d3bed1dd63786de01f49a49affb2a9cebf3518ed9fb7f061bf402f2bdfb0bb9c0f344eaa4fb1bb58df3fb10a4fb6bcbb8f3bb45a0fbfbd11ef477204efb6ff5815087d668629a2a0c5d17e9236a698d0061d79fdb460b2f26a9c24f33529ee32911b3aa1515876dab37a91b8339f13feff22ac0af17a839caf36b8b36183cace0f27ca7e419927205f46713bd1740d4a5f49da36019a6baa1f4ceac2c19b530c1f2eaf4de19c6322751ef91df5b92e05f6533f2a760db246a7d1551e266a304d149e19ef5ab9b67c917279abc17e5eb69fbf214f2182014b4fb9ffe3e163705e1fba23dfe17e466a2fb4cd37c16dcc16ffbaaa6f61663923efb92173218345ca6fb512703175f6a95fb422b751962216358fc9aad68a047125962cd87430577849addf21174af2dc5499c4fcf8778b8293377e4ed3b12154cf3afbf46fb6ab6baf3dc41b0fb4cbe91f32c0b39fb2ef0f3f2262a42fbe21813f3cd5230fb476af8f3870f92fbefea62f47a7a92fb7234cdf297d11f5d8e12023c55bf666f4ef6005c8d58bc9549953d730699fd4ff8264fb23cf0ac1886051a1c4d05891af4edc2fbf792baf24163bdfbe896c3f32f65e3fb6023ebf2ca07d7fb66774bf4993ad1fbd99a01f30be2a6fbd34630f3275768fb7ef1a1f2f78972fbe65735554ebaa9390610c05a5315734087513d8c09862074f653884a096d36bad118d01b4762691789a9a4fb84456418eb0ca3fb4aa9b419eedf99fb865a481883a740fbccb302171e6b31fbdcc4a318d918a3fb2772ae179e15aefb5dcf1b17b3873ffb7673f4189ca65c5d080bdc43f1e1b278e9bbf0411aed639db279b76db39473596dd293164dfc0317fddbabfb866f2cf49fee5afb376ea4f3351975fb9baa96f394a45afbd65b6bf333ddaffb9de9fdf212c3d7fbeeead4f2262aa9fbf329a1f4fa10ccfbaee586f41f6791fbe442375aab92fb3ebf0cd287434e9d6e5b5143a22f6941660f17d858c6629c18cba73c167536ce1e8e78a81944d168f419b32118417e79f37ee3a4168ea062f3684ff8160f7514f3d3335e16d0c984f4e44f5716db178bf3f1e44f1765e6d5f39b589417ffd4263cb1b60b56568bf7410b9931975f374f710f5c7f4fa42325bcbf1b8b7648524f17d3a2bc1d17f181fb389846f3eaf47dfb8dede9f2ef7b22fb6cb646f4429fd8fb1ab5a5f4cd8e2ffb7dc74ef4164ac2fb955678f3aea1abfb511264f4825bd7fb2cdbf5f268318f5c44110177dd73146b7a24ef4d9557b1ac71c8ac855c5302606910468a110d2833d76a203d85cc1c16f25d02f36cc7671902a893f3c335ff186fdffbf23bdcd317eae2b3f3dfb9001a3c8153f3a8edd118ccf62bf491591a17bed596f344cc8916cbf73c423ef6c45d15bc03651b1912a83850df6979ba2a6292c2eebd5d91e87574332d1ec8640e210884defb523cdff2811f84fb900283f397e066fbb5636bf4b5af3afbe896e9f2ed4ea3fbaabb7cf42cfc51fb744940f4fc3dc7fb444010f3ebf46cfb40019ff4ba45685818c3743cc9991ca49c3d626e6cdb6d54ca28d67ab141e2599329871efca9c71b6444e22057e352f45dd8b917feaa52f42bfc1119743121f3694f9818db6c99f3d79c4618989917f426394b16467b0df3b1fb8f19521d21f48db4ca175a186e3dbffda754ced3533d92a3eea77ad2e668dd293056741d36bf0ff6d877943fff1c5c2be22145ecd620c546c1f3241b6b1627e58ef43e187e1951f342f42ab1b917ec3602f4f8a719192312a0f21e3ac51704a731f4981c4f168ba270f48c969c181fea6d40d92c977aaa69c464c1fe0b4fe4ac6e6dca35ef5f6aa19dc29fe940765b492821c377c822552bbe2132b22720a4a99cfbe66ccb18874f90fb5de48618e3bcc8fb7a9dfc174fca80fb033b2e19226885fb5cbaa018cf7481fb4bbe3b1690f45071cf3b545fc7dc4c460fb904a5f494e4710bb28c59b37201bc93c3b85cedf29ed26f8cac231756f41e282b6e208e484d416f57f1f2d56f3617c0a984f402e336196a0dacf401f23a182db681f4e431cd161e6be5f31d3a03177b0239f33755483d85c9d2624864d23f6bb7c5a69c7e2164d4f8ed6167d7fdbd05c2405ff28607d169ffc3238fcc5423c78c9346c614a93f473a2b17750683fbeed5a017f40664fb11227117579a43fbf768d91957ef44fb4994591639592ffb3898db867e356462c5292e4270ba30a3145c994dc63817c2b506ff790c88855f7484a1d36b3cb022b49dc01f39897e3db627e7453b7eaa47ee9c181a325d08f3aea14718447cc5f3ce9d6d187dabeef346352a168c4c9bf38ff00e189a54f0817d9e5867e164264acf9f89a0468af5865b1d0f5d44650780f7a37565a8f4c0ceb96346217425be3f42ddfb460186a443dc4f4f39e726fd2e11ac22fba65269162b0d79fbccdde017447c95fbeeead617a64c9a609f26b64105687099d3e8f96edd6e714832a030810d602862a462e0c908e95486467e4f657a255646fefc1b3d6612ce46f05c183a0aa2e63122e07a4fe77fc847dfdb81f4981cdd5a7e25095e2496ff7c0d982d61f1b45a40c98a5da72c8cd36f9bae985ea04c49826f6e0159848c46d189116c7425229a29dca5753180914230f7d87f2cd1e2294a23bd653c8f2c033180eb015dc4796a35ffb37e5d2a91a83e040b6f9551375c7318d897491c79c9bfd5a26b563d7258cbb89e8e7b06429a6fdbbb519019578d2cf852092d88bd0f2a78859a2f1ffe22519dd8cb507fba725b0e80ca5d8ed18c6087f6007e90e4ac6bd0224e504285c6ad5e2a4885c47c8e5608003a80cdac406c2de6e9d9c33b3d881826ea313c35a52f98773329023e2e2f644eed4c9fd91548d5819c5845a9c356a9e281411746cb75d8b9686bb07213513a6827af9e2d2582d3aaee5d0a1e1582463d496d83be81d6d0003b8586b2b42e814ecb2eb4b31b288dd08d4a6d71253f6f90872d7f2ee65a725a8f582404ef5c515ac37806644d66e187784bf25f74a43c7dd98747933f580caf12c97de8796af508f6ce38d753833fa7e3df673b922672b38b4a3750af52b2e56f46a293d2301edf675a87c40637fa24ff5de154a43f0bf38b907403487346618150454a15be8935547faf98945cf4502f7649b7fb6993be0d924ba7e87e5c44373d6a05774e1f29b0405671ec2d2912145352a9f45d41c46d625518ce670cea41617a3a074385e691abd1d9156a1d614d5fb54f097d82d80c614b6b92cfc8bbf18ecd7c70d5e7049d93d1e01d3208d0df28de97dd2f92b2384b83a3414fd99c8754c10b9e5dd1be2056f367ff898dec986d36884b48e0487aa87651128106a3085ec747b37f462bcf65f40a63d5ef3e7f7cceecdee0471af487ef9a024980f7d83f5964932f413bab5da896195fea92a65bb5e08a7a9bd68e57b2e1444310b9ef9f9b1b0772aea0435d832578761abacc584d3588cdec05e37241fdd2de96b2b67eb007b4e5f9d4ef2a8742af5235a45147c3cab7323fd344569e919373f12bd5554e858d3c3b21c295a1d79c4a4fb2a7b79f3ab4817fe0416134b576cce565e369d8770ed9c2924f8be0dfa9dd680fe77af006c4499b2cf442c3a8c83284915263e978a0343afd905502056046dc7ab6773c132468e7578f4cfde095720b8e785a720e4bc40228f788b0f27669314a5f931b46bd7903017f8e10890fe23b330b2f9651075346d3114f7bd0563a61aa2b540a0abd34d4772278bec85e703c9d214d3cb2b767c686f94e8433cfbe3fab6a77d952576510c5cc764230fd772df1fee062380a787e5e1da520a88c3e08b7c330d28d614ff959b861ecc7795fe87c22712ae536609e6bee407518e19d641c5b653da09e59b8800e89d17848545190aad2538d869bd717dbd8356a67798d9ec5e38da75c9caf09b6ab547b3941643edf2f02e64254d50e36362c41616048da6c425bf9318c40ad18669821964ec7cbd2b8714e8f5dc27626caff71a47bf64d476ce899f18c24556f7820202b9b3fc5f4e77ac5be8c1bd2e3492682645389b4b359578edf64a5a823571c07547829153e647579c44813fa75b8937cd5797249dd5803ee0386f9cab266917789d973c3c989dff5e0de1a65817d238899a57e9e48eb67c3d0321d4dee57cc778c5525bf8f542e90828a8b72085cd25067411b57e1a7d11a4f67da559757ad36fbb9f6f3c55cf6723acf5d58348dc055fce03fd929925ba3f6e40db6df8f0358c8a335945849649d783b52b0006124cf4042c3f16a854dd4a7672206614e215921735710d162219312c171da4b7649882772eb6ac18293790f8a6ad0eb8a98988789622911a626f368e825d45f92441e6949bc1b3e57a98a2136eda230713b4b6c6175aa129315646973336e21535ebbb8b8a549687da77a9c603751abd14723da67adc45dd8ecffb37995aabce4d743db9059e992aa435f87ebf2069785b20d1282e032f87ec90a5977b5b6eb7ce5e14e76816f6d8aa2a99d88a41cda754a8eed7955bdc677bda57b7c9308d8853619ea8795f972807be4487ad3c6ba8177c1897f6ea77077cd107d7b0c6eb9775068bd82b5994983546a8b789ca4fc7e30fe328a23afde89fc09b97d0dc4b878a796bc885f381176c0dedd7c3009868708763778074f1483b056e47b2d2e6f775e060d80613be47905e3c28197a2b2867f2087840da05978d324ca77d0d2c3838b448282d320027d0815b57a46e25386e546797aea5eba75c4748a77a68fe6769eb2d488d27ee978dcf669752152f679d5d4447e23d3767a076168784a958b79e1e6cb7e174abe7e0952b07a7e773b7e902dfe83891d937b603f948047799278c0e56181423661814ddcad7e50682c7bd2708e8791bd117bd3ad5d764ab9e9851e6116883d29db86051203825f38767ecf081c7edad64780ccc1007a419fa88156cbfb8877f0068a366cf17ab74967805410d1775c0ec084f283567a15ff0480a7bab185479db782a0e0027c86b9e58487498f89cbd316877cf25b801767548ac2714878a7a81c89caa1d885c0633589a0289b7edbef3e82b44ae88619e8d979c7e36585e1ac7d81e3dea681258e21841709f6844a668580588df77ba9ec97766b4321899d7c8f84f0b64b880840f485a1533d851767a57d4a544c83b06ffa7dc8b02f8747de5c7fbfcc1387f25f5a8a96d15289712fee8898a5408dfef27fb1fe337a96b4d9119e22eb87a7befdb497371c3793e2cc0aac6839ae8fdf2214934812e67a0fae55765e185b83fc9293793110d187dcce0e868708c67c2d76639bf921f880fcbef0956f67119f67b9559a35d5fb9b7c1ecc997a8cb6b78d5cf38c291b8a8b95baa28623c1f77ac0c1d18300ec467e9c6e94869bba197d07b41b8215ed717c33a3518a2a69078e6c91f6ad16430393da5506a55aa5d0037315fafc42ea2304936366d8c6a231a413a65288914a4878fdecb7772cc2ad83e9a63a83e6830079d593e17e3d6ab47b4116c192d8e6c68cfe19c9af3ec9c39005755d013a19f177bd9ea67a4d820f7a4e487c042afd998ae5808088048d1c7cc641628a98e6237ed84a2e7b4c74f67ceebe667d388172975a9ae8afa684c0785fc93092ba7ee176bb07db75b140997b504ba975669b2c865791fb8b03a2327b42ee2879af368c80edb7ac827a8a198220b7b9783bfb7779379079828ed03eb60c7aed938ef44a98ff16557824090280d15731762a53287703a3b77fe63bd287bed734819a8f2080aac48c8253cc6a75084b27795ed0db7599b7f18705651188868021a7a69f5eb33e38d97dc4fd1985411d5076c1516a76d8de15829ba8e8861fdc0f88aa783f7b9aac607cc4b52478d9b68f7d03c7a57974203779ea94e0764e1d8f9d8ac846a5eb023c84085245853201b782e10ac287e06f07774edcdb8465e7e67b4f201381f6363f8327e4cc7f49584576e49dec82aad62b849a18e57ddab9dfa1dfa972a6a2b7127f6d3b3278c7a2f881f0af98824535538250c2998900cf9b88288d2778e3a5a29607b80c8af1e1f989ebb4ae7dd81bfe750a478a76390a5b7b16d7b9993e2d42cf578d667a5a367b78e9f23b7b6d993680088c68756815f1891602298a214723abf3ed7f8f93785d8a60b62d7f9eb218890b14197c055eff793efab48717d3f3b1cef2697a0b0daf7db98d5c89fd22457b7ea64a823c2d0d7cbbea0f763d9900fbcd7c0993dd268a901da4f37cdd3adc772d0a257608a94f6af2ecfe8990c841a548ad0f0355bd0b81c8cd508356dde386276d8987e4c8a17eae24597cac2c9685aa9cc780e78af9a7128b35a7e9e43f76e95770804540f4893590636813988480ba2f139c9f0c55cf83ba19860744d489391892880cfe0388f03fa186e898e57bdd04e379cba8b8fab785aa7d307981941cf013891e2b397be66ac778effb7b751ce013894acb3e846196ee03de219d897ead1781e16f55890797767732717b7de9e02981710be977bbb463fcf62c2695d6343a977160de77eb897f7530e5f883ab1320711d583f8542c6327aa93f847c26e8ae8708649b7e8188db85b068b58886efc983bb205d897fa99c8468f85ef91cde28a52f53e29aed1c0d7f8d8119889b02c485d946ab664e23bf880482d580c720ae03112885d3da3ef5804946a079c54cd5818cf8d489cd3b628376f4f882b02727872cc97d22c71cbb9c815fe9843299d185b9f9268620db128aaa5432880e540f7cb833b28a1d5a6dd08ba32078d731a87a3e5420770bf03f8511f95e7a99760a8607a9747f5599b1fab4e9db81987a0e879b025b7c8d6f6978d1bc797d09ed717cc600de87c2131b8498b4da03fa05068478a4b287491ec17eaf7e0c897045e87ea6f48782d212087c4ae8261d0f6f8a88c0755084709f6979ab8ade7818d3fd752beacb841a37c8786bccc77c149311847b83808ad929b8893b3819847bd2c27b19348181d8928287ace0be81a2481c1b8b644980cf780f771cc794839d461e7a85872d8038e63b7e25abcd8744d4f87b76233aa0aa52ebd7dcf395882d352a8351529c88f9ed62882f1b3d8a2e67d87b6dfe6bf8af405a83b1c9a7781e89ca76b46e807b4dd55f83761f5e88a1414e8af230b1851248a69d78bd977f239dc87a30b68d7f59940889c67e1177fd92fd861dee88864cb1591be244838471e77587929508875f678889cfd22b885a6c6081052f387e616a7a95bd77bbb1b62c138a067367797a4de184bef4d981d4d4f285ee3ca07ddad63c7a8003257fe6a788793612258267cd397e8529538850e641762ba213796a18c57ed784b7a52fd508a5ff20d6869efabf75d4df5f8a0e37078a9a432585d194c478d9b3b2786337658a8ca57d878c9eac7a19cf377e01f38482fee8c97926b98085796ae89e949cc590dc73e87d162af77c02e8088786b96a808534d2869636ba7c3117c086a46f587ac74f0e7ad36cd0806677b183ef845e870b1448822f4aa087dbd2be7aca2314810d587d869815da803de1e7855f800b850d17f47e7a1e32f90724a69a3f96087f43ea127b6a182a7bfd348b830732597c4f97457bcdbd9182687a998096417287ac455787b3a8cc8246a11e03b6260486f3a3837effe43b89e505de9b95289f9334b3ab840b670f7df76c63884d12b084dc574579ebb4018104286881d85c12861f1510767af346872d88fb86b01c9176e2bb40dccaa58cfa8517f60409c52a9ecaebf394ed2204a1499d827e71164f818c8ce57bf993528a8dff547c5a128f78fdab6e8acf492e82caa1737939ff837903492c9e15b105837ccb6c96d364cea13718beab45cc63a4dbb267872ee9ba80433d0f89b982877b7aa0437c178bc57cc9db49812ee96d839b96ec7f3087a979a9fe4f8942f577a8b8aa46a5009723940ef30e8fdd242eaf54b30298a5b8d579ef96f8844b5bf77d5e8fd989c2dd558aa5f488833c105b7734aa5889366c7f787df91d806ecb87859e787d9079ff13a63b6b2a8b01851c8c0015a1a35783748ad81b147ec9a56b894303be88adf98775b82cea775b4f787ba9ec7675b3313d7e4d8de588bcf81d8969f4238d5e69be94a58fecaa4121839ae315a69706ddf68a3c56d97b031a4487a743597a04bca87a08df6284aa30628a2da15488948dab86f283667e2ded9e895a7ef0864a1ece89683dfe7946884da33af14bac9579888c54d36097cbe562899b6efe818e3cda7c6f139b800d6a0c842c6fd87c625ffc79621e5084fe4da9803ad79080c31a237694b56d762587fe7576d051879db28578da6af183a7ba867b838b1388eb4f7384144be37e35e7437bd647c37642b8047bac91fd8509359281e07abc84e38bcd7b2ef4177e16d7e4829677b57b6a3c1c86ffaeea7554a4c381e629cd76f4b5647af3c05781599421804f32568846ba047bf5f23485aa42797d24c8e1823a8f7d7ef5c3137cb9f9f17d9b79c5771320817ec486607559163f8aad94d487d96a8478604ae689faf40f884899338a71ca6f8052b3ca7934c7b279ef72b6833c2dcf87157d32833183f87e41530f850d5f2f7f6271647a08dfcc76e52240864fd8967f99ff6c81e8509d75436ca985506f117690e56b82115360820063ec842f79887b035b9e81b91d167da253ea76c2179082a27e977eeebe1482cc8030886afb707ce3c56a868b4f457870aa77776ea76c77fd1b65780504aa7812bf8d87f5700f7f4a42167a2d9aa485e8eba27a02a7f98750398e754c7f1c887ba3f17f01a0b27dcbba247c8da525856b67a37ac57b168437f122843eef50897e485d7de3cc4683d97ca77da1c35f7b1e65eb79f4b56a88bc1597889e305e7b62cb8975661d3d7e1b6dd27fe8bc4079c2f3808adaa7f8865c81887f9797c6852b613681a2003e7ca021df7d2683247de48b3d806d107e75b2c9a0758575197e3457fb84c129f88193ae7b80eb7e668391225c87e994eb86a62a357d2003e5822c5d6989eb3d3d89e4e5fb82447a8c7eab8af6799e71b775277fe87aca187d82215976893f7f4277bcbb3d7aeab82e82a4b01789650b0179d29442896852507cef31227c8015c47a1ebf568a159a7d7d797c5080c1995f7b5cdfcf7e7743fc81c01b817e6dfeb0770e1e5479b355ae7be5cf2d8905addf7b8d5d8e83f57b35834e903f77ed5de57da439b5794eca49779e6a8d7f03743b88c0da998279b2597da81b237ca9466478589160773815fa845326708352a80576e0dfed75c23b5d863773717622b332872989b17f3d4d2a786f7f6586858e6981eb61547e87ae438220d4b781ca47f88066367f77171f6a88bd47c281d086d77c69edcb7881ed067b7a423b84e9e73d85d3a99788c01bc985b61e8d76b1b04178483ff5807d0b4b7ddf077f82ea658b811eb49c8866adfa7e3dc41d861bf6b97b1da66c8463379688ba6c5778bf607b82eed76178484af37837732a8261abaf7cfe95a67f144ba6784c62e087cae92979238bb68159c3217f4d16e97d58695287eda5f579b737557e8a4804765d5d4888738cf9790689308957215e8069a5c6889500347e88bc947e6cb65577c719ef8680d45c7d6f8aef86feb97182e5059a7b7b08898a5ff7cc7ae2be8b81c89ebd89ad77c57532305b85370ef17ad5c9d68482fba7880ffdf18283140b8a546afd7f4809617e5e7dd8788e9a0c83ce42227ada17358838520b785fcca87d83ccb57e3cec797c81ed177d3797b3796f6d557c59827e879f99c49d4094599d8f2e11a25021b88741121578fcf0f187ab6d9d86fe9540800201cb80da5f0f8072dce8867182408610c3e687b517098405940177a3c62f87a11de7a140c6518b772ffe90d0ff517a6337bc7a4731e884f009e481c9ff5d7e10aaaf85640f837a9ddae585f677827570a3df88fd176c7fb821e581e3141a880da01185b9c74d91a8d0adb5a830b98a98d596854b503a7f71f93979f199b87b576d82856732b6802081e17513731f86aa71de7bab9c0b7b9504b77dd33dc588c3081d8711a6d69ce9d132b70f581690eeb4c387ef1f3f891488ff850c6ad17f65c33c83fb556d7a7593da766c6ea289b8f2d4773175507ff665ba7b1b1a07889b55d5872eb3a3ad2635c08f9e5cb1abf8cd4880b438bd8207fc1880c7852a825ff03b799761ba7d45ff6e83f3c032836bd33c88f9528b7842413a8acd5f41791241c6797e00768626b90a94288aa1a5666113b2936c9e8674c93378bd4b018435dcbc896f86f58183f0878944c2787e8bc6a3800e95f28030ab2f84eff0738796e3f086a3bb4a787ab2db8e8605e8029dba41fc0fec099202a3146465e9e48541ca737910aaee828218f280c17cd777ba82bb7f86543685b164ef7c2ba9438786dd3a8a7b507f0163f5d885402166773f8ac7876b9d607ce33c1c7e19b2be8724cf6d7c03e4fc8980c2947b38276678a01a957f5b20d979fbb3b980449eb677a3f51a7f85875e977409adb1d85985923d3d9285a373648968b7367a99c2bf777a4d5e8bec6933b49ebb36866d3b2a857b913e801439228606bf4879af072c7846471082c4eb50792a9bacd048f7eaaf50a4298c43f866892c81747939ed307b3117b0807c33b579b10ac6ab76fefd84ed4008863e54757ee60c6c84d8e57b7d6f137d7befe98b81fc80327e5272b490077466a3fa75cc7bd93f9b809600d4816a061682318eb88537eacc9f21a31596839c47862c81877795452d83768f2486d13aef84288d59805cf1fc7da8802b7d5c2bd79efe2c8a7ba4035a8adce0c37c9689f17f1addd17ffb0d3d76923ba99a5f20aa87138ca276bc035f79cd58d37a36caff7de1d482802d1158980da6d278e6c8b2b0243f45784809ef7ebfcca47fc88c2e7670912e824b6d88813c80618ac0073991fe161885080abf80bf4366782a53be7d00c88f7c081ca67d279ca488d6e2fc838529d8da6786987e49e16a8672369b85ea9bab7632300484fc094a834564e5821320058750819d787050477ac7c6fc85a97c4c77ce05b385d731aa81ec7a6b7b21116d9f402da080b61ed37b640f807b9557458322ba2980bf02c67f26cbf57f844a31f92599597dcabe038254c80a7c11f9247eda30877de65f277dacaa7c751e2fb2862d35b4d8ab39677e7c740f822d9a4b8286fa6d88fb38668752b38b8981ac3286cae9891c02f27487ab62bb7a1fbbd7830cdae57b0009c67d972b7b7f732b0b8a8c270a7926b9557e26b965778754407bdb421988008793830761d8810386eb891e616e7dcdfeb21daf446f7f4d284f88033e8284a97cc4898d76f6794403cf75b181cc8384b694886398b385b1ed06868003e785b80f6c789337238259b1cf8602d2ab82d17b4076c8df6b76b19eec7db223cb7af598fb8416b355867f0e5387afea5e8336d12c79d8f7827d10ceb685f72b9b76943ec675625f6c7b8ed07d7bf0e51289590b7789512ae7f942a87d193bc3b7860cfe8b756a23c6798e6bac77e4c1b776f9a53082692e80857c69bd0294a0e67cb08c0388f86fa6869b434e7c16188e8164bc08860b8beb8269e2dd7fec151e79bc9e1880227d888822e976806f499c7e152e227e8bf5fe7c00c82481e898fade846be38140e0277b84f7417c4f07417e06246179c3130784a5407a7d9868321b0570a17582be397afa231e825cc2eb795e065278485135838804da8666c69177ecf1107f5355087c41e7a28673c63484afc6d57e43856c7d52fb6b813af4d0844c1f6f76d44f8783c1e17f7db42da482acf24e771cfd3281b546ac7526d60b8748fe1f983c79bc753462cc825ed78578bda51c8887083f82eb0eeb84495f067e0fe4491cabd286868a4831815475fd818f38ea777403c98871e7ef7ea3c6678512d81d865d110f8c34698d7554afad851fcdd8810c87aa7b7576bd87b58e8d783051d57750323d8688983780655e137f06774080977ead773b79897760af1f7ab713d97c320134a58490f57fc391ec771c748778eeed3a83d8e5cd7b0c1b317650397e751e2d439514250f8869f46e7e32011f7b923bd47f1415e87cca2ae676abd23088e0933786f3370faf90fc5c7a11700077b044bb7d6b67398893c04976bb6ce7844caacb8e90150b8a47387d87a7267a8092e8f383250cb87f92304877e0684c79be2311806aa14e90e6c4b184e8d9447a36415e7e985d2b781cce728a5505d084eb7edd94a0c6317d564da07d912216873720188445ffa3887be4cc850b4ac98349c4fd77b0035ab57743148037b193853c104580ad82d77514159f7eb4c19d8ad4e6aaa8f7030ab738f7d0840fe4f07f92831f80181bbd80af198a8857912a874cc3538aa3a9b184886909a28f67ac8db04c29208044f37b744b1d85543f9976bb1265857df9789baf534c97fb418d816624f780bb2b107f3e951479f5987581800a257985c88e7e6c757b7600a4c1a0b45b9c9448f01495730fb57c8b73cf849c925379f7070f94c5f476aef6b56c92385d8c87d66b3c89f469477c88869387e26060883f981786026df37e2a19ef88f051149ed7d571ab211d0696fa4b4c925b06cdf90b12b2acea4cd994d5f38fa9096b1baa1006b2833d1705846fd93c7608d46e834a25df80a5acbf794cb5a77e37326d8a1b3e6a75d1efd3932d0e509fdb5a679bdeb55f839591fa9214bbeeb30790b58de9e509994ae8207b4929a68874c20377692e2b81b23c58827e0750779f499b816087c97dc582d977e65fd27dfad0327dae652276a0e4e380c964e3814df92e81d70d058694216f790b798d810e953b86987a5c76f1631e7a3199107cecbb598a1b5000879416c67a433d1e807fa9d0788b7e6b7d6b1f6b80f450b3784ad6cb7e7f3d7789b09e05783ff6838450b7a67c10fd09819ea75b84483429889117d079eb12ff7a64ce877e86dd3a7e44c2e576c4e4c78992dd2184b41b1083ad8de681a2659884516b99797ea68b8a7c3a96812140577d7050d186273ea2868625a48003f62486497c2d88cde11c82c797597a68273a86fda03f7a72d19a8025cf8e85c3e48a868b3d3c8216a1b67b863b8c7b9eb9ee81410b977d9bde3c7bcb1f817ad4cd4283a743b689f40f92893852d2824564128963b528848678487e4cd9178a6b7933817714a683b4a4d1794593ff83b695d47e01c4fa7facb56682ef67a086e7080681fb67627f9dcf917c8438338385bd647cffdd427886d68784084b84788f721284ccc1ae804a8a5f76b0731179ec61a875d319af7742add57f49588b781ff5878382a1be75ad9fc286be0da075eab1bf8001057f821ebf5179a17bce7f95c3768523d345893eef997f9803a383b5587d7ea65984813428377ccb4377750e1eb88273b48686eb199e7d47431b837e5a8c76a2000e8217f7a989b529a2871d00c0889cab9b8092fa3982b886b4760832407b0732107918d3578636b48d81ad9fce7f8b4f658a51ac688904d5e378be8fcd7758862e7960512d88e2602684f06ed37ad84ad7875f38518621ac3d84c5f94f83c105c17efc6e887f88864f8349f38381003f2e7a1c0f90805953987e2d11df7a75b7c276c87a1d7633d23b83f3c07b7f271a99754485fd89ae19697fcf49c475db428f75355e16875ac6f27f986fb77704451081b5ab4f8199c9fb85ddd5ff815bcdc98699d0da7e40aa8478d7a8217de64da08891b21a7b6a4e477f162aa184ef848f7963e4ae7f55b2747ee8aae78113973e85bc15dd7d10eb9576c3541b853c511277f7e38d8129ee7c8277de3d8425f39989f3ae567b08c297791d942b7743eacb864c9f9581eaee987a2bfc8e89b6255189a1a604884780c6894f322383d6c503779d874487740ab27a1987977ecd05c47d9e42d37e9582c97e93a3827a8b07197b60807e88ec27cb89c33ed2779cf7a38491b29d87e8ce317c7606967c1cbc427ff2a0a4895ca50c84099aba75434fd6808ec5db790bbae582d59a267b2193377c198e02882392d9786ce58185cd223a764444b782d5ed938493f6fa88497cbb88a547368407df8277524747800ac52479c3ef9379b7ef637d0a7d448ae505fb85d2000b81f89e868a14eded78354c89764d69d6883a67ea761f730d7c1660c57e4b910c7f4265d77adf24907994d9e97d9790c1794b25d48978b6ca805ba2e27bc9e65c825d47877a0075ac86e4f7ef885260a5894e07c382873e7f7a765976775ddb657c9d6a5c867224b68795a61e8a8b32bc854df9c77e2bc6047b471f6c88dafa7576b252ba86dfb46f7752befd880ec0ba89b9c3e67b955e41806d104688ebeaee817da6207ebb5ae182a6f4a0802140548aa224798a7d8296828dffb27c268397866c75ac893ee4f184c092557816be177d6cf78b8489c31a7a8b90237e0af46883a3bb458803d91f7f9653b476079058880c6ad07ed731e88555f31a8873442379ff13398a14f8d9820ffd8f882093ef7c55feb27f2c15658a7e072788a4931b7b7afaf276a3bfcb7fe65f8b848b0e817c89f27c89ae2b6f7653721d7e3a842777da587b7e47a8b17d85eceb7e2451a7855fde4e78d14ceb786f37007e717006847899d67a8015b87736eefa797b3712870022057a8176d47c810a5b88fc1b51832ae3317c6844e189980a4f86a13a727f5a5a8779c873bb79335b6c7f58e0be819283c283f594d77c459a187c4f3dca88dac04689497cdb7571e07b76cc02387cb3de3e7e1d82c389e2b3d77e79e1c187681c76786295c77a50157483bd35367f2dbec389cbba5088dae83a7827781a7e48f7e084e31fb586c9359a77f83d0b7e02cb9a89ada61b7f89b1e87a67d88c7e6707427b99938e781946a582d18214818af57b892ff7ab7ee8989c83f05c297f6f49ac7b60c87b87f337348746433583d576bc75c06e6582276dbb7d4045f27f54ec7b8095e77f8111b8f19346d17daba9fa6da11cf467aa3859288f3cc3728b9eed0699dce1c498a94081abcc74dc93adc02d80a611e69689d47e76d8e5ef81f8df167bee356686fa47db8079296890fe180ca68ea14a8fd585aea5e57284b721d15690735e838c7fa9fc90139b619ebd8bbb885e595787155da79923dc97853e25f6867c169a89cd4d7d8155b2fb7ef283a7b6a01fc59039f30d8be3f2fcaa038f8c914e98bba90e3c390475cfe121366e6c9c95282d8c24ddfb76fcd3e8a12ce52f8a9e9c2b7dd731f887e5e10678796af378db30477dd29b5e91d6efb598e5c645a6c33d249705e638963a36d927ed7b3f7b468fde7fe61793872174c38c3c56c8806533e4946850c47de95ea0881d24437ecf66a68911ca7183257cf48036e333b14fed0a94b7f8369e40c24ab15e273afbf4242f7bc014267d0d46218697689281f3c0707d42369a96dd92ef8486a7e285868a19877702ab7e74c2ba75911089820964c58cc1bb5a8d0d6168ab7fe96395f8046584913b5e84dcbc9d7d691c4f781880ac7fa4270798fc66e48569596e7919b2f9850b92ac7fbf720d7f5d9a7475b3b304b5ae023e9c438c2ca7b54f16ae68e4fd8838b7e27e9bfb787efa2ae5838a890d7e50f8278074ddea87b8a32d8a8360f575be9a587cd02c0c7fb07aaf7fe7789076ac2c098d48130bb71a90919c94084e8ca2e23e82e93a1c8744d405766af43176f3135e8af881de871356c17b23c142a4336d307fe8ebea7646c51f7bbff01d762d648178ba9bac76c395cd88e8eb12057ce8bfdfa887df81df2b0b8a88218882fc269a7918b6a085ab2ca1813feb8f860249749eda88c17d924dfb855f5cae8124b6bd8722e96f79f4a3c37677f0507ba3a6290509290add8ea2a189b00a0c83699ad087dfcdd688bd35d082444b5381864d367773a2068d65335879d21dee7c9cd324817c45bd793abe9a874f689495c77f489a9d579b87bc5d58813cc8ad7b4385387c0e66b7818d118a7d66129b8af10519864c0458a4fb9f2586dd3a327a2bd82c8087913a76c34221860ecb6b77001bd794f5078d84332c2a7b60e553865d064881db78b57dc3e43185337fb481f4b58376b372c08951e20a857ead35856815ff87070e4e8afdc4007de575328529774a79921e897d22a158fa6e65bb79c5579677223ce77887ef4a8381acdc861a660d851bf6ad8548a4ac16a756c877f57b6a7858b56a879a0d6186631a0281c6bf6a87194d5c8932e4969bfa8ccbf9895f23810a3cf07f65286c78f45bbc7524f7aa84178bd07e3f08cf83d9ab8fa3c8e08576fc02a08a8bcd767df2d64f85af6114827e7ee886805d0476e6a01e83358240fc52a107896e9cf08443329d7538f1f7777befdb8471d5da79adc3ef7bb534d317d69949a6c15000822b97cf78ba65ae790bafbd89fd4d7388d731618871772b831631ba7fbe213a7d233828890a8baf80122b39868a89188a677a57843f5b4c7b895ef2f6a8600f8da00b8d7672a6f5894c7b4788a22bf5863b8bcd7b36eeae7cbc7aa388c0c8e27cb9b1a97f18a43e7ea4155487f1c4797fae5a397d739757783cdaa27b49bdd0b0f72f2684eba23585974f5582e0bbcd7f89f90d7b1d5eef7f7c0f586bc4f47e797fd19e1aa42fcf7d7b08a1832ad13d7c08f1da80f612927d6ea7ea825ba91582df3d60b877428d883129448aa6a1a8846f91f9772b61cd819ba8488817d32b85f3e4827b464e3d1ca62b8d86045e467d770d3e781c5064851cc3268677d3407e6ad78d8027eb5c9da485877c3964d1773c6e7f80b9287481069b7c7d71e72d768671e38039e2f47c8737c1849a065e82acc70280fddad8898f09ac893398c088fd17828828f2fa8ff3a7b978bddbfd891bbcce7cd8a43685f421b5879893427abe2a5d7697bf85825123907933e4917512ad6c7efe17e689528444878994ab7dd2121686a3203218f9ccfbb539f89d83848054883afbea7bea82be837a784089d74359823632c07c7fc62489ba9b2b86aacbd77b6fef3787ddf98777f641ef79bf6031824e12818604e00ca3a529537affef3e821e12c889d10b2787e00a2c7a784ac0764444d9838b73ee81f4aa2a97f456c188aa1e7d789f49e37e23558979e30dd37d36d11778d02c98aa1cca728171e797839ed69f840b094e7c2efbb8805fd3ff8517a4d181051d8582ceb2c3800cfe9eae3e68e2814702ba7e21befd811b7f9383e9b1567e24925198062adda32dbbb07f51d0827d6122a880e0f14c850dfa87893da07f8314d4a184ff784e83bc277b7d83883109d35d4a8746c5a0792c44ad75dae83c7b9eb9a0825c7a1b7a5d52ce8506078986a9466684c7fcf1898c81f8824fb4347dd606fd81d8a42c8af1053179539681856a7dcf8dd362e41904e8497e9462097bc026c016948e1b8652962278811c51853e421278d9878688614d6086cd29d0821c21a97c8adcec7c6d87147671ce407bac0f55806881268f947260a23b13310b5edfd2a1c0c7f8940b8d7877b8c70b775a94d57fa43916770c1b2089645e357d593a168549cf977be181487c77cc1386e845a07535f2b68cc3f93d8f3201b17ac14abc8a8e117eb15ff74f93059ec07cd0aa487e5ed0d4894d0bfc8508db8380e04b67780134877ff9a5b77605c37786ff0130841ad252763105e8a7cdf2757929c75685b799a78a41b690a64996109aa444b7781e368c7c151c1476b3433378a7557c7dc6249381bb4f0d7e01e8c384f2d645887c0fc07c865f978c4b78dd89d64e48a8f454d57ddbf32d96a030748c39814a86ace04b8015be4b7eb8fde777fb7df485a3973f81e1881f89a6ba96887bfded79b98d907d9993f17ac0a40595b5684078cf95c1a99852d1ac70f49fa4fb34fe9073a422856b26b07974203a7613ea107f83cc6088d6e2587dc16a4c80414cba885367f67e9707a4890619d8850c673880f670ad8be94c86962f2c84a966d482915be34883e82c40784062b17e5ee96e76f09d1b8650b0cc7b4784d3877a25967d8c441d7df761db7f97a93080897025826283207be7378684332cfd7e206f437a63498e87e99f8375b4f75189bf8b8b7be32af98687c08479b7aef885f88c6b7d8f846f7bb3e9da7fe558957f0009dc8643a96c7e9b148879dbc08a8215ff388aaa42dd7f4a5ff0811ff1f5818e06e47ac8cd4a86f6eeee82aa30b87abdf8cb8432542b87761f5d86f3b5f486b23c8077ee9ac2777d4ca1751ab2a078171f08853d0527878355ec8757913e781726a784ea9b1c7e45db0980bfba027771e0358258eb2e89aaa7b47f5db73d8a47802a7e321e8879cd346383673d8e7ac4b55884a2772188b2a1717e6976c180ae9b567859579c761d69ee7556b9cb7c9bcc00847e071c82ac50d27a3433ac7948af2d881523bf894b91237b1a1e3c852750dc82ee23dc7840452f7e8cb0057b6d34a688a7f0a275f08be77df90aca76059f577c7397527c7d94e488f744fb83783fed85d5939b8708c94688cfb55b87f8686577fd51968287f6f77f337fbe86165543771acbf4779a06947deba203803e013b8a49172984a08d288449cf7d851a308c8172891783a59ab7898231ee7b1d704d848613c57ef62f6b81dcfd4f8026b9d276339c607d0b676a83f0d3d784e1acfc795372c67f94212d875410a28113cda37a1ad69d85a7d3d47ab6e8107627012f8823792085b2c5b689fe4230843eaee281838b5c7c92a70687ec03157bee18507a9a351d8019295b81ca605a7d1004fa819dab4179e63b4178def95b83a56493860e428676c7480081dc339c7f00feb180301bc287f90a0378d8c1e17a6993787ebc03b389350030881cb133894851ac754fe3c9757a3bce77bb5ac287ec6f8c823ae93f7c3e78068122c5217cfa0680878cf8e678ead59586af858e76f8fc64824caa7889d3a99581f55e177d90c1ee85430ef689c81cb975e0b45e7ef2e8f1820350b67a2d52c081925437839935b97f93ae69818a7e838367fc8384b5e10477daf33b87a7c180893f7f5b8100a4f081c6bf058280f88b85273e0b7f0f374584dcc70782d2891d7f00ab0b7f1e19ad813f50de75676c0f7db93a287f5e4e7583c117797af75a9e773e951688613b787bc217e47769ede279fc26547a405786859d4d487e9e54ac83ace08276357bf07c9d87be829271698a439ec77bef84018a124f4d88fbccb8778beaef890c879076ae2fe2885dff2a7aba41178a9b8b9689aacbe97de235658477559f819271118213ea9089aebfd081aead5a7ad987af758288d4891aef73819d8e8378a9c80579c0f0cc7805d523830a2a2c7b34aaa67d9c09937502cb4f8399110585a810cf7aa48c18812e3174836bd3ca81b4c8bf7ba55280851385bf7a23cc9c88e111248a3f7ff9836565b37b2886a389ad82808143d8d67b0fc02a7ded52378414f8ea85680a7c82021ef280d13ab77ecc26c478415e777595212b7637ea107fdf85e97da2d1d57877a85a8f054fd87817cc73785eacd181fd4d1e7ae8507c8608649675ab49ef753ed6a17d82594b8a75be6684e994417ed008b18982d7a68085346c75527dca7e4cfd827c925fb18a26fb9c7d83969e80d5c962781e2426808f9d187f1c7b6b81bd23737d36ad907c5ccd9b88c213bc7a2044cb7da30eb3848296f97a858edc7e66f5c1804dca5c97e631ac8383d3e9924d704e7be766177fc283e37e0940a081f5c3a577effb0f78d128dc7ef283a3849ff6ac768db7d7864141ba88f4fd0f85ae908783c86fdf7aea1d9976c06eac76d5395c7bff787578c2e8a180a0864e7b18d3047f8188748722b30178ddbcf278d68f468626d2a6818176b87618c81588a141c77d688c5799bc773b7706b86a762f8fd0795bd82a762766388564453c856c63237a9993867c28980d81e372fd82d659ef7c1d1de3817f0e7e7dd36cf77e48e5af80200a027c2b7ea4805127f67540e4ce77fd0900783fae4978ff664c801c57cb775701257d12f56581c313ff8387e42676cdc80a7e0541767dcfefb37c209eec7ab27d24874b3e52908b18f993d8534d932c7e948a6a2a6a81bce6f381587bb77d9feff67ebd766a7e14d49a88bf55a3791535c2888326787a68a97579943e53898613d986d8a4c189c1bdcc85633e9d80a826da754c1a851dfd44aef8d62ba41e5d0958f764995a18c37b007fb563ce7f82183f7a42d1b57d7f0edb788f604c89a6c53f83c6f508863d712182a796a8b87bfc419c5c4d928c461498b3c64e467df0f00577cbb3bd7cf9b0af84652f06779b180e7630af657d3e83c487f88c648321596d777838ed8534b14086f6483682494d52a54b994fb14cdf889674ed6fe45cd01677fac9c77cdae8f77eb63b028737324d82d2775d7bfb0d5d7ce1a574786c8be787446fbe7dd4cdba808b3d3e7f6f081176c736929aec6cdb931c365da2f60b657a63e42f894e61fd7ffa064277e70c1080eba22c7eaff558792e18c983a481be75246e828625a70d7787dd30804b1a267b30c8b7907cb36899915363b8a8da7c832c2e1c881eeaeb78400f5279d4a987769820c27d35d5827d56787d7d35e7d0838aee81787bf6f485b379f08946ba9e85f36d258811ad0cb5713fe3b036c48f803b9dee809a182a7ef8bbb47a816fa786238b207b02837b866815257d73f59f7c2c27247a456f3f8a7df9bd7a65d5ae7c446817839bde42b42288a1ae2704c77caf078d7b2ee94780d796e57625ec0d828d2e037ae850fb8070577a87aa8a7f88b9a6d080448c2a77e563cc89ce9c0e79f6a63779b5abe08996362dab3a1b5295f3a0c788b0816586d5b7c7830c990c78718d2d7ab1520c7945c9ee76279178835aadc77e936d187b67e3087a32c44e7ec7d1317758fd8d7c7db13a9d7462d78fddc781813ad7a88792a79383b4fea2758dc2c989eb612b78cda49f880c754177d7a15284f6e3418453794d7fe8624288e2fbbb792480f88789534188638656a9a84e11e2c2212b82fac52c83c91c0177bc320c81463c8a83a6d73f848fa8f3827ef5c586fee8e884bae36783cb26f87d28fd03897ee3f78490229887bbc6f09981c9e595298684870f9102839f9c44890022577c7403908286427e86c83960881696aa8591a06683b7b5f18627b56288c3c7a28517f01f898dbed87729f9d37fd8d3af9a36f8527b9f8ac97fa81b897950df3377dc74ff7d172686884b2c5e7ce34ea786a10be987fb8b28814606588577141781d0ceb5780080dc7b35b8089af50605a632ae6380b113b9841f448b7c53af8e82629c8e7b6d462c84b529f8853fa33e81f3541a7d5da56888347b008ad8f76f797a7175779db675760aa19a88e6fa9187b1590baab17eb086d71fb08185b2638ab04017856421707e37d805881cb15d88724ffa759038b588f69ba18984bddd7b47cc747938328d8319a72d7e1ae8ad862912c98eb6d158a54eb704887212bc76e02002850249b477f2f3da80020c547fa9222488c3b52c7c5b7edd815e06c4897fd88d7b30ecaf79f2faae8243c6a888761f9395281ded91edd4141ed0d5b978f28ecf8091ab527827aee97c6e424082b75bd187f7195d7c9a7df67ac230ce8419a0958948fe517f51c93877cbd7fe7fec03fd81652fc6882e1c87996f89b81c7afb5c7a5f31277e51b72685560c9a7f80e6cf7a86cbcc7cb64d1778f2c4f377c4eb0b83f3ae66890e01a978324d7d80597000884858f28894e06b6e7f37fc75b98dd887eae34880108d7b877db89d7722e2de869b79b580e99f9e822fd347852df4697514cd9d7fe032f18769db56862380f97f929572899eaeb77bb3670d85bded4318a4fda9827219bb87696b6f79f05cbd858a7e6d8901e84b76f7a2c97cda5fd17fbc7a1e8244d4ec8081234387b7494478ca6b05859607b68926aee289951d3d82e6b2a1769dab9f826582fa75eac33276de3abf77bf1f7a824bd2867eee2a257e93912887daa739834ffce37db83364850947b6875cd437897c1d8d7fa90cc4855ef0627bc0e5568409ac0d7fea82ce85b07afd7eff01eb78a8802189e84568772ccd0c80b2060e7fc271587d5343288876315283a33df2894dad79822b0e6e80b9b1dca037593b873416db7a3e4db47f87d20c89e8ce2aaf8d2b4d87b39d3f7908f86678bf43fe821016298197ea5188eadc098aeff09e7b3ee8858894b85f7d11b12c782ef4e396200a39180823cc7dd0a3477c6ad73278c7c6d4ee5bf2d17fcd6a4382b4c84583ab5b6581b8d90a7d0d46737e1dd5007aa0083076bdf83a7b62a7228138a59679ac983ba1759f3791f434af93ec47b7156889baedb06e6a8c964b139ff953427a3de10f7917afb4882cc93682cec40c7da128338a331abb76fc26618946cc1588e546a6877ff118a6a39c919a6e8d7598e435f3adadf59f9050ddb694d615" + } + ] + }, + "job_v2_failover": { + "kind": "job", + "request": "{\"capability\":\"wai.video.int_motion\",\"deadline_us\":30000000,\"fallback\":\"wai.video.av1\",\"job\":\"job-3002\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"media.encode\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.av1\",\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":300000,\"failures\":{\"billed_price\":0,\"failed\":10,\"failed_ms\":500,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":12000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":10000,\"provider\":\"prov-beta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793000000000000,\"attempts\":[{\"billed\":false,\"end\":1793000002000000,\"endpoint\":\"im.alpha\",\"error\":\"server_error\",\"hop\":1,\"not_billed\":\"failed\",\"outcome\":\"failed\",\"outputs\":[],\"receipt\":\"sha256:70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a44\",\"start\":1793000000001000},{\"billed\":true,\"end\":1793000009000000,\"endpoint\":\"im.eta\",\"error\":null,\"hop\":2,\"not_billed\":null,\"outcome\":\"served\",\"outputs\":[\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"],\"receipt\":\"sha256:422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a1\",\"start\":1793000002000100}],\"candidates\":[{\"capability\":\"wai.video.av1\",\"cost\":480000000,\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy\":10000000,\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"rank\":10,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\",\"via_fallback\":true},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy\":31104000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"expected_cost\":1036800,\"expected_ttfb_ms\":300,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1296000,\"expected_ttfb_ms\":700,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"rank\":4,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":967680,\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"rank\":9,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":898560,\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"rank\":8,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1054080,\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1054080,\"expected_ttfb_ms\":10100,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"rank\":2,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":864000,\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"rank\":7,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1071360,\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1071360,\"expected_ttfb_ms\":280,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"rank\":3,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1382400,\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1382400,\"expected_ttfb_ms\":240,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"rank\":6,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":933120,\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1333028,\"expected_ttfb_ms\":648,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"rank\":5,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\",\"via_fallback\":false}],\"capability\":\"wai.video.int_motion\",\"deadline\":1793000030000000,\"decision\":{\"decided_by\":\"price\",\"runner_up\":\"im.eta\"},\"fallback\":\"wai.video.av1\",\"job\":\"job-3002\",\"kind\":\"wai-route-record\",\"operation\":\"media.encode\",\"order\":[\"im.alpha\",\"im.eta\",\"im.iota\",\"im.beta\",\"im.zeta\",\"im.theta\",\"im.gamma\",\"im.epsilon\",\"im.delta\",\"av1.alpha\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"3fe0b709d0a08b368ae357c7451507dbed9d5634a8b38dde1167efb3d9399c16\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}],\"request\":\"b4c28d18a789b7446b60f16ab6a18f6b7f1a09a2e9bf1259962be058e23091a9\",\"sig\":\"82fda014d36990b399041234d9bcb58e546005d86ce56e9ae347cdc94681c47a1ed459d3ca0e4bbf70cf10266e31f6d2874be82c2bb4c9baf06c748cf5d25e08\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a44\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:7a4435badd60289af7f1f56f4165c16653c5ba7a4ada20ed423d5534eeb1f240\"],\"output\":\"\"},\"work\":{\"status\":-1,\"outcome\":\"failed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"2.25\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"2.25\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:6de3271ab2ab62f22b1458ab31ba1fb2a855f230474243c4f9566db5a2f73d05\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"daa4066f6d9a2b3590861799c6091dfbcb017553e9a0a1aaaf6884b628c542b2c33a9181175e47d0f0e787c031563c38fe70eb0e80956ce805ad1a23a1ea7b0e\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}", + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a1\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:97088be1827a14c973da8673177d835be34279816df8018a980659b2671cb252\"],\"output\":\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"},\"work\":{\"status\":1,\"outcome\":\"completed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"29.5\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"29.5\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.eta\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:3dd8a713c2789b081ebe98c215188a88094e36fab0333a47f4b2b83307a4c5a3\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"44c75ff9e2e84e4867e8a3bf79a75fe31f075f9dd03636e35b0c9db46ccdbfb8947cf99819f1d77062c67f9e93c3b3923b5da5c16bc3e31b35aa2d098bf2c800\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [ + { + "receipt": "{\"profile\":\"wai.video.int_motion/receipt\",\"codestream_hash\":\"277865b574029f700f4fac023de3ab06ae598ee6f8ed726444e91442a6bd59e9\",\"clip_hash\":\"3492566e8e2682e3b3bac083b4db02ef8eba9a7f15d9faf0e27feee0f6eb488c\",\"h\":48,\"w\":48,\"frames\":[\"e1d8e8f8b5c534be1421e5858ed9137808ddb849bdff2bf397beb32568d8eb69\",\"ae7214babf5bbd6ec279434740f3271be43d2392b8167813fa557b5c4426fa14\",\"b3ef86db27b82d303bc6b612cb224ad55259b4f2e2c0461c74dcce188cd64b99\",\"3906f91010bf1b9ca14f6e2ac9b499589ac02ff4465e1d9764a22443a8b29c22\",\"bedb1538c2071d705d2d3ab2df2c569ffed440278494649f9bf1ec881561c519\"],\"merkle_root\":\"0f3fe4aa201c275c10289c22f31e7211b555627b33a251bbe33d094abada6508\",\"work_pixel_ops\":34560,\"joules_micro\":0,\"uj_per_kilopixel_op\":null,\"energy_provenance\":null,\"parent_receipt_hash\":null,\"signer_pubkey\":\"4a29b9b42b4c7b8d947b226d503cfa1ee8b69a5cd3e4cb88b30db023d6d2bb8c\",\"signer_id\":\"did:example:sink/job-3002\",\"sig\":\"06dbb179359f65f889ac4d01fda210a238b80c9c5a7d04499d61b318a144ea717f351205ffec6e9804b462d1af5a5d09f724b0651d91e7f568a4c4f5146d4704\",\"receipt_hash\":\"632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe\"}", + "codestream": "57495631010100000500000030000000300000000800000006000000d5ffffff590000000000000004000000090000000f000000160000001e00000028000000330000004100000051000000640000007a00000094000000b3000000d8000000030100003601000073010000bb0100001002000074020000ea020000750300001a040000dd040000c3050000d2060000130800008e0900004e0b00005f0d0000d00f0000b21200001a160000201a0000e11e00007e240000202b0000f6320000383c00002747000012540000556300005c750000a38a0000aa9c0000edab0000d8b80000c7c3000009cd0000dfd4000081db00001ee10000dfe50000e5e900004ded00002ff00000a0f20000b1f4000071f60000ecf700002df900003cfa000022fb0000e5fb00008afc000015fd00008bfd0000effd000044fe00008cfe0000c9fe0000fcfe000027ff00004cff00006bff000085ff00009bff0000aeff0000beff0000ccff0000d7ff0000e1ff0000e9ff0000f0ff0000f6ff0000fbff0000ffff00000000010000000000feff0100ffff01000000000000000000000000000200fdfffbfffbfffcfffbfffdfffbff00000000000000000300fdfffbfffbfffbfffbfffcfffbfffffffbff000000000100fffffdfffbfffbfffbfffbfffbff00000000000000000000000000000000fcfffdfffbfffcff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0400fbff0400fcfffbff0100000000000000feff02000500fbfffbfffbfffbfffbfffdfffbff00000000ffff01000500fcfffefffbfffbfffbfffbfffbff000000000000000000000000fdfffbfffcfffbfffbfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdff0200fcff0300000000000000000000000000fbfffcfffbfffbfffcfffbfffffffdff00000000000000000500fbfffbfffbfffbfffbfffffffbff00000000000000000300fefffdfffbfffbfffbfffbfffbff000000000000000000000000fdfffdfffcfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0200fbff0400ffff010000000000000000000300fefffbfffbfffbfffcff0100feff00000000000000000100fffffffffbfffbfffbfffbfffbff00000000000000000000000001000000fdfffcfffbfffbff74420000280b35593c000000a214bea9451501b9ad0cbdbd9a309164812c7ece531911d14717c3dbbc1d27782217989f7218f20d121d7bd4ca1f3eb3ef1f71131429e2d1f626c3e7ab249c33af4fe2d2c042a6d2222fb9b3c460c33836571567e55a40c90777634123135bfb8e1357858f0dfd6cd3316844ae2fdb041518b067b9167f09231b1d6f1c16b7df311ea6450d1ea29eed1ecc320c2b747de0206b34c82a708a2525b67967473d53e643c54f6f2f42e6355aaafd6534aabbdf5fe1a866406fac26314f6ad812ef006e0dd2c39e124439f5306ba6e0396f65ff1627ef771e0071f21b088eae1efd0a7d22d53ada205042fa23135ba627dfdecc3c473a7353bf1ea7435671e53209bdc9581998ef568e94f260c2af006595d31a5d0301d30b0e96f22e27c43d162997a218be088f12dc9d0915dff4db17246c1a3c61066e3807ec553cb509743e78e21d250c19332ef30e3d2d4f94a0275d0ead4e59f7ff403f44c02ed1b145563b075b55c0ece2599ea8038a52c4e77287a40b3015595e178405f01716799f12508739158ce39537c6364439c2c61335c774823feb0e4a46484b29464146093e52ba6e2e3e5a0631121b992d5a46a848c8478e518c794638949ff05b4c57d23967cc4b57d3bb164147bebb2f4cd1452f40e1701817cec818f564ff13f4072317feda4f17504f253558977544d057484615df8028fbee312a5a55ed2c1c72d1257130d62be71dda51a0a97748680d2735181dc85721d3923f8d192f8794fcc96be998eb135e56840f812d952b26dc2f2f8537db1701de931a9e0b811c99606b1d7a72b81fe6796623b2e3442266abe726bfe71c26713b582970ff964812b3a7511b88474ad1a39d60fe77fb5b93faa43aa689e37f22cf656dcdde8d4a529b091869c19a199bf5af108ce21a33eb8ae43a8485f63a7c0ae7f3e9d6d3fbf35320f44e2572fb823070f38da5d5fb4cd37f3e167531443d7027341943de2d2e0dbe4918ce0f53b1e5a7368b2c3c6ff4ff9044663d54810e945168c3b1d019852e9412c0563e10ce0287359612c8365ce0fd34c5cdb9f290f0e017571aaef2f889ca179debd4f3065bae18380425f4d7c9dd18bb2cf626ea6faa24e3f4384b1da15a3d6df8b52cc90b935da2e4c23b9597355cee7f1945393e249b7b14ad729ff91432962e6218224895175df6f11b30546af34ef81f1840d4b4f24290fa19e90d41f3792fbd17b307eff2702189161f1552f429b1fc18154682320160642d6a8c304b9a74645336beb060762fd36780e26160b5380e4500bf316ab3b6594b76993031ace92b2efad9cb178983121b9d4845f4ba36071a9d404af3f9d4f2199f14cff37ed44717baad75f448628d19af3421f46a8b0f19184461f3ef7bc1178d00634bcf58624c6725ac619927f15545490f360e0fb877c6814c6b9ea2f952ccf3a3abad91da10ef63f3144a0f23340223ff35814709f4d3516c16e5bb75f3a3574719c25228f4b5a03e1636db84f49a58781762e821f35742a2181bc2f7f397ef311637054630ad43d250643a45395291b55b725ae5723bdd1b62eae7a445bd65319f19c63568c61a5b1206b34d3bed1dd63786de01f49a49affb2a9cebf3518ed9fb7f061bf402f2bdfb0bb9c0f344eaa4fb1bb58df3fb10a4fb6bcbb8f3bb45a0fbfbd11ef477204efb6ff5815087d668629a2a0c5d17e9236a698d0061d79fdb460b2f26a9c24f33529ee32911b3aa1515876dab37a91b8339f13feff22ac0af17a839caf36b8b36183cace0f27ca7e419927205f46713bd1740d4a5f49da36019a6baa1f4ceac2c19b530c1f2eaf4de19c6322751ef91df5b92e05f6533f2a760db246a7d1551e266a304d149e19ef5ab9b67c917279abc17e5eb69fbf214f2182014b4fb9ffe3e163705e1fba23dfe17e466a2fb4cd37c16dcc16ffbaaa6f61663923efb92173218345ca6fb512703175f6a95fb422b751962216358fc9aad68a047125962cd87430577849addf21174af2dc5499c4fcf8778b8293377e4ed3b12154cf3afbf46fb6ab6baf3dc41b0fb4cbe91f32c0b39fb2ef0f3f2262a42fbe21813f3cd5230fb476af8f3870f92fbefea62f47a7a92fb7234cdf297d11f5d8e12023c55bf666f4ef6005c8d58bc9549953d730699fd4ff8264fb23cf0ac1886051a1c4d05891af4edc2fbf792baf24163bdfbe896c3f32f65e3fb6023ebf2ca07d7fb66774bf4993ad1fbd99a01f30be2a6fbd34630f3275768fb7ef1a1f2f78972fbe65735554ebaa9390610c05a5315734087513d8c09862074f653884a096d36bad118d01b4762691789a9a4fb84456418eb0ca3fb4aa9b419eedf99fb865a481883a740fbccb302171e6b31fbdcc4a318d918a3fb2772ae179e15aefb5dcf1b17b3873ffb7673f4189ca65c5d080bdc43f1e1b278e9bbf0411aed639db279b76db39473596dd293164dfc0317fddbabfb866f2cf49fee5afb376ea4f3351975fb9baa96f394a45afbd65b6bf333ddaffb9de9fdf212c3d7fbeeead4f2262aa9fbf329a1f4fa10ccfbaee586f41f6791fbe442375aab92fb3ebf0cd287434e9d6e5b5143a22f6941660f17d858c6629c18cba73c167536ce1e8e78a81944d168f419b32118417e79f37ee3a4168ea062f3684ff8160f7514f3d3335e16d0c984f4e44f5716db178bf3f1e44f1765e6d5f39b589417ffd4263cb1b60b56568bf7410b9931975f374f710f5c7f4fa42325bcbf1b8b7648524f17d3a2bc1d17f181fb389846f3eaf47dfb8dede9f2ef7b22fb6cb646f4429fd8fb1ab5a5f4cd8e2ffb7dc74ef4164ac2fb955678f3aea1abfb511264f4825bd7fb2cdbf5f268318f5c44110177dd73146b7a24ef4d9557b1ac71c8ac855c5302606910468a110d2833d76a203d85cc1c16f25d02f36cc7671902a893f3c335ff186fdffbf23bdcd317eae2b3f3dfb9001a3c8153f3a8edd118ccf62bf491591a17bed596f344cc8916cbf73c423ef6c45d15bc03651b1912a83850df6979ba2a6292c2eebd5d91e87574332d1ec8640e210884defb523cdff2811f84fb900283f397e066fbb5636bf4b5af3afbe896e9f2ed4ea3fbaabb7cf42cfc51fb744940f4fc3dc7fb444010f3ebf46cfb40019ff4ba45685818c3743cc9991ca49c3d626e6cdb6d54ca28d67ab141e2599329871efca9c71b6444e22057e352f45dd8b917feaa52f42bfc1119743121f3694f9818db6c99f3d79c4618989917f426394b16467b0df3b1fb8f19521d21f48db4ca175a186e3dbffda754ced3533d92a3eea77ad2e668dd293056741d36bf0ff6d877943fff1c5c2be22145ecd620c546c1f3241b6b1627e58ef43e187e1951f342f42ab1b917ec3602f4f8a719192312a0f21e3ac51704a731f4981c4f168ba270f48c969c181fea6d40d92c977aaa69c464c1fe0b4fe4ac6e6dca35ef5f6aa19dc29fe940765b492821c377c822552bbe2132b22720a4a99cfbe66ccb18874f90fb5de48618e3bcc8fb7a9dfc174fca80fb033b2e19226885fb5cbaa018cf7481fb4bbe3b1690f45071cf3b545fc7dc4c460fb904a5f494e4710bb28c59b37201bc93c3b85cedf29ed26f8cac231756f41e282b6e208e484d416f57f1f2d56f3617c0a984f402e336196a0dacf401f23a182db681f4e431cd161e6be5f31d3a03177b0239f33755483d85c9d2624864d23f6bb7c5a69c7e2164d4f8ed6167d7fdbd05c2405ff28607d169ffc3238fcc5423c78c9346c614a93f473a2b17750683fbeed5a017f40664fb11227117579a43fbf768d91957ef44fb4994591639592ffb3898db867e356462c5292e4270ba30a3145c994dc63817c2b506ff790c88855f7484a1d36b3cb022b49dc01f39897e3db627e7453b7eaa47ee9c181a325d08f3aea14718447cc5f3ce9d6d187dabeef346352a168c4c9bf38ff00e189a54f0817d9e5867e164264acf9f89a0468af5865b1d0f5d44650780f7a37565a8f4c0ceb96346217425be3f42ddfb460186a443dc4f4f39e726fd2e11ac22fba65269162b0d79fbccdde017447c95fbeeead617a64c9a609f26b64105687099d3e8f96edd6e714832a030810d602862a462e0c908e95486467e4f657a255646fefc1b3d6612ce46f05c183a0aa2e63122e07a4fe77fc847dfdb81f4981cdd5a7e25095e2496ff7c0d982d61f1b45a40c98a5da72c8cd36f9bae985ea04c49826f6e0159848c46d189116c7425229a29dca5753180914230f7d87f2cd1e2294a23bd653c8f2c033180eb015dc4796a35ffb37e5d2a91a83e040b6f9551375c7318d897491c79c9bfd5a26b563d7258cbb89e8e7b06429a6fdbbb519019578d2cf852092d88bd0f2a78859a2f1ffe22519dd8cb507fba725b0e80ca5d8ed18c6087f6007e90e4ac6bd0224e504285c6ad5e2a4885c47c8e5608003a80cdac406c2de6e9d9c33b3d881826ea313c35a52f98773329023e2e2f644eed4c9fd91548d5819c5845a9c356a9e281411746cb75d8b9686bb07213513a6827af9e2d2582d3aaee5d0a1e1582463d496d83be81d6d0003b8586b2b42e814ecb2eb4b31b288dd08d4a6d71253f6f90872d7f2ee65a725a8f582404ef5c515ac37806644d66e187784bf25f74a43c7dd98747933f580caf12c97de8796af508f6ce38d753833fa7e3df673b922672b38b4a3750af52b2e56f46a293d2301edf675a87c40637fa24ff5de154a43f0bf38b907403487346618150454a15be8935547faf98945cf4502f7649b7fb6993be0d924ba7e87e5c44373d6a05774e1f29b0405671ec2d2912145352a9f45d41c46d625518ce670cea41617a3a074385e691abd1d9156a1d614d5fb54f097d82d80c614b6b92cfc8bbf18ecd7c70d5e7049d93d1e01d3208d0df28de97dd2f92b2384b83a3414fd99c8754c10b9e5dd1be2056f367ff898dec986d36884b48e0487aa87651128106a3085ec747b37f462bcf65f40a63d5ef3e7f7cceecdee0471af487ef9a024980f7d83f5964932f413bab5da896195fea92a65bb5e08a7a9bd68e57b2e1444310b9ef9f9b1b0772aea0435d832578761abacc584d3588cdec05e37241fdd2de96b2b67eb007b4e5f9d4ef2a8742af5235a45147c3cab7323fd344569e919373f12bd5554e858d3c3b21c295a1d79c4a4fb2a7b79f3ab4817fe0416134b576cce565e369d8770ed9c2924f8be0dfa9dd680fe77af006c4499b2cf442c3a8c83284915263e978a0343afd905502056046dc7ab6773c132468e7578f4cfde095720b8e785a720e4bc40228f788b0f27669314a5f931b46bd7903017f8e10890fe23b330b2f9651075346d3114f7bd0563a61aa2b540a0abd34d4772278bec85e703c9d214d3cb2b767c686f94e8433cfbe3fab6a77d952576510c5cc764230fd772df1fee062380a787e5e1da520a88c3e08b7c330d28d614ff959b861ecc7795fe87c22712ae536609e6bee407518e19d641c5b653da09e59b8800e89d17848545190aad2538d869bd717dbd8356a67798d9ec5e38da75c9caf09b6ab547b3941643edf2f02e64254d50e36362c41616048da6c425bf9318c40ad18669821964ec7cbd2b8714e8f5dc27626caff71a47bf64d476ce899f18c24556f7820202b9b3fc5f4e77ac5be8c1bd2e3492682645389b4b359578edf64a5a823571c07547829153e647579c44813fa75b8937cd5797249dd5803ee0386f9cab266917789d973c3c989dff5e0de1a65817d238899a57e9e48eb67c3d0321d4dee57cc778c5525bf8f542e90828a8b72085cd25067411b57e1a7d11a4f67da559757ad36fbb9f6f3c55cf6723acf5d58348dc055fce03fd929925ba3f6e40db6df8f0358c8a335945849649d783b52b0006124cf4042c3f16a854dd4a7672206614e215921735710d162219312c171da4b7649882772eb6ac18293790f8a6ad0eb8a98988789622911a626f368e825d45f92441e6949bc1b3e57a98a2136eda230713b4b6c6175aa129315646973336e21535ebbb8b8a549687da77a9c603751abd14723da67adc45dd8ecffb37995aabce4d743db9059e992aa435f87ebf2069785b20d1282e032f87ec90a5977b5b6eb7ce5e14e76816f6d8aa2a99d88a41cda754a8eed7955bdc677bda57b7c9308d8853619ea8795f972807be4487ad3c6ba8177c1897f6ea77077cd107d7b0c6eb9775068bd82b5994983546a8b789ca4fc7e30fe328a23afde89fc09b97d0dc4b878a796bc885f381176c0dedd7c3009868708763778074f1483b056e47b2d2e6f775e060d80613be47905e3c28197a2b2867f2087840da05978d324ca77d0d2c3838b448282d320027d0815b57a46e25386e546797aea5eba75c4748a77a68fe6769eb2d488d27ee978dcf669752152f679d5d4447e23d3767a076168784a958b79e1e6cb7e174abe7e0952b07a7e773b7e902dfe83891d937b603f948047799278c0e56181423661814ddcad7e50682c7bd2708e8791bd117bd3ad5d764ab9e9851e6116883d29db86051203825f38767ecf081c7edad64780ccc1007a419fa88156cbfb8877f0068a366cf17ab74967805410d1775c0ec084f283567a15ff0480a7bab185479db782a0e0027c86b9e58487498f89cbd316877cf25b801767548ac2714878a7a81c89caa1d885c0633589a0289b7edbef3e82b44ae88619e8d979c7e36585e1ac7d81e3dea681258e21841709f6844a668580588df77ba9ec97766b4321899d7c8f84f0b64b880840f485a1533d851767a57d4a544c83b06ffa7dc8b02f8747de5c7fbfcc1387f25f5a8a96d15289712fee8898a5408dfef27fb1fe337a96b4d9119e22eb87a7befdb497371c3793e2cc0aac6839ae8fdf2214934812e67a0fae55765e185b83fc9293793110d187dcce0e868708c67c2d76639bf921f880fcbef0956f67119f67b9559a35d5fb9b7c1ecc997a8cb6b78d5cf38c291b8a8b95baa28623c1f77ac0c1d18300ec467e9c6e94869bba197d07b41b8215ed717c33a3518a2a69078e6c91f6ad16430393da5506a55aa5d0037315fafc42ea2304936366d8c6a231a413a65288914a4878fdecb7772cc2ad83e9a63a83e6830079d593e17e3d6ab47b4116c192d8e6c68cfe19c9af3ec9c39005755d013a19f177bd9ea67a4d820f7a4e487c042afd998ae5808088048d1c7cc641628a98e6237ed84a2e7b4c74f67ceebe667d388172975a9ae8afa684c0785fc93092ba7ee176bb07db75b140997b504ba975669b2c865791fb8b03a2327b42ee2879af368c80edb7ac827a8a198220b7b9783bfb7779379079828ed03eb60c7aed938ef44a98ff16557824090280d15731762a53287703a3b77fe63bd287bed734819a8f2080aac48c8253cc6a75084b27795ed0db7599b7f18705651188868021a7a69f5eb33e38d97dc4fd1985411d5076c1516a76d8de15829ba8e8861fdc0f88aa783f7b9aac607cc4b52478d9b68f7d03c7a57974203779ea94e0764e1d8f9d8ac846a5eb023c84085245853201b782e10ac287e06f07774edcdb8465e7e67b4f201381f6363f8327e4cc7f49584576e49dec82aad62b849a18e57ddab9dfa1dfa972a6a2b7127f6d3b3278c7a2f881f0af98824535538250c2998900cf9b88288d2778e3a5a29607b80c8af1e1f989ebb4ae7dd81bfe750a478a76390a5b7b16d7b9993e2d42cf578d667a5a367b78e9f23b7b6d993680088c68756815f1891602298a214723abf3ed7f8f93785d8a60b62d7f9eb218890b14197c055eff793efab48717d3f3b1cef2697a0b0daf7db98d5c89fd22457b7ea64a823c2d0d7cbbea0f763d9900fbcd7c0993dd268a901da4f37cdd3adc772d0a257608a94f6af2ecfe8990c841a548ad0f0355bd0b81c8cd508356dde386276d8987e4c8a17eae24597cac2c9685aa9cc780e78af9a7128b35a7e9e43f76e95770804540f4893590636813988480ba2f139c9f0c55cf83ba19860744d489391892880cfe0388f03fa186e898e57bdd04e379cba8b8fab785aa7d307981941cf013891e2b397be66ac778effb7b751ce013894acb3e846196ee03de219d897ead1781e16f55890797767732717b7de9e02981710be977bbb463fcf62c2695d6343a977160de77eb897f7530e5f883ab1320711d583f8542c6327aa93f847c26e8ae8708649b7e8188db85b068b58886efc983bb205d897fa99c8468f85ef91cde28a52f53e29aed1c0d7f8d8119889b02c485d946ab664e23bf880482d580c720ae03112885d3da3ef5804946a079c54cd5818cf8d489cd3b628376f4f882b02727872cc97d22c71cbb9c815fe9843299d185b9f9268620db128aaa5432880e540f7cb833b28a1d5a6dd08ba32078d731a87a3e5420770bf03f8511f95e7a99760a8607a9747f5599b1fab4e9db81987a0e879b025b7c8d6f6978d1bc797d09ed717cc600de87c2131b8498b4da03fa05068478a4b287491ec17eaf7e0c897045e87ea6f48782d212087c4ae8261d0f6f8a88c0755084709f6979ab8ade7818d3fd752beacb841a37c8786bccc77c149311847b83808ad929b8893b3819847bd2c27b19348181d8928287ace0be81a2481c1b8b644980cf780f771cc794839d461e7a85872d8038e63b7e25abcd8744d4f87b76233aa0aa52ebd7dcf395882d352a8351529c88f9ed62882f1b3d8a2e67d87b6dfe6bf8af405a83b1c9a7781e89ca76b46e807b4dd55f83761f5e88a1414e8af230b1851248a69d78bd977f239dc87a30b68d7f59940889c67e1177fd92fd861dee88864cb1591be244838471e77587929508875f678889cfd22b885a6c6081052f387e616a7a95bd77bbb1b62c138a067367797a4de184bef4d981d4d4f285ee3ca07ddad63c7a8003257fe6a788793612258267cd397e8529538850e641762ba213796a18c57ed784b7a52fd508a5ff20d6869efabf75d4df5f8a0e37078a9a432585d194c478d9b3b2786337658a8ca57d878c9eac7a19cf377e01f38482fee8c97926b98085796ae89e949cc590dc73e87d162af77c02e8088786b96a808534d2869636ba7c3117c086a46f587ac74f0e7ad36cd0806677b183ef845e870b1448822f4aa087dbd2be7aca2314810d587d869815da803de1e7855f800b850d17f47e7a1e32f90724a69a3f96087f43ea127b6a182a7bfd348b830732597c4f97457bcdbd9182687a998096417287ac455787b3a8cc8246a11e03b6260486f3a3837effe43b89e505de9b95289f9334b3ab840b670f7df76c63884d12b084dc574579ebb4018104286881d85c12861f1510767af346872d88fb86b01c9176e2bb40dccaa58cfa8517f60409c52a9ecaebf394ed2204a1499d827e71164f818c8ce57bf993528a8dff547c5a128f78fdab6e8acf492e82caa1737939ff837903492c9e15b105837ccb6c96d364cea13718beab45cc63a4dbb267872ee9ba80433d0f89b982877b7aa0437c178bc57cc9db49812ee96d839b96ec7f3087a979a9fe4f8942f577a8b8aa46a5009723940ef30e8fdd242eaf54b30298a5b8d579ef96f8844b5bf77d5e8fd989c2dd558aa5f488833c105b7734aa5889366c7f787df91d806ecb87859e787d9079ff13a63b6b2a8b01851c8c0015a1a35783748ad81b147ec9a56b894303be88adf98775b82cea775b4f787ba9ec7675b3313d7e4d8de588bcf81d8969f4238d5e69be94a58fecaa4121839ae315a69706ddf68a3c56d97b031a4487a743597a04bca87a08df6284aa30628a2da15488948dab86f283667e2ded9e895a7ef0864a1ece89683dfe7946884da33af14bac9579888c54d36097cbe562899b6efe818e3cda7c6f139b800d6a0c842c6fd87c625ffc79621e5084fe4da9803ad79080c31a237694b56d762587fe7576d051879db28578da6af183a7ba867b838b1388eb4f7384144be37e35e7437bd647c37642b8047bac91fd8509359281e07abc84e38bcd7b2ef4177e16d7e4829677b57b6a3c1c86ffaeea7554a4c381e629cd76f4b5647af3c05781599421804f32568846ba047bf5f23485aa42797d24c8e1823a8f7d7ef5c3137cb9f9f17d9b79c5771320817ec486607559163f8aad94d487d96a8478604ae689faf40f884899338a71ca6f8052b3ca7934c7b279ef72b6833c2dcf87157d32833183f87e41530f850d5f2f7f6271647a08dfcc76e52240864fd8967f99ff6c81e8509d75436ca985506f117690e56b82115360820063ec842f79887b035b9e81b91d167da253ea76c2179082a27e977eeebe1482cc8030886afb707ce3c56a868b4f457870aa77776ea76c77fd1b65780504aa7812bf8d87f5700f7f4a42167a2d9aa485e8eba27a02a7f98750398e754c7f1c887ba3f17f01a0b27dcbba247c8da525856b67a37ac57b168437f122843eef50897e485d7de3cc4683d97ca77da1c35f7b1e65eb79f4b56a88bc1597889e305e7b62cb8975661d3d7e1b6dd27fe8bc4079c2f3808adaa7f8865c81887f9797c6852b613681a2003e7ca021df7d2683247de48b3d806d107e75b2c9a0758575197e3457fb84c129f88193ae7b80eb7e668391225c87e994eb86a62a357d2003e5822c5d6989eb3d3d89e4e5fb82447a8c7eab8af6799e71b775277fe87aca187d82215976893f7f4277bcbb3d7aeab82e82a4b01789650b0179d29442896852507cef31227c8015c47a1ebf568a159a7d7d797c5080c1995f7b5cdfcf7e7743fc81c01b817e6dfeb0770e1e5479b355ae7be5cf2d8905addf7b8d5d8e83f57b35834e903f77ed5de57da439b5794eca49779e6a8d7f03743b88c0da998279b2597da81b237ca9466478589160773815fa845326708352a80576e0dfed75c23b5d863773717622b332872989b17f3d4d2a786f7f6586858e6981eb61547e87ae438220d4b781ca47f88066367f77171f6a88bd47c281d086d77c69edcb7881ed067b7a423b84e9e73d85d3a99788c01bc985b61e8d76b1b04178483ff5807d0b4b7ddf077f82ea658b811eb49c8866adfa7e3dc41d861bf6b97b1da66c8463379688ba6c5778bf607b82eed76178484af37837732a8261abaf7cfe95a67f144ba6784c62e087cae92979238bb68159c3217f4d16e97d58695287eda5f579b737557e8a4804765d5d4888738cf9790689308957215e8069a5c6889500347e88bc947e6cb65577c719ef8680d45c7d6f8aef86feb97182e5059a7b7b08898a5ff7cc7ae2be8b81c89ebd89ad77c57532305b85370ef17ad5c9d68482fba7880ffdf18283140b8a546afd7f4809617e5e7dd8788e9a0c83ce42227ada17358838520b785fcca87d83ccb57e3cec797c81ed177d3797b3796f6d557c59827e879f99c49d4094599d8f2e11a25021b88741121578fcf0f187ab6d9d86fe9540800201cb80da5f0f8072dce8867182408610c3e687b517098405940177a3c62f87a11de7a140c6518b772ffe90d0ff517a6337bc7a4731e884f009e481c9ff5d7e10aaaf85640f837a9ddae585f677827570a3df88fd176c7fb821e581e3141a880da01185b9c74d91a8d0adb5a830b98a98d596854b503a7f71f93979f199b87b576d82856732b6802081e17513731f86aa71de7bab9c0b7b9504b77dd33dc588c3081d8711a6d69ce9d132b70f581690eeb4c387ef1f3f891488ff850c6ad17f65c33c83fb556d7a7593da766c6ea289b8f2d4773175507ff665ba7b1b1a07889b55d5872eb3a3ad2635c08f9e5cb1abf8cd4880b438bd8207fc1880c7852a825ff03b799761ba7d45ff6e83f3c032836bd33c88f9528b7842413a8acd5f41791241c6797e00768626b90a94288aa1a5666113b2936c9e8674c93378bd4b018435dcbc896f86f58183f0878944c2787e8bc6a3800e95f28030ab2f84eff0738796e3f086a3bb4a787ab2db8e8605e8029dba41fc0fec099202a3146465e9e48541ca737910aaee828218f280c17cd777ba82bb7f86543685b164ef7c2ba9438786dd3a8a7b507f0163f5d885402166773f8ac7876b9d607ce33c1c7e19b2be8724cf6d7c03e4fc8980c2947b38276678a01a957f5b20d979fbb3b980449eb677a3f51a7f85875e977409adb1d85985923d3d9285a373648968b7367a99c2bf777a4d5e8bec6933b49ebb36866d3b2a857b913e801439228606bf4879af072c7846471082c4eb50792a9bacd048f7eaaf50a4298c43f866892c81747939ed307b3117b0807c33b579b10ac6ab76fefd84ed4008863e54757ee60c6c84d8e57b7d6f137d7befe98b81fc80327e5272b490077466a3fa75cc7bd93f9b809600d4816a061682318eb88537eacc9f21a31596839c47862c81877795452d83768f2486d13aef84288d59805cf1fc7da8802b7d5c2bd79efe2c8a7ba4035a8adce0c37c9689f17f1addd17ffb0d3d76923ba99a5f20aa87138ca276bc035f79cd58d37a36caff7de1d482802d1158980da6d278e6c8b2b0243f45784809ef7ebfcca47fc88c2e7670912e824b6d88813c80618ac0073991fe161885080abf80bf4366782a53be7d00c88f7c081ca67d279ca488d6e2fc838529d8da6786987e49e16a8672369b85ea9bab7632300484fc094a834564e5821320058750819d787050477ac7c6fc85a97c4c77ce05b385d731aa81ec7a6b7b21116d9f402da080b61ed37b640f807b9557458322ba2980bf02c67f26cbf57f844a31f92599597dcabe038254c80a7c11f9247eda30877de65f277dacaa7c751e2fb2862d35b4d8ab39677e7c740f822d9a4b8286fa6d88fb38668752b38b8981ac3286cae9891c02f27487ab62bb7a1fbbd7830cdae57b0009c67d972b7b7f732b0b8a8c270a7926b9557e26b965778754407bdb421988008793830761d8810386eb891e616e7dcdfeb21daf446f7f4d284f88033e8284a97cc4898d76f6794403cf75b181cc8384b694886398b385b1ed06868003e785b80f6c789337238259b1cf8602d2ab82d17b4076c8df6b76b19eec7db223cb7af598fb8416b355867f0e5387afea5e8336d12c79d8f7827d10ceb685f72b9b76943ec675625f6c7b8ed07d7bf0e51289590b7789512ae7f942a87d193bc3b7860cfe8b756a23c6798e6bac77e4c1b776f9a53082692e80857c69bd0294a0e67cb08c0388f86fa6869b434e7c16188e8164bc08860b8beb8269e2dd7fec151e79bc9e1880227d888822e976806f499c7e152e227e8bf5fe7c00c82481e898fade846be38140e0277b84f7417c4f07417e06246179c3130784a5407a7d9868321b0570a17582be397afa231e825cc2eb795e065278485135838804da8666c69177ecf1107f5355087c41e7a28673c63484afc6d57e43856c7d52fb6b813af4d0844c1f6f76d44f8783c1e17f7db42da482acf24e771cfd3281b546ac7526d60b8748fe1f983c79bc753462cc825ed78578bda51c8887083f82eb0eeb84495f067e0fe4491cabd286868a4831815475fd818f38ea777403c98871e7ef7ea3c6678512d81d865d110f8c34698d7554afad851fcdd8810c87aa7b7576bd87b58e8d783051d57750323d8688983780655e137f06774080977ead773b79897760af1f7ab713d97c320134a58490f57fc391ec771c748778eeed3a83d8e5cd7b0c1b317650397e751e2d439514250f8869f46e7e32011f7b923bd47f1415e87cca2ae676abd23088e0933786f3370faf90fc5c7a11700077b044bb7d6b67398893c04976bb6ce7844caacb8e90150b8a47387d87a7267a8092e8f383250cb87f92304877e0684c79be2311806aa14e90e6c4b184e8d9447a36415e7e985d2b781cce728a5505d084eb7edd94a0c6317d564da07d912216873720188445ffa3887be4cc850b4ac98349c4fd77b0035ab57743148037b193853c104580ad82d77514159f7eb4c19d8ad4e6aaa8f7030ab738f7d0840fe4f07f92831f80181bbd80af198a8857912a874cc3538aa3a9b184886909a28f67ac8db04c29208044f37b744b1d85543f9976bb1265857df9789baf534c97fb418d816624f780bb2b107f3e951479f5987581800a257985c88e7e6c757b7600a4c1a0b45b9c9448f01495730fb57c8b73cf849c925379f7070f94c5f476aef6b56c92385d8c87d66b3c89f469477c88869387e26060883f981786026df37e2a19ef88f051149ed7d571ab211d0696fa4b4c925b06cdf90b12b2acea4cd994d5f38fa9096b1baa1006b2833d1705846fd93c7608d46e834a25df80a5acbf794cb5a77e37326d8a1b3e6a75d1efd3932d0e509fdb5a679bdeb55f839591fa9214bbeeb30790b58de9e509994ae8207b4929a68874c20377692e2b81b23c58827e0750779f499b816087c97dc582d977e65fd27dfad0327dae652276a0e4e380c964e3814df92e81d70d058694216f790b798d810e953b86987a5c76f1631e7a3199107cecbb598a1b5000879416c67a433d1e807fa9d0788b7e6b7d6b1f6b80f450b3784ad6cb7e7f3d7789b09e05783ff6838450b7a67c10fd09819ea75b84483429889117d079eb12ff7a64ce877e86dd3a7e44c2e576c4e4c78992dd2184b41b1083ad8de681a2659884516b99797ea68b8a7c3a96812140577d7050d186273ea2868625a48003f62486497c2d88cde11c82c797597a68273a86fda03f7a72d19a8025cf8e85c3e48a868b3d3c8216a1b67b863b8c7b9eb9ee81410b977d9bde3c7bcb1f817ad4cd4283a743b689f40f92893852d2824564128963b528848678487e4cd9178a6b7933817714a683b4a4d1794593ff83b695d47e01c4fa7facb56682ef67a086e7080681fb67627f9dcf917c8438338385bd647cffdd427886d68784084b84788f721284ccc1ae804a8a5f76b0731179ec61a875d319af7742add57f49588b781ff5878382a1be75ad9fc286be0da075eab1bf8001057f821ebf5179a17bce7f95c3768523d345893eef997f9803a383b5587d7ea65984813428377ccb4377750e1eb88273b48686eb199e7d47431b837e5a8c76a2000e8217f7a989b529a2871d00c0889cab9b8092fa3982b886b4760832407b0732107918d3578636b48d81ad9fce7f8b4f658a51ac688904d5e378be8fcd7758862e7960512d88e2602684f06ed37ad84ad7875f38518621ac3d84c5f94f83c105c17efc6e887f88864f8349f38381003f2e7a1c0f90805953987e2d11df7a75b7c276c87a1d7633d23b83f3c07b7f271a99754485fd89ae19697fcf49c475db428f75355e16875ac6f27f986fb77704451081b5ab4f8199c9fb85ddd5ff815bcdc98699d0da7e40aa8478d7a8217de64da08891b21a7b6a4e477f162aa184ef848f7963e4ae7f55b2747ee8aae78113973e85bc15dd7d10eb9576c3541b853c511277f7e38d8129ee7c8277de3d8425f39989f3ae567b08c297791d942b7743eacb864c9f9581eaee987a2bfc8e89b6255189a1a604884780c6894f322383d6c503779d874487740ab27a1987977ecd05c47d9e42d37e9582c97e93a3827a8b07197b60807e88ec27cb89c33ed2779cf7a38491b29d87e8ce317c7606967c1cbc427ff2a0a4895ca50c84099aba75434fd6808ec5db790bbae582d59a267b2193377c198e02882392d9786ce58185cd223a764444b782d5ed938493f6fa88497cbb88a547368407df8277524747800ac52479c3ef9379b7ef637d0a7d448ae505fb85d2000b81f89e868a14eded78354c89764d69d6883a67ea761f730d7c1660c57e4b910c7f4265d77adf24907994d9e97d9790c1794b25d48978b6ca805ba2e27bc9e65c825d47877a0075ac86e4f7ef885260a5894e07c382873e7f7a765976775ddb657c9d6a5c867224b68795a61e8a8b32bc854df9c77e2bc6047b471f6c88dafa7576b252ba86dfb46f7752befd880ec0ba89b9c3e67b955e41806d104688ebeaee817da6207ebb5ae182a6f4a0802140548aa224798a7d8296828dffb27c268397866c75ac893ee4f184c092557816be177d6cf78b8489c31a7a8b90237e0af46883a3bb458803d91f7f9653b476079058880c6ad07ed731e88555f31a8873442379ff13398a14f8d9820ffd8f882093ef7c55feb27f2c15658a7e072788a4931b7b7afaf276a3bfcb7fe65f8b848b0e817c89f27c89ae2b6f7653721d7e3a842777da587b7e47a8b17d85eceb7e2451a7855fde4e78d14ceb786f37007e717006847899d67a8015b87736eefa797b3712870022057a8176d47c810a5b88fc1b51832ae3317c6844e189980a4f86a13a727f5a5a8779c873bb79335b6c7f58e0be819283c283f594d77c459a187c4f3dca88dac04689497cdb7571e07b76cc02387cb3de3e7e1d82c389e2b3d77e79e1c187681c76786295c77a50157483bd35367f2dbec389cbba5088dae83a7827781a7e48f7e084e31fb586c9359a77f83d0b7e02cb9a89ada61b7f89b1e87a67d88c7e6707427b99938e781946a582d18214818af57b892ff7ab7ee8989c83f05c297f6f49ac7b60c87b87f337348746433583d576bc75c06e6582276dbb7d4045f27f54ec7b8095e77f8111b8f19346d17daba9fa6da11cf467aa3859288f3cc3728b9eed0699dce1c498a94081abcc74dc93adc02d80a611e69689d47e76d8e5ef81f8df167bee356686fa47db8079296890fe180ca68ea14a8fd585aea5e57284b721d15690735e838c7fa9fc90139b619ebd8bbb885e595787155da79923dc97853e25f6867c169a89cd4d7d8155b2fb7ef283a7b6a01fc59039f30d8be3f2fcaa038f8c914e98bba90e3c390475cfe121366e6c9c95282d8c24ddfb76fcd3e8a12ce52f8a9e9c2b7dd731f887e5e10678796af378db30477dd29b5e91d6efb598e5c645a6c33d249705e638963a36d927ed7b3f7b468fde7fe61793872174c38c3c56c8806533e4946850c47de95ea0881d24437ecf66a68911ca7183257cf48036e333b14fed0a94b7f8369e40c24ab15e273afbf4242f7bc014267d0d46218697689281f3c0707d42369a96dd92ef8486a7e285868a19877702ab7e74c2ba75911089820964c58cc1bb5a8d0d6168ab7fe96395f8046584913b5e84dcbc9d7d691c4f781880ac7fa4270798fc66e48569596e7919b2f9850b92ac7fbf720d7f5d9a7475b3b304b5ae023e9c438c2ca7b54f16ae68e4fd8838b7e27e9bfb787efa2ae5838a890d7e50f8278074ddea87b8a32d8a8360f575be9a587cd02c0c7fb07aaf7fe7789076ac2c098d48130bb71a90919c94084e8ca2e23e82e93a1c8744d405766af43176f3135e8af881de871356c17b23c142a4336d307fe8ebea7646c51f7bbff01d762d648178ba9bac76c395cd88e8eb12057ce8bfdfa887df81df2b0b8a88218882fc269a7918b6a085ab2ca1813feb8f860249749eda88c17d924dfb855f5cae8124b6bd8722e96f79f4a3c37677f0507ba3a6290509290add8ea2a189b00a0c83699ad087dfcdd688bd35d082444b5381864d367773a2068d65335879d21dee7c9cd324817c45bd793abe9a874f689495c77f489a9d579b87bc5d58813cc8ad7b4385387c0e66b7818d118a7d66129b8af10519864c0458a4fb9f2586dd3a327a2bd82c8087913a76c34221860ecb6b77001bd794f5078d84332c2a7b60e553865d064881db78b57dc3e43185337fb481f4b58376b372c08951e20a857ead35856815ff87070e4e8afdc4007de575328529774a79921e897d22a158fa6e65bb79c5579677223ce77887ef4a8381acdc861a660d851bf6ad8548a4ac16a756c877f57b6a7858b56a879a0d6186631a0281c6bf6a87194d5c8932e4969bfa8ccbf9895f23810a3cf07f65286c78f45bbc7524f7aa84178bd07e3f08cf83d9ab8fa3c8e08576fc02a08a8bcd767df2d64f85af6114827e7ee886805d0476e6a01e83358240fc52a107896e9cf08443329d7538f1f7777befdb8471d5da79adc3ef7bb534d317d69949a6c15000822b97cf78ba65ae790bafbd89fd4d7388d731618871772b831631ba7fbe213a7d233828890a8baf80122b39868a89188a677a57843f5b4c7b895ef2f6a8600f8da00b8d7672a6f5894c7b4788a22bf5863b8bcd7b36eeae7cbc7aa388c0c8e27cb9b1a97f18a43e7ea4155487f1c4797fae5a397d739757783cdaa27b49bdd0b0f72f2684eba23585974f5582e0bbcd7f89f90d7b1d5eef7f7c0f586bc4f47e797fd19e1aa42fcf7d7b08a1832ad13d7c08f1da80f612927d6ea7ea825ba91582df3d60b877428d883129448aa6a1a8846f91f9772b61cd819ba8488817d32b85f3e4827b464e3d1ca62b8d86045e467d770d3e781c5064851cc3268677d3407e6ad78d8027eb5c9da485877c3964d1773c6e7f80b9287481069b7c7d71e72d768671e38039e2f47c8737c1849a065e82acc70280fddad8898f09ac893398c088fd17828828f2fa8ff3a7b978bddbfd891bbcce7cd8a43685f421b5879893427abe2a5d7697bf85825123907933e4917512ad6c7efe17e689528444878994ab7dd2121686a3203218f9ccfbb539f89d83848054883afbea7bea82be837a784089d74359823632c07c7fc62489ba9b2b86aacbd77b6fef3787ddf98777f641ef79bf6031824e12818604e00ca3a529537affef3e821e12c889d10b2787e00a2c7a784ac0764444d9838b73ee81f4aa2a97f456c188aa1e7d789f49e37e23558979e30dd37d36d11778d02c98aa1cca728171e797839ed69f840b094e7c2efbb8805fd3ff8517a4d181051d8582ceb2c3800cfe9eae3e68e2814702ba7e21befd811b7f9383e9b1567e24925198062adda32dbbb07f51d0827d6122a880e0f14c850dfa87893da07f8314d4a184ff784e83bc277b7d83883109d35d4a8746c5a0792c44ad75dae83c7b9eb9a0825c7a1b7a5d52ce8506078986a9466684c7fcf1898c81f8824fb4347dd606fd81d8a42c8af1053179539681856a7dcf8dd362e41904e8497e9462097bc026c016948e1b8652962278811c51853e421278d9878688614d6086cd29d0821c21a97c8adcec7c6d87147671ce407bac0f55806881268f947260a23b13310b5edfd2a1c0c7f8940b8d7877b8c70b775a94d57fa43916770c1b2089645e357d593a168549cf977be181487c77cc1386e845a07535f2b68cc3f93d8f3201b17ac14abc8a8e117eb15ff74f93059ec07cd0aa487e5ed0d4894d0bfc8508db8380e04b67780134877ff9a5b77605c37786ff0130841ad252763105e8a7cdf2757929c75685b799a78a41b690a64996109aa444b7781e368c7c151c1476b3433378a7557c7dc6249381bb4f0d7e01e8c384f2d645887c0fc07c865f978c4b78dd89d64e48a8f454d57ddbf32d96a030748c39814a86ace04b8015be4b7eb8fde777fb7df485a3973f81e1881f89a6ba96887bfded79b98d907d9993f17ac0a40595b5684078cf95c1a99852d1ac70f49fa4fb34fe9073a422856b26b07974203a7613ea107f83cc6088d6e2587dc16a4c80414cba885367f67e9707a4890619d8850c673880f670ad8be94c86962f2c84a966d482915be34883e82c40784062b17e5ee96e76f09d1b8650b0cc7b4784d3877a25967d8c441d7df761db7f97a93080897025826283207be7378684332cfd7e206f437a63498e87e99f8375b4f75189bf8b8b7be32af98687c08479b7aef885f88c6b7d8f846f7bb3e9da7fe558957f0009dc8643a96c7e9b148879dbc08a8215ff388aaa42dd7f4a5ff0811ff1f5818e06e47ac8cd4a86f6eeee82aa30b87abdf8cb8432542b87761f5d86f3b5f486b23c8077ee9ac2777d4ca1751ab2a078171f08853d0527878355ec8757913e781726a784ea9b1c7e45db0980bfba027771e0358258eb2e89aaa7b47f5db73d8a47802a7e321e8879cd346383673d8e7ac4b55884a2772188b2a1717e6976c180ae9b567859579c761d69ee7556b9cb7c9bcc00847e071c82ac50d27a3433ac7948af2d881523bf894b91237b1a1e3c852750dc82ee23dc7840452f7e8cb0057b6d34a688a7f0a275f08be77df90aca76059f577c7397527c7d94e488f744fb83783fed85d5939b8708c94688cfb55b87f8686577fd51968287f6f77f337fbe86165543771acbf4779a06947deba203803e013b8a49172984a08d288449cf7d851a308c8172891783a59ab7898231ee7b1d704d848613c57ef62f6b81dcfd4f8026b9d276339c607d0b676a83f0d3d784e1acfc795372c67f94212d875410a28113cda37a1ad69d85a7d3d47ab6e8107627012f8823792085b2c5b689fe4230843eaee281838b5c7c92a70687ec03157bee18507a9a351d8019295b81ca605a7d1004fa819dab4179e63b4178def95b83a56493860e428676c7480081dc339c7f00feb180301bc287f90a0378d8c1e17a6993787ebc03b389350030881cb133894851ac754fe3c9757a3bce77bb5ac287ec6f8c823ae93f7c3e78068122c5217cfa0680878cf8e678ead59586af858e76f8fc64824caa7889d3a99581f55e177d90c1ee85430ef689c81cb975e0b45e7ef2e8f1820350b67a2d52c081925437839935b97f93ae69818a7e838367fc8384b5e10477daf33b87a7c180893f7f5b8100a4f081c6bf058280f88b85273e0b7f0f374584dcc70782d2891d7f00ab0b7f1e19ad813f50de75676c0f7db93a287f5e4e7583c117797af75a9e773e951688613b787bc217e47769ede279fc26547a405786859d4d487e9e54ac83ace08276357bf07c9d87be829271698a439ec77bef84018a124f4d88fbccb8778beaef890c879076ae2fe2885dff2a7aba41178a9b8b9689aacbe97de235658477559f819271118213ea9089aebfd081aead5a7ad987af758288d4891aef73819d8e8378a9c80579c0f0cc7805d523830a2a2c7b34aaa67d9c09937502cb4f8399110585a810cf7aa48c18812e3174836bd3ca81b4c8bf7ba55280851385bf7a23cc9c88e111248a3f7ff9836565b37b2886a389ad82808143d8d67b0fc02a7ded52378414f8ea85680a7c82021ef280d13ab77ecc26c478415e777595212b7637ea107fdf85e97da2d1d57877a85a8f054fd87817cc73785eacd181fd4d1e7ae8507c8608649675ab49ef753ed6a17d82594b8a75be6684e994417ed008b18982d7a68085346c75527dca7e4cfd827c925fb18a26fb9c7d83969e80d5c962781e2426808f9d187f1c7b6b81bd23737d36ad907c5ccd9b88c213bc7a2044cb7da30eb3848296f97a858edc7e66f5c1804dca5c97e631ac8383d3e9924d704e7be766177fc283e37e0940a081f5c3a577effb0f78d128dc7ef283a3849ff6ac768db7d7864141ba88f4fd0f85ae908783c86fdf7aea1d9976c06eac76d5395c7bff787578c2e8a180a0864e7b18d3047f8188748722b30178ddbcf278d68f468626d2a6818176b87618c81588a141c77d688c5799bc773b7706b86a762f8fd0795bd82a762766388564453c856c63237a9993867c28980d81e372fd82d659ef7c1d1de3817f0e7e7dd36cf77e48e5af80200a027c2b7ea4805127f67540e4ce77fd0900783fae4978ff664c801c57cb775701257d12f56581c313ff8387e42676cdc80a7e0541767dcfefb37c209eec7ab27d24874b3e52908b18f993d8534d932c7e948a6a2a6a81bce6f381587bb77d9feff67ebd766a7e14d49a88bf55a3791535c2888326787a68a97579943e53898613d986d8a4c189c1bdcc85633e9d80a826da754c1a851dfd44aef8d62ba41e5d0958f764995a18c37b007fb563ce7f82183f7a42d1b57d7f0edb788f604c89a6c53f83c6f508863d712182a796a8b87bfc419c5c4d928c461498b3c64e467df0f00577cbb3bd7cf9b0af84652f06779b180e7630af657d3e83c487f88c648321596d777838ed8534b14086f6483682494d52a54b994fb14cdf889674ed6fe45cd01677fac9c77cdae8f77eb63b028737324d82d2775d7bfb0d5d7ce1a574786c8be787446fbe7dd4cdba808b3d3e7f6f081176c736929aec6cdb931c365da2f60b657a63e42f894e61fd7ffa064277e70c1080eba22c7eaff558792e18c983a481be75246e828625a70d7787dd30804b1a267b30c8b7907cb36899915363b8a8da7c832c2e1c881eeaeb78400f5279d4a987769820c27d35d5827d56787d7d35e7d0838aee81787bf6f485b379f08946ba9e85f36d258811ad0cb5713fe3b036c48f803b9dee809a182a7ef8bbb47a816fa786238b207b02837b866815257d73f59f7c2c27247a456f3f8a7df9bd7a65d5ae7c446817839bde42b42288a1ae2704c77caf078d7b2ee94780d796e57625ec0d828d2e037ae850fb8070577a87aa8a7f88b9a6d080448c2a77e563cc89ce9c0e79f6a63779b5abe08996362dab3a1b5295f3a0c788b0816586d5b7c7830c990c78718d2d7ab1520c7945c9ee76279178835aadc77e936d187b67e3087a32c44e7ec7d1317758fd8d7c7db13a9d7462d78fddc781813ad7a88792a79383b4fea2758dc2c989eb612b78cda49f880c754177d7a15284f6e3418453794d7fe8624288e2fbbb792480f88789534188638656a9a84e11e2c2212b82fac52c83c91c0177bc320c81463c8a83a6d73f848fa8f3827ef5c586fee8e884bae36783cb26f87d28fd03897ee3f78490229887bbc6f09981c9e595298684870f9102839f9c44890022577c7403908286427e86c83960881696aa8591a06683b7b5f18627b56288c3c7a28517f01f898dbed87729f9d37fd8d3af9a36f8527b9f8ac97fa81b897950df3377dc74ff7d172686884b2c5e7ce34ea786a10be987fb8b28814606588577141781d0ceb5780080dc7b35b8089af50605a632ae6380b113b9841f448b7c53af8e82629c8e7b6d462c84b529f8853fa33e81f3541a7d5da56888347b008ad8f76f797a7175779db675760aa19a88e6fa9187b1590baab17eb086d71fb08185b2638ab04017856421707e37d805881cb15d88724ffa759038b588f69ba18984bddd7b47cc747938328d8319a72d7e1ae8ad862912c98eb6d158a54eb704887212bc76e02002850249b477f2f3da80020c547fa9222488c3b52c7c5b7edd815e06c4897fd88d7b30ecaf79f2faae8243c6a888761f9395281ded91edd4141ed0d5b978f28ecf8091ab527827aee97c6e424082b75bd187f7195d7c9a7df67ac230ce8419a0958948fe517f51c93877cbd7fe7fec03fd81652fc6882e1c87996f89b81c7afb5c7a5f31277e51b72685560c9a7f80e6cf7a86cbcc7cb64d1778f2c4f377c4eb0b83f3ae66890e01a978324d7d80597000884858f28894e06b6e7f37fc75b98dd887eae34880108d7b877db89d7722e2de869b79b580e99f9e822fd347852df4697514cd9d7fe032f18769db56862380f97f929572899eaeb77bb3670d85bded4318a4fda9827219bb87696b6f79f05cbd858a7e6d8901e84b76f7a2c97cda5fd17fbc7a1e8244d4ec8081234387b7494478ca6b05859607b68926aee289951d3d82e6b2a1769dab9f826582fa75eac33276de3abf77bf1f7a824bd2867eee2a257e93912887daa739834ffce37db83364850947b6875cd437897c1d8d7fa90cc4855ef0627bc0e5568409ac0d7fea82ce85b07afd7eff01eb78a8802189e84568772ccd0c80b2060e7fc271587d5343288876315283a33df2894dad79822b0e6e80b9b1dca037593b873416db7a3e4db47f87d20c89e8ce2aaf8d2b4d87b39d3f7908f86678bf43fe821016298197ea5188eadc098aeff09e7b3ee8858894b85f7d11b12c782ef4e396200a39180823cc7dd0a3477c6ad73278c7c6d4ee5bf2d17fcd6a4382b4c84583ab5b6581b8d90a7d0d46737e1dd5007aa0083076bdf83a7b62a7228138a59679ac983ba1759f3791f434af93ec47b7156889baedb06e6a8c964b139ff953427a3de10f7917afb4882cc93682cec40c7da128338a331abb76fc26618946cc1588e546a6877ff118a6a39c919a6e8d7598e435f3adadf59f9050ddb694d615" + } + ] + }, + "job_v2_late": { + "kind": "job", + "request": "{\"capability\":\"wai.video.int_motion\",\"deadline_us\":30000000,\"fallback\":\"wai.video.av1\",\"job\":\"job-3004\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"media.encode\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.av1\",\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":300000,\"failures\":{\"billed_price\":0,\"failed\":10,\"failed_ms\":500,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":12000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":10000,\"provider\":\"prov-beta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793000000000000,\"attempts\":[{\"billed\":false,\"end\":1793000031000000,\"endpoint\":\"im.alpha\",\"error\":null,\"hop\":1,\"not_billed\":\"deadline_missed\",\"outcome\":\"served\",\"outputs\":[\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"],\"receipt\":\"sha256:fea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a40\",\"start\":1793000000001000}],\"candidates\":[{\"capability\":\"wai.video.av1\",\"cost\":480000000,\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy\":10000000,\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"rank\":10,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\",\"via_fallback\":true},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy\":31104000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"expected_cost\":1036800,\"expected_ttfb_ms\":300,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1296000,\"expected_ttfb_ms\":700,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"rank\":4,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":967680,\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"rank\":9,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":898560,\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"rank\":8,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1054080,\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1054080,\"expected_ttfb_ms\":10100,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"rank\":2,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":864000,\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"rank\":7,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1071360,\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1071360,\"expected_ttfb_ms\":280,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"rank\":3,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1382400,\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1382400,\"expected_ttfb_ms\":240,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"rank\":6,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":933120,\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1333028,\"expected_ttfb_ms\":648,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"rank\":5,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\",\"via_fallback\":false}],\"capability\":\"wai.video.int_motion\",\"deadline\":1793000030000000,\"decision\":{\"decided_by\":\"price\",\"runner_up\":\"im.eta\"},\"fallback\":\"wai.video.av1\",\"job\":\"job-3004\",\"kind\":\"wai-route-record\",\"operation\":\"media.encode\",\"order\":[\"im.alpha\",\"im.eta\",\"im.iota\",\"im.beta\",\"im.zeta\",\"im.theta\",\"im.gamma\",\"im.epsilon\",\"im.delta\",\"av1.alpha\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"3fe0b709d0a08b368ae357c7451507dbed9d5634a8b38dde1167efb3d9399c16\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}],\"request\":\"1b27ea8deb0f5a89738ba984af9ac7c9e360cd11cd337ba4ca6a0995143ca46e\",\"sig\":\"ad1e1b2bd86a22d46eefe35330f01b6716481ed89dba9ce1d75d135e983a20be6fde4028dc6391b74286cb825aaf661b1521147eaad7a49210d1f8a6e46fdc04\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:fea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a40\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:0526dc7051f436b1ee1ac207076380913c993395ccce1338b9da33882aff38c6\"],\"output\":\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"},\"work\":{\"status\":1,\"outcome\":\"completed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"31.0\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"31.0\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:9af12bf32f9646b28892ffaaf9f645690907ceeaf7ed39566ebc4f49ea0068b8\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"ecee860c98f7796252700eabc9877a67655be8269c289a6ce4ae9d10069d2f83a6c08652789eebb3d1de5cafb0e16fe0153b36f6de7f069c51d95a69659dab0b\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [ + { + "receipt": "{\"profile\":\"wai.video.int_motion/receipt\",\"codestream_hash\":\"277865b574029f700f4fac023de3ab06ae598ee6f8ed726444e91442a6bd59e9\",\"clip_hash\":\"3492566e8e2682e3b3bac083b4db02ef8eba9a7f15d9faf0e27feee0f6eb488c\",\"h\":48,\"w\":48,\"frames\":[\"e1d8e8f8b5c534be1421e5858ed9137808ddb849bdff2bf397beb32568d8eb69\",\"ae7214babf5bbd6ec279434740f3271be43d2392b8167813fa557b5c4426fa14\",\"b3ef86db27b82d303bc6b612cb224ad55259b4f2e2c0461c74dcce188cd64b99\",\"3906f91010bf1b9ca14f6e2ac9b499589ac02ff4465e1d9764a22443a8b29c22\",\"bedb1538c2071d705d2d3ab2df2c569ffed440278494649f9bf1ec881561c519\"],\"merkle_root\":\"0f3fe4aa201c275c10289c22f31e7211b555627b33a251bbe33d094abada6508\",\"work_pixel_ops\":34560,\"joules_micro\":0,\"uj_per_kilopixel_op\":null,\"energy_provenance\":null,\"parent_receipt_hash\":null,\"signer_pubkey\":\"4a29b9b42b4c7b8d947b226d503cfa1ee8b69a5cd3e4cb88b30db023d6d2bb8c\",\"signer_id\":\"did:example:sink/job-3004\",\"sig\":\"0b191cb06ae8f60a7e75934023d2ed139e2c47498bac566378a8784471e116271974a15f0e1177f94619a8f0392dd7b5f69117b7aa4ca90fafff656a474c7804\",\"receipt_hash\":\"7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac8\"}", + "codestream": "57495631010100000500000030000000300000000800000006000000d5ffffff590000000000000004000000090000000f000000160000001e00000028000000330000004100000051000000640000007a00000094000000b3000000d8000000030100003601000073010000bb0100001002000074020000ea020000750300001a040000dd040000c3050000d2060000130800008e0900004e0b00005f0d0000d00f0000b21200001a160000201a0000e11e00007e240000202b0000f6320000383c00002747000012540000556300005c750000a38a0000aa9c0000edab0000d8b80000c7c3000009cd0000dfd4000081db00001ee10000dfe50000e5e900004ded00002ff00000a0f20000b1f4000071f60000ecf700002df900003cfa000022fb0000e5fb00008afc000015fd00008bfd0000effd000044fe00008cfe0000c9fe0000fcfe000027ff00004cff00006bff000085ff00009bff0000aeff0000beff0000ccff0000d7ff0000e1ff0000e9ff0000f0ff0000f6ff0000fbff0000ffff00000000010000000000feff0100ffff01000000000000000000000000000200fdfffbfffbfffcfffbfffdfffbff00000000000000000300fdfffbfffbfffbfffbfffcfffbfffffffbff000000000100fffffdfffbfffbfffbfffbfffbff00000000000000000000000000000000fcfffdfffbfffcff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0400fbff0400fcfffbff0100000000000000feff02000500fbfffbfffbfffbfffbfffdfffbff00000000ffff01000500fcfffefffbfffbfffbfffbfffbff000000000000000000000000fdfffbfffcfffbfffbfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdff0200fcff0300000000000000000000000000fbfffcfffbfffbfffcfffbfffffffdff00000000000000000500fbfffbfffbfffbfffbfffffffbff00000000000000000300fefffdfffbfffbfffbfffbfffbff000000000000000000000000fdfffdfffcfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0200fbff0400ffff010000000000000000000300fefffbfffbfffbfffcff0100feff00000000000000000100fffffffffbfffbfffbfffbfffbff00000000000000000000000001000000fdfffcfffbfffbff74420000280b35593c000000a214bea9451501b9ad0cbdbd9a309164812c7ece531911d14717c3dbbc1d27782217989f7218f20d121d7bd4ca1f3eb3ef1f71131429e2d1f626c3e7ab249c33af4fe2d2c042a6d2222fb9b3c460c33836571567e55a40c90777634123135bfb8e1357858f0dfd6cd3316844ae2fdb041518b067b9167f09231b1d6f1c16b7df311ea6450d1ea29eed1ecc320c2b747de0206b34c82a708a2525b67967473d53e643c54f6f2f42e6355aaafd6534aabbdf5fe1a866406fac26314f6ad812ef006e0dd2c39e124439f5306ba6e0396f65ff1627ef771e0071f21b088eae1efd0a7d22d53ada205042fa23135ba627dfdecc3c473a7353bf1ea7435671e53209bdc9581998ef568e94f260c2af006595d31a5d0301d30b0e96f22e27c43d162997a218be088f12dc9d0915dff4db17246c1a3c61066e3807ec553cb509743e78e21d250c19332ef30e3d2d4f94a0275d0ead4e59f7ff403f44c02ed1b145563b075b55c0ece2599ea8038a52c4e77287a40b3015595e178405f01716799f12508739158ce39537c6364439c2c61335c774823feb0e4a46484b29464146093e52ba6e2e3e5a0631121b992d5a46a848c8478e518c794638949ff05b4c57d23967cc4b57d3bb164147bebb2f4cd1452f40e1701817cec818f564ff13f4072317feda4f17504f253558977544d057484615df8028fbee312a5a55ed2c1c72d1257130d62be71dda51a0a97748680d2735181dc85721d3923f8d192f8794fcc96be998eb135e56840f812d952b26dc2f2f8537db1701de931a9e0b811c99606b1d7a72b81fe6796623b2e3442266abe726bfe71c26713b582970ff964812b3a7511b88474ad1a39d60fe77fb5b93faa43aa689e37f22cf656dcdde8d4a529b091869c19a199bf5af108ce21a33eb8ae43a8485f63a7c0ae7f3e9d6d3fbf35320f44e2572fb823070f38da5d5fb4cd37f3e167531443d7027341943de2d2e0dbe4918ce0f53b1e5a7368b2c3c6ff4ff9044663d54810e945168c3b1d019852e9412c0563e10ce0287359612c8365ce0fd34c5cdb9f290f0e017571aaef2f889ca179debd4f3065bae18380425f4d7c9dd18bb2cf626ea6faa24e3f4384b1da15a3d6df8b52cc90b935da2e4c23b9597355cee7f1945393e249b7b14ad729ff91432962e6218224895175df6f11b30546af34ef81f1840d4b4f24290fa19e90d41f3792fbd17b307eff2702189161f1552f429b1fc18154682320160642d6a8c304b9a74645336beb060762fd36780e26160b5380e4500bf316ab3b6594b76993031ace92b2efad9cb178983121b9d4845f4ba36071a9d404af3f9d4f2199f14cff37ed44717baad75f448628d19af3421f46a8b0f19184461f3ef7bc1178d00634bcf58624c6725ac619927f15545490f360e0fb877c6814c6b9ea2f952ccf3a3abad91da10ef63f3144a0f23340223ff35814709f4d3516c16e5bb75f3a3574719c25228f4b5a03e1636db84f49a58781762e821f35742a2181bc2f7f397ef311637054630ad43d250643a45395291b55b725ae5723bdd1b62eae7a445bd65319f19c63568c61a5b1206b34d3bed1dd63786de01f49a49affb2a9cebf3518ed9fb7f061bf402f2bdfb0bb9c0f344eaa4fb1bb58df3fb10a4fb6bcbb8f3bb45a0fbfbd11ef477204efb6ff5815087d668629a2a0c5d17e9236a698d0061d79fdb460b2f26a9c24f33529ee32911b3aa1515876dab37a91b8339f13feff22ac0af17a839caf36b8b36183cace0f27ca7e419927205f46713bd1740d4a5f49da36019a6baa1f4ceac2c19b530c1f2eaf4de19c6322751ef91df5b92e05f6533f2a760db246a7d1551e266a304d149e19ef5ab9b67c917279abc17e5eb69fbf214f2182014b4fb9ffe3e163705e1fba23dfe17e466a2fb4cd37c16dcc16ffbaaa6f61663923efb92173218345ca6fb512703175f6a95fb422b751962216358fc9aad68a047125962cd87430577849addf21174af2dc5499c4fcf8778b8293377e4ed3b12154cf3afbf46fb6ab6baf3dc41b0fb4cbe91f32c0b39fb2ef0f3f2262a42fbe21813f3cd5230fb476af8f3870f92fbefea62f47a7a92fb7234cdf297d11f5d8e12023c55bf666f4ef6005c8d58bc9549953d730699fd4ff8264fb23cf0ac1886051a1c4d05891af4edc2fbf792baf24163bdfbe896c3f32f65e3fb6023ebf2ca07d7fb66774bf4993ad1fbd99a01f30be2a6fbd34630f3275768fb7ef1a1f2f78972fbe65735554ebaa9390610c05a5315734087513d8c09862074f653884a096d36bad118d01b4762691789a9a4fb84456418eb0ca3fb4aa9b419eedf99fb865a481883a740fbccb302171e6b31fbdcc4a318d918a3fb2772ae179e15aefb5dcf1b17b3873ffb7673f4189ca65c5d080bdc43f1e1b278e9bbf0411aed639db279b76db39473596dd293164dfc0317fddbabfb866f2cf49fee5afb376ea4f3351975fb9baa96f394a45afbd65b6bf333ddaffb9de9fdf212c3d7fbeeead4f2262aa9fbf329a1f4fa10ccfbaee586f41f6791fbe442375aab92fb3ebf0cd287434e9d6e5b5143a22f6941660f17d858c6629c18cba73c167536ce1e8e78a81944d168f419b32118417e79f37ee3a4168ea062f3684ff8160f7514f3d3335e16d0c984f4e44f5716db178bf3f1e44f1765e6d5f39b589417ffd4263cb1b60b56568bf7410b9931975f374f710f5c7f4fa42325bcbf1b8b7648524f17d3a2bc1d17f181fb389846f3eaf47dfb8dede9f2ef7b22fb6cb646f4429fd8fb1ab5a5f4cd8e2ffb7dc74ef4164ac2fb955678f3aea1abfb511264f4825bd7fb2cdbf5f268318f5c44110177dd73146b7a24ef4d9557b1ac71c8ac855c5302606910468a110d2833d76a203d85cc1c16f25d02f36cc7671902a893f3c335ff186fdffbf23bdcd317eae2b3f3dfb9001a3c8153f3a8edd118ccf62bf491591a17bed596f344cc8916cbf73c423ef6c45d15bc03651b1912a83850df6979ba2a6292c2eebd5d91e87574332d1ec8640e210884defb523cdff2811f84fb900283f397e066fbb5636bf4b5af3afbe896e9f2ed4ea3fbaabb7cf42cfc51fb744940f4fc3dc7fb444010f3ebf46cfb40019ff4ba45685818c3743cc9991ca49c3d626e6cdb6d54ca28d67ab141e2599329871efca9c71b6444e22057e352f45dd8b917feaa52f42bfc1119743121f3694f9818db6c99f3d79c4618989917f426394b16467b0df3b1fb8f19521d21f48db4ca175a186e3dbffda754ced3533d92a3eea77ad2e668dd293056741d36bf0ff6d877943fff1c5c2be22145ecd620c546c1f3241b6b1627e58ef43e187e1951f342f42ab1b917ec3602f4f8a719192312a0f21e3ac51704a731f4981c4f168ba270f48c969c181fea6d40d92c977aaa69c464c1fe0b4fe4ac6e6dca35ef5f6aa19dc29fe940765b492821c377c822552bbe2132b22720a4a99cfbe66ccb18874f90fb5de48618e3bcc8fb7a9dfc174fca80fb033b2e19226885fb5cbaa018cf7481fb4bbe3b1690f45071cf3b545fc7dc4c460fb904a5f494e4710bb28c59b37201bc93c3b85cedf29ed26f8cac231756f41e282b6e208e484d416f57f1f2d56f3617c0a984f402e336196a0dacf401f23a182db681f4e431cd161e6be5f31d3a03177b0239f33755483d85c9d2624864d23f6bb7c5a69c7e2164d4f8ed6167d7fdbd05c2405ff28607d169ffc3238fcc5423c78c9346c614a93f473a2b17750683fbeed5a017f40664fb11227117579a43fbf768d91957ef44fb4994591639592ffb3898db867e356462c5292e4270ba30a3145c994dc63817c2b506ff790c88855f7484a1d36b3cb022b49dc01f39897e3db627e7453b7eaa47ee9c181a325d08f3aea14718447cc5f3ce9d6d187dabeef346352a168c4c9bf38ff00e189a54f0817d9e5867e164264acf9f89a0468af5865b1d0f5d44650780f7a37565a8f4c0ceb96346217425be3f42ddfb460186a443dc4f4f39e726fd2e11ac22fba65269162b0d79fbccdde017447c95fbeeead617a64c9a609f26b64105687099d3e8f96edd6e714832a030810d602862a462e0c908e95486467e4f657a255646fefc1b3d6612ce46f05c183a0aa2e63122e07a4fe77fc847dfdb81f4981cdd5a7e25095e2496ff7c0d982d61f1b45a40c98a5da72c8cd36f9bae985ea04c49826f6e0159848c46d189116c7425229a29dca5753180914230f7d87f2cd1e2294a23bd653c8f2c033180eb015dc4796a35ffb37e5d2a91a83e040b6f9551375c7318d897491c79c9bfd5a26b563d7258cbb89e8e7b06429a6fdbbb519019578d2cf852092d88bd0f2a78859a2f1ffe22519dd8cb507fba725b0e80ca5d8ed18c6087f6007e90e4ac6bd0224e504285c6ad5e2a4885c47c8e5608003a80cdac406c2de6e9d9c33b3d881826ea313c35a52f98773329023e2e2f644eed4c9fd91548d5819c5845a9c356a9e281411746cb75d8b9686bb07213513a6827af9e2d2582d3aaee5d0a1e1582463d496d83be81d6d0003b8586b2b42e814ecb2eb4b31b288dd08d4a6d71253f6f90872d7f2ee65a725a8f582404ef5c515ac37806644d66e187784bf25f74a43c7dd98747933f580caf12c97de8796af508f6ce38d753833fa7e3df673b922672b38b4a3750af52b2e56f46a293d2301edf675a87c40637fa24ff5de154a43f0bf38b907403487346618150454a15be8935547faf98945cf4502f7649b7fb6993be0d924ba7e87e5c44373d6a05774e1f29b0405671ec2d2912145352a9f45d41c46d625518ce670cea41617a3a074385e691abd1d9156a1d614d5fb54f097d82d80c614b6b92cfc8bbf18ecd7c70d5e7049d93d1e01d3208d0df28de97dd2f92b2384b83a3414fd99c8754c10b9e5dd1be2056f367ff898dec986d36884b48e0487aa87651128106a3085ec747b37f462bcf65f40a63d5ef3e7f7cceecdee0471af487ef9a024980f7d83f5964932f413bab5da896195fea92a65bb5e08a7a9bd68e57b2e1444310b9ef9f9b1b0772aea0435d832578761abacc584d3588cdec05e37241fdd2de96b2b67eb007b4e5f9d4ef2a8742af5235a45147c3cab7323fd344569e919373f12bd5554e858d3c3b21c295a1d79c4a4fb2a7b79f3ab4817fe0416134b576cce565e369d8770ed9c2924f8be0dfa9dd680fe77af006c4499b2cf442c3a8c83284915263e978a0343afd905502056046dc7ab6773c132468e7578f4cfde095720b8e785a720e4bc40228f788b0f27669314a5f931b46bd7903017f8e10890fe23b330b2f9651075346d3114f7bd0563a61aa2b540a0abd34d4772278bec85e703c9d214d3cb2b767c686f94e8433cfbe3fab6a77d952576510c5cc764230fd772df1fee062380a787e5e1da520a88c3e08b7c330d28d614ff959b861ecc7795fe87c22712ae536609e6bee407518e19d641c5b653da09e59b8800e89d17848545190aad2538d869bd717dbd8356a67798d9ec5e38da75c9caf09b6ab547b3941643edf2f02e64254d50e36362c41616048da6c425bf9318c40ad18669821964ec7cbd2b8714e8f5dc27626caff71a47bf64d476ce899f18c24556f7820202b9b3fc5f4e77ac5be8c1bd2e3492682645389b4b359578edf64a5a823571c07547829153e647579c44813fa75b8937cd5797249dd5803ee0386f9cab266917789d973c3c989dff5e0de1a65817d238899a57e9e48eb67c3d0321d4dee57cc778c5525bf8f542e90828a8b72085cd25067411b57e1a7d11a4f67da559757ad36fbb9f6f3c55cf6723acf5d58348dc055fce03fd929925ba3f6e40db6df8f0358c8a335945849649d783b52b0006124cf4042c3f16a854dd4a7672206614e215921735710d162219312c171da4b7649882772eb6ac18293790f8a6ad0eb8a98988789622911a626f368e825d45f92441e6949bc1b3e57a98a2136eda230713b4b6c6175aa129315646973336e21535ebbb8b8a549687da77a9c603751abd14723da67adc45dd8ecffb37995aabce4d743db9059e992aa435f87ebf2069785b20d1282e032f87ec90a5977b5b6eb7ce5e14e76816f6d8aa2a99d88a41cda754a8eed7955bdc677bda57b7c9308d8853619ea8795f972807be4487ad3c6ba8177c1897f6ea77077cd107d7b0c6eb9775068bd82b5994983546a8b789ca4fc7e30fe328a23afde89fc09b97d0dc4b878a796bc885f381176c0dedd7c3009868708763778074f1483b056e47b2d2e6f775e060d80613be47905e3c28197a2b2867f2087840da05978d324ca77d0d2c3838b448282d320027d0815b57a46e25386e546797aea5eba75c4748a77a68fe6769eb2d488d27ee978dcf669752152f679d5d4447e23d3767a076168784a958b79e1e6cb7e174abe7e0952b07a7e773b7e902dfe83891d937b603f948047799278c0e56181423661814ddcad7e50682c7bd2708e8791bd117bd3ad5d764ab9e9851e6116883d29db86051203825f38767ecf081c7edad64780ccc1007a419fa88156cbfb8877f0068a366cf17ab74967805410d1775c0ec084f283567a15ff0480a7bab185479db782a0e0027c86b9e58487498f89cbd316877cf25b801767548ac2714878a7a81c89caa1d885c0633589a0289b7edbef3e82b44ae88619e8d979c7e36585e1ac7d81e3dea681258e21841709f6844a668580588df77ba9ec97766b4321899d7c8f84f0b64b880840f485a1533d851767a57d4a544c83b06ffa7dc8b02f8747de5c7fbfcc1387f25f5a8a96d15289712fee8898a5408dfef27fb1fe337a96b4d9119e22eb87a7befdb497371c3793e2cc0aac6839ae8fdf2214934812e67a0fae55765e185b83fc9293793110d187dcce0e868708c67c2d76639bf921f880fcbef0956f67119f67b9559a35d5fb9b7c1ecc997a8cb6b78d5cf38c291b8a8b95baa28623c1f77ac0c1d18300ec467e9c6e94869bba197d07b41b8215ed717c33a3518a2a69078e6c91f6ad16430393da5506a55aa5d0037315fafc42ea2304936366d8c6a231a413a65288914a4878fdecb7772cc2ad83e9a63a83e6830079d593e17e3d6ab47b4116c192d8e6c68cfe19c9af3ec9c39005755d013a19f177bd9ea67a4d820f7a4e487c042afd998ae5808088048d1c7cc641628a98e6237ed84a2e7b4c74f67ceebe667d388172975a9ae8afa684c0785fc93092ba7ee176bb07db75b140997b504ba975669b2c865791fb8b03a2327b42ee2879af368c80edb7ac827a8a198220b7b9783bfb7779379079828ed03eb60c7aed938ef44a98ff16557824090280d15731762a53287703a3b77fe63bd287bed734819a8f2080aac48c8253cc6a75084b27795ed0db7599b7f18705651188868021a7a69f5eb33e38d97dc4fd1985411d5076c1516a76d8de15829ba8e8861fdc0f88aa783f7b9aac607cc4b52478d9b68f7d03c7a57974203779ea94e0764e1d8f9d8ac846a5eb023c84085245853201b782e10ac287e06f07774edcdb8465e7e67b4f201381f6363f8327e4cc7f49584576e49dec82aad62b849a18e57ddab9dfa1dfa972a6a2b7127f6d3b3278c7a2f881f0af98824535538250c2998900cf9b88288d2778e3a5a29607b80c8af1e1f989ebb4ae7dd81bfe750a478a76390a5b7b16d7b9993e2d42cf578d667a5a367b78e9f23b7b6d993680088c68756815f1891602298a214723abf3ed7f8f93785d8a60b62d7f9eb218890b14197c055eff793efab48717d3f3b1cef2697a0b0daf7db98d5c89fd22457b7ea64a823c2d0d7cbbea0f763d9900fbcd7c0993dd268a901da4f37cdd3adc772d0a257608a94f6af2ecfe8990c841a548ad0f0355bd0b81c8cd508356dde386276d8987e4c8a17eae24597cac2c9685aa9cc780e78af9a7128b35a7e9e43f76e95770804540f4893590636813988480ba2f139c9f0c55cf83ba19860744d489391892880cfe0388f03fa186e898e57bdd04e379cba8b8fab785aa7d307981941cf013891e2b397be66ac778effb7b751ce013894acb3e846196ee03de219d897ead1781e16f55890797767732717b7de9e02981710be977bbb463fcf62c2695d6343a977160de77eb897f7530e5f883ab1320711d583f8542c6327aa93f847c26e8ae8708649b7e8188db85b068b58886efc983bb205d897fa99c8468f85ef91cde28a52f53e29aed1c0d7f8d8119889b02c485d946ab664e23bf880482d580c720ae03112885d3da3ef5804946a079c54cd5818cf8d489cd3b628376f4f882b02727872cc97d22c71cbb9c815fe9843299d185b9f9268620db128aaa5432880e540f7cb833b28a1d5a6dd08ba32078d731a87a3e5420770bf03f8511f95e7a99760a8607a9747f5599b1fab4e9db81987a0e879b025b7c8d6f6978d1bc797d09ed717cc600de87c2131b8498b4da03fa05068478a4b287491ec17eaf7e0c897045e87ea6f48782d212087c4ae8261d0f6f8a88c0755084709f6979ab8ade7818d3fd752beacb841a37c8786bccc77c149311847b83808ad929b8893b3819847bd2c27b19348181d8928287ace0be81a2481c1b8b644980cf780f771cc794839d461e7a85872d8038e63b7e25abcd8744d4f87b76233aa0aa52ebd7dcf395882d352a8351529c88f9ed62882f1b3d8a2e67d87b6dfe6bf8af405a83b1c9a7781e89ca76b46e807b4dd55f83761f5e88a1414e8af230b1851248a69d78bd977f239dc87a30b68d7f59940889c67e1177fd92fd861dee88864cb1591be244838471e77587929508875f678889cfd22b885a6c6081052f387e616a7a95bd77bbb1b62c138a067367797a4de184bef4d981d4d4f285ee3ca07ddad63c7a8003257fe6a788793612258267cd397e8529538850e641762ba213796a18c57ed784b7a52fd508a5ff20d6869efabf75d4df5f8a0e37078a9a432585d194c478d9b3b2786337658a8ca57d878c9eac7a19cf377e01f38482fee8c97926b98085796ae89e949cc590dc73e87d162af77c02e8088786b96a808534d2869636ba7c3117c086a46f587ac74f0e7ad36cd0806677b183ef845e870b1448822f4aa087dbd2be7aca2314810d587d869815da803de1e7855f800b850d17f47e7a1e32f90724a69a3f96087f43ea127b6a182a7bfd348b830732597c4f97457bcdbd9182687a998096417287ac455787b3a8cc8246a11e03b6260486f3a3837effe43b89e505de9b95289f9334b3ab840b670f7df76c63884d12b084dc574579ebb4018104286881d85c12861f1510767af346872d88fb86b01c9176e2bb40dccaa58cfa8517f60409c52a9ecaebf394ed2204a1499d827e71164f818c8ce57bf993528a8dff547c5a128f78fdab6e8acf492e82caa1737939ff837903492c9e15b105837ccb6c96d364cea13718beab45cc63a4dbb267872ee9ba80433d0f89b982877b7aa0437c178bc57cc9db49812ee96d839b96ec7f3087a979a9fe4f8942f577a8b8aa46a5009723940ef30e8fdd242eaf54b30298a5b8d579ef96f8844b5bf77d5e8fd989c2dd558aa5f488833c105b7734aa5889366c7f787df91d806ecb87859e787d9079ff13a63b6b2a8b01851c8c0015a1a35783748ad81b147ec9a56b894303be88adf98775b82cea775b4f787ba9ec7675b3313d7e4d8de588bcf81d8969f4238d5e69be94a58fecaa4121839ae315a69706ddf68a3c56d97b031a4487a743597a04bca87a08df6284aa30628a2da15488948dab86f283667e2ded9e895a7ef0864a1ece89683dfe7946884da33af14bac9579888c54d36097cbe562899b6efe818e3cda7c6f139b800d6a0c842c6fd87c625ffc79621e5084fe4da9803ad79080c31a237694b56d762587fe7576d051879db28578da6af183a7ba867b838b1388eb4f7384144be37e35e7437bd647c37642b8047bac91fd8509359281e07abc84e38bcd7b2ef4177e16d7e4829677b57b6a3c1c86ffaeea7554a4c381e629cd76f4b5647af3c05781599421804f32568846ba047bf5f23485aa42797d24c8e1823a8f7d7ef5c3137cb9f9f17d9b79c5771320817ec486607559163f8aad94d487d96a8478604ae689faf40f884899338a71ca6f8052b3ca7934c7b279ef72b6833c2dcf87157d32833183f87e41530f850d5f2f7f6271647a08dfcc76e52240864fd8967f99ff6c81e8509d75436ca985506f117690e56b82115360820063ec842f79887b035b9e81b91d167da253ea76c2179082a27e977eeebe1482cc8030886afb707ce3c56a868b4f457870aa77776ea76c77fd1b65780504aa7812bf8d87f5700f7f4a42167a2d9aa485e8eba27a02a7f98750398e754c7f1c887ba3f17f01a0b27dcbba247c8da525856b67a37ac57b168437f122843eef50897e485d7de3cc4683d97ca77da1c35f7b1e65eb79f4b56a88bc1597889e305e7b62cb8975661d3d7e1b6dd27fe8bc4079c2f3808adaa7f8865c81887f9797c6852b613681a2003e7ca021df7d2683247de48b3d806d107e75b2c9a0758575197e3457fb84c129f88193ae7b80eb7e668391225c87e994eb86a62a357d2003e5822c5d6989eb3d3d89e4e5fb82447a8c7eab8af6799e71b775277fe87aca187d82215976893f7f4277bcbb3d7aeab82e82a4b01789650b0179d29442896852507cef31227c8015c47a1ebf568a159a7d7d797c5080c1995f7b5cdfcf7e7743fc81c01b817e6dfeb0770e1e5479b355ae7be5cf2d8905addf7b8d5d8e83f57b35834e903f77ed5de57da439b5794eca49779e6a8d7f03743b88c0da998279b2597da81b237ca9466478589160773815fa845326708352a80576e0dfed75c23b5d863773717622b332872989b17f3d4d2a786f7f6586858e6981eb61547e87ae438220d4b781ca47f88066367f77171f6a88bd47c281d086d77c69edcb7881ed067b7a423b84e9e73d85d3a99788c01bc985b61e8d76b1b04178483ff5807d0b4b7ddf077f82ea658b811eb49c8866adfa7e3dc41d861bf6b97b1da66c8463379688ba6c5778bf607b82eed76178484af37837732a8261abaf7cfe95a67f144ba6784c62e087cae92979238bb68159c3217f4d16e97d58695287eda5f579b737557e8a4804765d5d4888738cf9790689308957215e8069a5c6889500347e88bc947e6cb65577c719ef8680d45c7d6f8aef86feb97182e5059a7b7b08898a5ff7cc7ae2be8b81c89ebd89ad77c57532305b85370ef17ad5c9d68482fba7880ffdf18283140b8a546afd7f4809617e5e7dd8788e9a0c83ce42227ada17358838520b785fcca87d83ccb57e3cec797c81ed177d3797b3796f6d557c59827e879f99c49d4094599d8f2e11a25021b88741121578fcf0f187ab6d9d86fe9540800201cb80da5f0f8072dce8867182408610c3e687b517098405940177a3c62f87a11de7a140c6518b772ffe90d0ff517a6337bc7a4731e884f009e481c9ff5d7e10aaaf85640f837a9ddae585f677827570a3df88fd176c7fb821e581e3141a880da01185b9c74d91a8d0adb5a830b98a98d596854b503a7f71f93979f199b87b576d82856732b6802081e17513731f86aa71de7bab9c0b7b9504b77dd33dc588c3081d8711a6d69ce9d132b70f581690eeb4c387ef1f3f891488ff850c6ad17f65c33c83fb556d7a7593da766c6ea289b8f2d4773175507ff665ba7b1b1a07889b55d5872eb3a3ad2635c08f9e5cb1abf8cd4880b438bd8207fc1880c7852a825ff03b799761ba7d45ff6e83f3c032836bd33c88f9528b7842413a8acd5f41791241c6797e00768626b90a94288aa1a5666113b2936c9e8674c93378bd4b018435dcbc896f86f58183f0878944c2787e8bc6a3800e95f28030ab2f84eff0738796e3f086a3bb4a787ab2db8e8605e8029dba41fc0fec099202a3146465e9e48541ca737910aaee828218f280c17cd777ba82bb7f86543685b164ef7c2ba9438786dd3a8a7b507f0163f5d885402166773f8ac7876b9d607ce33c1c7e19b2be8724cf6d7c03e4fc8980c2947b38276678a01a957f5b20d979fbb3b980449eb677a3f51a7f85875e977409adb1d85985923d3d9285a373648968b7367a99c2bf777a4d5e8bec6933b49ebb36866d3b2a857b913e801439228606bf4879af072c7846471082c4eb50792a9bacd048f7eaaf50a4298c43f866892c81747939ed307b3117b0807c33b579b10ac6ab76fefd84ed4008863e54757ee60c6c84d8e57b7d6f137d7befe98b81fc80327e5272b490077466a3fa75cc7bd93f9b809600d4816a061682318eb88537eacc9f21a31596839c47862c81877795452d83768f2486d13aef84288d59805cf1fc7da8802b7d5c2bd79efe2c8a7ba4035a8adce0c37c9689f17f1addd17ffb0d3d76923ba99a5f20aa87138ca276bc035f79cd58d37a36caff7de1d482802d1158980da6d278e6c8b2b0243f45784809ef7ebfcca47fc88c2e7670912e824b6d88813c80618ac0073991fe161885080abf80bf4366782a53be7d00c88f7c081ca67d279ca488d6e2fc838529d8da6786987e49e16a8672369b85ea9bab7632300484fc094a834564e5821320058750819d787050477ac7c6fc85a97c4c77ce05b385d731aa81ec7a6b7b21116d9f402da080b61ed37b640f807b9557458322ba2980bf02c67f26cbf57f844a31f92599597dcabe038254c80a7c11f9247eda30877de65f277dacaa7c751e2fb2862d35b4d8ab39677e7c740f822d9a4b8286fa6d88fb38668752b38b8981ac3286cae9891c02f27487ab62bb7a1fbbd7830cdae57b0009c67d972b7b7f732b0b8a8c270a7926b9557e26b965778754407bdb421988008793830761d8810386eb891e616e7dcdfeb21daf446f7f4d284f88033e8284a97cc4898d76f6794403cf75b181cc8384b694886398b385b1ed06868003e785b80f6c789337238259b1cf8602d2ab82d17b4076c8df6b76b19eec7db223cb7af598fb8416b355867f0e5387afea5e8336d12c79d8f7827d10ceb685f72b9b76943ec675625f6c7b8ed07d7bf0e51289590b7789512ae7f942a87d193bc3b7860cfe8b756a23c6798e6bac77e4c1b776f9a53082692e80857c69bd0294a0e67cb08c0388f86fa6869b434e7c16188e8164bc08860b8beb8269e2dd7fec151e79bc9e1880227d888822e976806f499c7e152e227e8bf5fe7c00c82481e898fade846be38140e0277b84f7417c4f07417e06246179c3130784a5407a7d9868321b0570a17582be397afa231e825cc2eb795e065278485135838804da8666c69177ecf1107f5355087c41e7a28673c63484afc6d57e43856c7d52fb6b813af4d0844c1f6f76d44f8783c1e17f7db42da482acf24e771cfd3281b546ac7526d60b8748fe1f983c79bc753462cc825ed78578bda51c8887083f82eb0eeb84495f067e0fe4491cabd286868a4831815475fd818f38ea777403c98871e7ef7ea3c6678512d81d865d110f8c34698d7554afad851fcdd8810c87aa7b7576bd87b58e8d783051d57750323d8688983780655e137f06774080977ead773b79897760af1f7ab713d97c320134a58490f57fc391ec771c748778eeed3a83d8e5cd7b0c1b317650397e751e2d439514250f8869f46e7e32011f7b923bd47f1415e87cca2ae676abd23088e0933786f3370faf90fc5c7a11700077b044bb7d6b67398893c04976bb6ce7844caacb8e90150b8a47387d87a7267a8092e8f383250cb87f92304877e0684c79be2311806aa14e90e6c4b184e8d9447a36415e7e985d2b781cce728a5505d084eb7edd94a0c6317d564da07d912216873720188445ffa3887be4cc850b4ac98349c4fd77b0035ab57743148037b193853c104580ad82d77514159f7eb4c19d8ad4e6aaa8f7030ab738f7d0840fe4f07f92831f80181bbd80af198a8857912a874cc3538aa3a9b184886909a28f67ac8db04c29208044f37b744b1d85543f9976bb1265857df9789baf534c97fb418d816624f780bb2b107f3e951479f5987581800a257985c88e7e6c757b7600a4c1a0b45b9c9448f01495730fb57c8b73cf849c925379f7070f94c5f476aef6b56c92385d8c87d66b3c89f469477c88869387e26060883f981786026df37e2a19ef88f051149ed7d571ab211d0696fa4b4c925b06cdf90b12b2acea4cd994d5f38fa9096b1baa1006b2833d1705846fd93c7608d46e834a25df80a5acbf794cb5a77e37326d8a1b3e6a75d1efd3932d0e509fdb5a679bdeb55f839591fa9214bbeeb30790b58de9e509994ae8207b4929a68874c20377692e2b81b23c58827e0750779f499b816087c97dc582d977e65fd27dfad0327dae652276a0e4e380c964e3814df92e81d70d058694216f790b798d810e953b86987a5c76f1631e7a3199107cecbb598a1b5000879416c67a433d1e807fa9d0788b7e6b7d6b1f6b80f450b3784ad6cb7e7f3d7789b09e05783ff6838450b7a67c10fd09819ea75b84483429889117d079eb12ff7a64ce877e86dd3a7e44c2e576c4e4c78992dd2184b41b1083ad8de681a2659884516b99797ea68b8a7c3a96812140577d7050d186273ea2868625a48003f62486497c2d88cde11c82c797597a68273a86fda03f7a72d19a8025cf8e85c3e48a868b3d3c8216a1b67b863b8c7b9eb9ee81410b977d9bde3c7bcb1f817ad4cd4283a743b689f40f92893852d2824564128963b528848678487e4cd9178a6b7933817714a683b4a4d1794593ff83b695d47e01c4fa7facb56682ef67a086e7080681fb67627f9dcf917c8438338385bd647cffdd427886d68784084b84788f721284ccc1ae804a8a5f76b0731179ec61a875d319af7742add57f49588b781ff5878382a1be75ad9fc286be0da075eab1bf8001057f821ebf5179a17bce7f95c3768523d345893eef997f9803a383b5587d7ea65984813428377ccb4377750e1eb88273b48686eb199e7d47431b837e5a8c76a2000e8217f7a989b529a2871d00c0889cab9b8092fa3982b886b4760832407b0732107918d3578636b48d81ad9fce7f8b4f658a51ac688904d5e378be8fcd7758862e7960512d88e2602684f06ed37ad84ad7875f38518621ac3d84c5f94f83c105c17efc6e887f88864f8349f38381003f2e7a1c0f90805953987e2d11df7a75b7c276c87a1d7633d23b83f3c07b7f271a99754485fd89ae19697fcf49c475db428f75355e16875ac6f27f986fb77704451081b5ab4f8199c9fb85ddd5ff815bcdc98699d0da7e40aa8478d7a8217de64da08891b21a7b6a4e477f162aa184ef848f7963e4ae7f55b2747ee8aae78113973e85bc15dd7d10eb9576c3541b853c511277f7e38d8129ee7c8277de3d8425f39989f3ae567b08c297791d942b7743eacb864c9f9581eaee987a2bfc8e89b6255189a1a604884780c6894f322383d6c503779d874487740ab27a1987977ecd05c47d9e42d37e9582c97e93a3827a8b07197b60807e88ec27cb89c33ed2779cf7a38491b29d87e8ce317c7606967c1cbc427ff2a0a4895ca50c84099aba75434fd6808ec5db790bbae582d59a267b2193377c198e02882392d9786ce58185cd223a764444b782d5ed938493f6fa88497cbb88a547368407df8277524747800ac52479c3ef9379b7ef637d0a7d448ae505fb85d2000b81f89e868a14eded78354c89764d69d6883a67ea761f730d7c1660c57e4b910c7f4265d77adf24907994d9e97d9790c1794b25d48978b6ca805ba2e27bc9e65c825d47877a0075ac86e4f7ef885260a5894e07c382873e7f7a765976775ddb657c9d6a5c867224b68795a61e8a8b32bc854df9c77e2bc6047b471f6c88dafa7576b252ba86dfb46f7752befd880ec0ba89b9c3e67b955e41806d104688ebeaee817da6207ebb5ae182a6f4a0802140548aa224798a7d8296828dffb27c268397866c75ac893ee4f184c092557816be177d6cf78b8489c31a7a8b90237e0af46883a3bb458803d91f7f9653b476079058880c6ad07ed731e88555f31a8873442379ff13398a14f8d9820ffd8f882093ef7c55feb27f2c15658a7e072788a4931b7b7afaf276a3bfcb7fe65f8b848b0e817c89f27c89ae2b6f7653721d7e3a842777da587b7e47a8b17d85eceb7e2451a7855fde4e78d14ceb786f37007e717006847899d67a8015b87736eefa797b3712870022057a8176d47c810a5b88fc1b51832ae3317c6844e189980a4f86a13a727f5a5a8779c873bb79335b6c7f58e0be819283c283f594d77c459a187c4f3dca88dac04689497cdb7571e07b76cc02387cb3de3e7e1d82c389e2b3d77e79e1c187681c76786295c77a50157483bd35367f2dbec389cbba5088dae83a7827781a7e48f7e084e31fb586c9359a77f83d0b7e02cb9a89ada61b7f89b1e87a67d88c7e6707427b99938e781946a582d18214818af57b892ff7ab7ee8989c83f05c297f6f49ac7b60c87b87f337348746433583d576bc75c06e6582276dbb7d4045f27f54ec7b8095e77f8111b8f19346d17daba9fa6da11cf467aa3859288f3cc3728b9eed0699dce1c498a94081abcc74dc93adc02d80a611e69689d47e76d8e5ef81f8df167bee356686fa47db8079296890fe180ca68ea14a8fd585aea5e57284b721d15690735e838c7fa9fc90139b619ebd8bbb885e595787155da79923dc97853e25f6867c169a89cd4d7d8155b2fb7ef283a7b6a01fc59039f30d8be3f2fcaa038f8c914e98bba90e3c390475cfe121366e6c9c95282d8c24ddfb76fcd3e8a12ce52f8a9e9c2b7dd731f887e5e10678796af378db30477dd29b5e91d6efb598e5c645a6c33d249705e638963a36d927ed7b3f7b468fde7fe61793872174c38c3c56c8806533e4946850c47de95ea0881d24437ecf66a68911ca7183257cf48036e333b14fed0a94b7f8369e40c24ab15e273afbf4242f7bc014267d0d46218697689281f3c0707d42369a96dd92ef8486a7e285868a19877702ab7e74c2ba75911089820964c58cc1bb5a8d0d6168ab7fe96395f8046584913b5e84dcbc9d7d691c4f781880ac7fa4270798fc66e48569596e7919b2f9850b92ac7fbf720d7f5d9a7475b3b304b5ae023e9c438c2ca7b54f16ae68e4fd8838b7e27e9bfb787efa2ae5838a890d7e50f8278074ddea87b8a32d8a8360f575be9a587cd02c0c7fb07aaf7fe7789076ac2c098d48130bb71a90919c94084e8ca2e23e82e93a1c8744d405766af43176f3135e8af881de871356c17b23c142a4336d307fe8ebea7646c51f7bbff01d762d648178ba9bac76c395cd88e8eb12057ce8bfdfa887df81df2b0b8a88218882fc269a7918b6a085ab2ca1813feb8f860249749eda88c17d924dfb855f5cae8124b6bd8722e96f79f4a3c37677f0507ba3a6290509290add8ea2a189b00a0c83699ad087dfcdd688bd35d082444b5381864d367773a2068d65335879d21dee7c9cd324817c45bd793abe9a874f689495c77f489a9d579b87bc5d58813cc8ad7b4385387c0e66b7818d118a7d66129b8af10519864c0458a4fb9f2586dd3a327a2bd82c8087913a76c34221860ecb6b77001bd794f5078d84332c2a7b60e553865d064881db78b57dc3e43185337fb481f4b58376b372c08951e20a857ead35856815ff87070e4e8afdc4007de575328529774a79921e897d22a158fa6e65bb79c5579677223ce77887ef4a8381acdc861a660d851bf6ad8548a4ac16a756c877f57b6a7858b56a879a0d6186631a0281c6bf6a87194d5c8932e4969bfa8ccbf9895f23810a3cf07f65286c78f45bbc7524f7aa84178bd07e3f08cf83d9ab8fa3c8e08576fc02a08a8bcd767df2d64f85af6114827e7ee886805d0476e6a01e83358240fc52a107896e9cf08443329d7538f1f7777befdb8471d5da79adc3ef7bb534d317d69949a6c15000822b97cf78ba65ae790bafbd89fd4d7388d731618871772b831631ba7fbe213a7d233828890a8baf80122b39868a89188a677a57843f5b4c7b895ef2f6a8600f8da00b8d7672a6f5894c7b4788a22bf5863b8bcd7b36eeae7cbc7aa388c0c8e27cb9b1a97f18a43e7ea4155487f1c4797fae5a397d739757783cdaa27b49bdd0b0f72f2684eba23585974f5582e0bbcd7f89f90d7b1d5eef7f7c0f586bc4f47e797fd19e1aa42fcf7d7b08a1832ad13d7c08f1da80f612927d6ea7ea825ba91582df3d60b877428d883129448aa6a1a8846f91f9772b61cd819ba8488817d32b85f3e4827b464e3d1ca62b8d86045e467d770d3e781c5064851cc3268677d3407e6ad78d8027eb5c9da485877c3964d1773c6e7f80b9287481069b7c7d71e72d768671e38039e2f47c8737c1849a065e82acc70280fddad8898f09ac893398c088fd17828828f2fa8ff3a7b978bddbfd891bbcce7cd8a43685f421b5879893427abe2a5d7697bf85825123907933e4917512ad6c7efe17e689528444878994ab7dd2121686a3203218f9ccfbb539f89d83848054883afbea7bea82be837a784089d74359823632c07c7fc62489ba9b2b86aacbd77b6fef3787ddf98777f641ef79bf6031824e12818604e00ca3a529537affef3e821e12c889d10b2787e00a2c7a784ac0764444d9838b73ee81f4aa2a97f456c188aa1e7d789f49e37e23558979e30dd37d36d11778d02c98aa1cca728171e797839ed69f840b094e7c2efbb8805fd3ff8517a4d181051d8582ceb2c3800cfe9eae3e68e2814702ba7e21befd811b7f9383e9b1567e24925198062adda32dbbb07f51d0827d6122a880e0f14c850dfa87893da07f8314d4a184ff784e83bc277b7d83883109d35d4a8746c5a0792c44ad75dae83c7b9eb9a0825c7a1b7a5d52ce8506078986a9466684c7fcf1898c81f8824fb4347dd606fd81d8a42c8af1053179539681856a7dcf8dd362e41904e8497e9462097bc026c016948e1b8652962278811c51853e421278d9878688614d6086cd29d0821c21a97c8adcec7c6d87147671ce407bac0f55806881268f947260a23b13310b5edfd2a1c0c7f8940b8d7877b8c70b775a94d57fa43916770c1b2089645e357d593a168549cf977be181487c77cc1386e845a07535f2b68cc3f93d8f3201b17ac14abc8a8e117eb15ff74f93059ec07cd0aa487e5ed0d4894d0bfc8508db8380e04b67780134877ff9a5b77605c37786ff0130841ad252763105e8a7cdf2757929c75685b799a78a41b690a64996109aa444b7781e368c7c151c1476b3433378a7557c7dc6249381bb4f0d7e01e8c384f2d645887c0fc07c865f978c4b78dd89d64e48a8f454d57ddbf32d96a030748c39814a86ace04b8015be4b7eb8fde777fb7df485a3973f81e1881f89a6ba96887bfded79b98d907d9993f17ac0a40595b5684078cf95c1a99852d1ac70f49fa4fb34fe9073a422856b26b07974203a7613ea107f83cc6088d6e2587dc16a4c80414cba885367f67e9707a4890619d8850c673880f670ad8be94c86962f2c84a966d482915be34883e82c40784062b17e5ee96e76f09d1b8650b0cc7b4784d3877a25967d8c441d7df761db7f97a93080897025826283207be7378684332cfd7e206f437a63498e87e99f8375b4f75189bf8b8b7be32af98687c08479b7aef885f88c6b7d8f846f7bb3e9da7fe558957f0009dc8643a96c7e9b148879dbc08a8215ff388aaa42dd7f4a5ff0811ff1f5818e06e47ac8cd4a86f6eeee82aa30b87abdf8cb8432542b87761f5d86f3b5f486b23c8077ee9ac2777d4ca1751ab2a078171f08853d0527878355ec8757913e781726a784ea9b1c7e45db0980bfba027771e0358258eb2e89aaa7b47f5db73d8a47802a7e321e8879cd346383673d8e7ac4b55884a2772188b2a1717e6976c180ae9b567859579c761d69ee7556b9cb7c9bcc00847e071c82ac50d27a3433ac7948af2d881523bf894b91237b1a1e3c852750dc82ee23dc7840452f7e8cb0057b6d34a688a7f0a275f08be77df90aca76059f577c7397527c7d94e488f744fb83783fed85d5939b8708c94688cfb55b87f8686577fd51968287f6f77f337fbe86165543771acbf4779a06947deba203803e013b8a49172984a08d288449cf7d851a308c8172891783a59ab7898231ee7b1d704d848613c57ef62f6b81dcfd4f8026b9d276339c607d0b676a83f0d3d784e1acfc795372c67f94212d875410a28113cda37a1ad69d85a7d3d47ab6e8107627012f8823792085b2c5b689fe4230843eaee281838b5c7c92a70687ec03157bee18507a9a351d8019295b81ca605a7d1004fa819dab4179e63b4178def95b83a56493860e428676c7480081dc339c7f00feb180301bc287f90a0378d8c1e17a6993787ebc03b389350030881cb133894851ac754fe3c9757a3bce77bb5ac287ec6f8c823ae93f7c3e78068122c5217cfa0680878cf8e678ead59586af858e76f8fc64824caa7889d3a99581f55e177d90c1ee85430ef689c81cb975e0b45e7ef2e8f1820350b67a2d52c081925437839935b97f93ae69818a7e838367fc8384b5e10477daf33b87a7c180893f7f5b8100a4f081c6bf058280f88b85273e0b7f0f374584dcc70782d2891d7f00ab0b7f1e19ad813f50de75676c0f7db93a287f5e4e7583c117797af75a9e773e951688613b787bc217e47769ede279fc26547a405786859d4d487e9e54ac83ace08276357bf07c9d87be829271698a439ec77bef84018a124f4d88fbccb8778beaef890c879076ae2fe2885dff2a7aba41178a9b8b9689aacbe97de235658477559f819271118213ea9089aebfd081aead5a7ad987af758288d4891aef73819d8e8378a9c80579c0f0cc7805d523830a2a2c7b34aaa67d9c09937502cb4f8399110585a810cf7aa48c18812e3174836bd3ca81b4c8bf7ba55280851385bf7a23cc9c88e111248a3f7ff9836565b37b2886a389ad82808143d8d67b0fc02a7ded52378414f8ea85680a7c82021ef280d13ab77ecc26c478415e777595212b7637ea107fdf85e97da2d1d57877a85a8f054fd87817cc73785eacd181fd4d1e7ae8507c8608649675ab49ef753ed6a17d82594b8a75be6684e994417ed008b18982d7a68085346c75527dca7e4cfd827c925fb18a26fb9c7d83969e80d5c962781e2426808f9d187f1c7b6b81bd23737d36ad907c5ccd9b88c213bc7a2044cb7da30eb3848296f97a858edc7e66f5c1804dca5c97e631ac8383d3e9924d704e7be766177fc283e37e0940a081f5c3a577effb0f78d128dc7ef283a3849ff6ac768db7d7864141ba88f4fd0f85ae908783c86fdf7aea1d9976c06eac76d5395c7bff787578c2e8a180a0864e7b18d3047f8188748722b30178ddbcf278d68f468626d2a6818176b87618c81588a141c77d688c5799bc773b7706b86a762f8fd0795bd82a762766388564453c856c63237a9993867c28980d81e372fd82d659ef7c1d1de3817f0e7e7dd36cf77e48e5af80200a027c2b7ea4805127f67540e4ce77fd0900783fae4978ff664c801c57cb775701257d12f56581c313ff8387e42676cdc80a7e0541767dcfefb37c209eec7ab27d24874b3e52908b18f993d8534d932c7e948a6a2a6a81bce6f381587bb77d9feff67ebd766a7e14d49a88bf55a3791535c2888326787a68a97579943e53898613d986d8a4c189c1bdcc85633e9d80a826da754c1a851dfd44aef8d62ba41e5d0958f764995a18c37b007fb563ce7f82183f7a42d1b57d7f0edb788f604c89a6c53f83c6f508863d712182a796a8b87bfc419c5c4d928c461498b3c64e467df0f00577cbb3bd7cf9b0af84652f06779b180e7630af657d3e83c487f88c648321596d777838ed8534b14086f6483682494d52a54b994fb14cdf889674ed6fe45cd01677fac9c77cdae8f77eb63b028737324d82d2775d7bfb0d5d7ce1a574786c8be787446fbe7dd4cdba808b3d3e7f6f081176c736929aec6cdb931c365da2f60b657a63e42f894e61fd7ffa064277e70c1080eba22c7eaff558792e18c983a481be75246e828625a70d7787dd30804b1a267b30c8b7907cb36899915363b8a8da7c832c2e1c881eeaeb78400f5279d4a987769820c27d35d5827d56787d7d35e7d0838aee81787bf6f485b379f08946ba9e85f36d258811ad0cb5713fe3b036c48f803b9dee809a182a7ef8bbb47a816fa786238b207b02837b866815257d73f59f7c2c27247a456f3f8a7df9bd7a65d5ae7c446817839bde42b42288a1ae2704c77caf078d7b2ee94780d796e57625ec0d828d2e037ae850fb8070577a87aa8a7f88b9a6d080448c2a77e563cc89ce9c0e79f6a63779b5abe08996362dab3a1b5295f3a0c788b0816586d5b7c7830c990c78718d2d7ab1520c7945c9ee76279178835aadc77e936d187b67e3087a32c44e7ec7d1317758fd8d7c7db13a9d7462d78fddc781813ad7a88792a79383b4fea2758dc2c989eb612b78cda49f880c754177d7a15284f6e3418453794d7fe8624288e2fbbb792480f88789534188638656a9a84e11e2c2212b82fac52c83c91c0177bc320c81463c8a83a6d73f848fa8f3827ef5c586fee8e884bae36783cb26f87d28fd03897ee3f78490229887bbc6f09981c9e595298684870f9102839f9c44890022577c7403908286427e86c83960881696aa8591a06683b7b5f18627b56288c3c7a28517f01f898dbed87729f9d37fd8d3af9a36f8527b9f8ac97fa81b897950df3377dc74ff7d172686884b2c5e7ce34ea786a10be987fb8b28814606588577141781d0ceb5780080dc7b35b8089af50605a632ae6380b113b9841f448b7c53af8e82629c8e7b6d462c84b529f8853fa33e81f3541a7d5da56888347b008ad8f76f797a7175779db675760aa19a88e6fa9187b1590baab17eb086d71fb08185b2638ab04017856421707e37d805881cb15d88724ffa759038b588f69ba18984bddd7b47cc747938328d8319a72d7e1ae8ad862912c98eb6d158a54eb704887212bc76e02002850249b477f2f3da80020c547fa9222488c3b52c7c5b7edd815e06c4897fd88d7b30ecaf79f2faae8243c6a888761f9395281ded91edd4141ed0d5b978f28ecf8091ab527827aee97c6e424082b75bd187f7195d7c9a7df67ac230ce8419a0958948fe517f51c93877cbd7fe7fec03fd81652fc6882e1c87996f89b81c7afb5c7a5f31277e51b72685560c9a7f80e6cf7a86cbcc7cb64d1778f2c4f377c4eb0b83f3ae66890e01a978324d7d80597000884858f28894e06b6e7f37fc75b98dd887eae34880108d7b877db89d7722e2de869b79b580e99f9e822fd347852df4697514cd9d7fe032f18769db56862380f97f929572899eaeb77bb3670d85bded4318a4fda9827219bb87696b6f79f05cbd858a7e6d8901e84b76f7a2c97cda5fd17fbc7a1e8244d4ec8081234387b7494478ca6b05859607b68926aee289951d3d82e6b2a1769dab9f826582fa75eac33276de3abf77bf1f7a824bd2867eee2a257e93912887daa739834ffce37db83364850947b6875cd437897c1d8d7fa90cc4855ef0627bc0e5568409ac0d7fea82ce85b07afd7eff01eb78a8802189e84568772ccd0c80b2060e7fc271587d5343288876315283a33df2894dad79822b0e6e80b9b1dca037593b873416db7a3e4db47f87d20c89e8ce2aaf8d2b4d87b39d3f7908f86678bf43fe821016298197ea5188eadc098aeff09e7b3ee8858894b85f7d11b12c782ef4e396200a39180823cc7dd0a3477c6ad73278c7c6d4ee5bf2d17fcd6a4382b4c84583ab5b6581b8d90a7d0d46737e1dd5007aa0083076bdf83a7b62a7228138a59679ac983ba1759f3791f434af93ec47b7156889baedb06e6a8c964b139ff953427a3de10f7917afb4882cc93682cec40c7da128338a331abb76fc26618946cc1588e546a6877ff118a6a39c919a6e8d7598e435f3adadf59f9050ddb694d615" + } + ] + }, + "job_v2_output_twice": { + "kind": "job", + "request": "{\"capability\":\"wai.video.int_motion\",\"deadline_us\":30000000,\"fallback\":\"wai.video.av1\",\"job\":\"job-3001\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"media.encode\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.av1\",\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":300000,\"failures\":{\"billed_price\":0,\"failed\":10,\"failed_ms\":500,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":12000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":10000,\"provider\":\"prov-beta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793000000000000,\"attempts\":[{\"billed\":true,\"end\":1793000004000000,\"endpoint\":\"im.alpha\",\"error\":null,\"hop\":1,\"not_billed\":null,\"outcome\":\"served\",\"outputs\":[\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"],\"receipt\":\"sha256:003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff\",\"start\":1793000000001000}],\"candidates\":[{\"capability\":\"wai.video.av1\",\"cost\":480000000,\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy\":10000000,\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"rank\":10,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\",\"via_fallback\":true},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy\":31104000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"expected_cost\":1036800,\"expected_ttfb_ms\":300,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1296000,\"expected_ttfb_ms\":700,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"rank\":4,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":967680,\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"rank\":9,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":898560,\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"rank\":8,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1054080,\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1054080,\"expected_ttfb_ms\":10100,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"rank\":2,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":864000,\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"rank\":7,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1071360,\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1071360,\"expected_ttfb_ms\":280,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"rank\":3,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1382400,\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1382400,\"expected_ttfb_ms\":240,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"rank\":6,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":933120,\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1333028,\"expected_ttfb_ms\":648,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"rank\":5,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\",\"via_fallback\":false}],\"capability\":\"wai.video.int_motion\",\"deadline\":1793000030000000,\"decision\":{\"decided_by\":\"price\",\"runner_up\":\"im.eta\"},\"fallback\":\"wai.video.av1\",\"job\":\"job-3001\",\"kind\":\"wai-route-record\",\"operation\":\"media.encode\",\"order\":[\"im.alpha\",\"im.eta\",\"im.iota\",\"im.beta\",\"im.zeta\",\"im.theta\",\"im.gamma\",\"im.epsilon\",\"im.delta\",\"av1.alpha\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"3fe0b709d0a08b368ae357c7451507dbed9d5634a8b38dde1167efb3d9399c16\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}],\"request\":\"889abf45e6a9ae51a0adb6b3f582bf66ae06cde717416578ea9117fe030ed061\",\"sig\":\"8c88126dc052e73fd3310ff00df12e0976b11af1d23474a3acf448c50d6e50034904c739950bf1c8ba7e2b8da968805ea6c4a8d8f5793aabac58dc5cd9fcce02\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:8c4548f5a0e497ae6257f82ab35a19c91a7e1489007119c03e4a299dbc0471c0\"],\"output\":\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"},\"work\":{\"status\":1,\"outcome\":\"completed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"30.25\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"30.25\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:6080a89fdfc1f6b08ac32fe75f1528dba2f26e652e6a1e04daa6e96a76f66f8e\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"143b5c365dc8ba8e460c4616773bd01da1f6b6ed47c2f28e454c2bc1797e078c09a895fc34aed8533f5d337841539a52fe982dc6b9d3fc829eb1704a9cc0e203\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [ + { + "receipt": "{\"profile\":\"wai.video.int_motion/receipt\",\"codestream_hash\":\"277865b574029f700f4fac023de3ab06ae598ee6f8ed726444e91442a6bd59e9\",\"clip_hash\":\"3492566e8e2682e3b3bac083b4db02ef8eba9a7f15d9faf0e27feee0f6eb488c\",\"h\":48,\"w\":48,\"frames\":[\"e1d8e8f8b5c534be1421e5858ed9137808ddb849bdff2bf397beb32568d8eb69\",\"ae7214babf5bbd6ec279434740f3271be43d2392b8167813fa557b5c4426fa14\",\"b3ef86db27b82d303bc6b612cb224ad55259b4f2e2c0461c74dcce188cd64b99\",\"3906f91010bf1b9ca14f6e2ac9b499589ac02ff4465e1d9764a22443a8b29c22\",\"bedb1538c2071d705d2d3ab2df2c569ffed440278494649f9bf1ec881561c519\"],\"merkle_root\":\"0f3fe4aa201c275c10289c22f31e7211b555627b33a251bbe33d094abada6508\",\"work_pixel_ops\":34560,\"joules_micro\":0,\"uj_per_kilopixel_op\":null,\"energy_provenance\":null,\"parent_receipt_hash\":null,\"signer_pubkey\":\"4a29b9b42b4c7b8d947b226d503cfa1ee8b69a5cd3e4cb88b30db023d6d2bb8c\",\"signer_id\":\"did:example:sink/job-3001\",\"sig\":\"74b028a210394b24c9ae318db1a5385801a1abfa5ec78fd334b839eea33d62a162b80931771258ec06e78fad127f2a2a822d3cc6c5d92be39fafb646a7cc3604\",\"receipt_hash\":\"9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae\"}", + "codestream": "57495631010100000500000030000000300000000800000006000000d5ffffff590000000000000004000000090000000f000000160000001e00000028000000330000004100000051000000640000007a00000094000000b3000000d8000000030100003601000073010000bb0100001002000074020000ea020000750300001a040000dd040000c3050000d2060000130800008e0900004e0b00005f0d0000d00f0000b21200001a160000201a0000e11e00007e240000202b0000f6320000383c00002747000012540000556300005c750000a38a0000aa9c0000edab0000d8b80000c7c3000009cd0000dfd4000081db00001ee10000dfe50000e5e900004ded00002ff00000a0f20000b1f4000071f60000ecf700002df900003cfa000022fb0000e5fb00008afc000015fd00008bfd0000effd000044fe00008cfe0000c9fe0000fcfe000027ff00004cff00006bff000085ff00009bff0000aeff0000beff0000ccff0000d7ff0000e1ff0000e9ff0000f0ff0000f6ff0000fbff0000ffff00000000010000000000feff0100ffff01000000000000000000000000000200fdfffbfffbfffcfffbfffdfffbff00000000000000000300fdfffbfffbfffbfffbfffcfffbfffffffbff000000000100fffffdfffbfffbfffbfffbfffbff00000000000000000000000000000000fcfffdfffbfffcff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0400fbff0400fcfffbff0100000000000000feff02000500fbfffbfffbfffbfffbfffdfffbff00000000ffff01000500fcfffefffbfffbfffbfffbfffbff000000000000000000000000fdfffbfffcfffbfffbfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdff0200fcff0300000000000000000000000000fbfffcfffbfffbfffcfffbfffffffdff00000000000000000500fbfffbfffbfffbfffbfffffffbff00000000000000000300fefffdfffbfffbfffbfffbfffbff000000000000000000000000fdfffdfffcfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0200fbff0400ffff010000000000000000000300fefffbfffbfffbfffcff0100feff00000000000000000100fffffffffbfffbfffbfffbfffbff00000000000000000000000001000000fdfffcfffbfffbff74420000280b35593c000000a214bea9451501b9ad0cbdbd9a309164812c7ece531911d14717c3dbbc1d27782217989f7218f20d121d7bd4ca1f3eb3ef1f71131429e2d1f626c3e7ab249c33af4fe2d2c042a6d2222fb9b3c460c33836571567e55a40c90777634123135bfb8e1357858f0dfd6cd3316844ae2fdb041518b067b9167f09231b1d6f1c16b7df311ea6450d1ea29eed1ecc320c2b747de0206b34c82a708a2525b67967473d53e643c54f6f2f42e6355aaafd6534aabbdf5fe1a866406fac26314f6ad812ef006e0dd2c39e124439f5306ba6e0396f65ff1627ef771e0071f21b088eae1efd0a7d22d53ada205042fa23135ba627dfdecc3c473a7353bf1ea7435671e53209bdc9581998ef568e94f260c2af006595d31a5d0301d30b0e96f22e27c43d162997a218be088f12dc9d0915dff4db17246c1a3c61066e3807ec553cb509743e78e21d250c19332ef30e3d2d4f94a0275d0ead4e59f7ff403f44c02ed1b145563b075b55c0ece2599ea8038a52c4e77287a40b3015595e178405f01716799f12508739158ce39537c6364439c2c61335c774823feb0e4a46484b29464146093e52ba6e2e3e5a0631121b992d5a46a848c8478e518c794638949ff05b4c57d23967cc4b57d3bb164147bebb2f4cd1452f40e1701817cec818f564ff13f4072317feda4f17504f253558977544d057484615df8028fbee312a5a55ed2c1c72d1257130d62be71dda51a0a97748680d2735181dc85721d3923f8d192f8794fcc96be998eb135e56840f812d952b26dc2f2f8537db1701de931a9e0b811c99606b1d7a72b81fe6796623b2e3442266abe726bfe71c26713b582970ff964812b3a7511b88474ad1a39d60fe77fb5b93faa43aa689e37f22cf656dcdde8d4a529b091869c19a199bf5af108ce21a33eb8ae43a8485f63a7c0ae7f3e9d6d3fbf35320f44e2572fb823070f38da5d5fb4cd37f3e167531443d7027341943de2d2e0dbe4918ce0f53b1e5a7368b2c3c6ff4ff9044663d54810e945168c3b1d019852e9412c0563e10ce0287359612c8365ce0fd34c5cdb9f290f0e017571aaef2f889ca179debd4f3065bae18380425f4d7c9dd18bb2cf626ea6faa24e3f4384b1da15a3d6df8b52cc90b935da2e4c23b9597355cee7f1945393e249b7b14ad729ff91432962e6218224895175df6f11b30546af34ef81f1840d4b4f24290fa19e90d41f3792fbd17b307eff2702189161f1552f429b1fc18154682320160642d6a8c304b9a74645336beb060762fd36780e26160b5380e4500bf316ab3b6594b76993031ace92b2efad9cb178983121b9d4845f4ba36071a9d404af3f9d4f2199f14cff37ed44717baad75f448628d19af3421f46a8b0f19184461f3ef7bc1178d00634bcf58624c6725ac619927f15545490f360e0fb877c6814c6b9ea2f952ccf3a3abad91da10ef63f3144a0f23340223ff35814709f4d3516c16e5bb75f3a3574719c25228f4b5a03e1636db84f49a58781762e821f35742a2181bc2f7f397ef311637054630ad43d250643a45395291b55b725ae5723bdd1b62eae7a445bd65319f19c63568c61a5b1206b34d3bed1dd63786de01f49a49affb2a9cebf3518ed9fb7f061bf402f2bdfb0bb9c0f344eaa4fb1bb58df3fb10a4fb6bcbb8f3bb45a0fbfbd11ef477204efb6ff5815087d668629a2a0c5d17e9236a698d0061d79fdb460b2f26a9c24f33529ee32911b3aa1515876dab37a91b8339f13feff22ac0af17a839caf36b8b36183cace0f27ca7e419927205f46713bd1740d4a5f49da36019a6baa1f4ceac2c19b530c1f2eaf4de19c6322751ef91df5b92e05f6533f2a760db246a7d1551e266a304d149e19ef5ab9b67c917279abc17e5eb69fbf214f2182014b4fb9ffe3e163705e1fba23dfe17e466a2fb4cd37c16dcc16ffbaaa6f61663923efb92173218345ca6fb512703175f6a95fb422b751962216358fc9aad68a047125962cd87430577849addf21174af2dc5499c4fcf8778b8293377e4ed3b12154cf3afbf46fb6ab6baf3dc41b0fb4cbe91f32c0b39fb2ef0f3f2262a42fbe21813f3cd5230fb476af8f3870f92fbefea62f47a7a92fb7234cdf297d11f5d8e12023c55bf666f4ef6005c8d58bc9549953d730699fd4ff8264fb23cf0ac1886051a1c4d05891af4edc2fbf792baf24163bdfbe896c3f32f65e3fb6023ebf2ca07d7fb66774bf4993ad1fbd99a01f30be2a6fbd34630f3275768fb7ef1a1f2f78972fbe65735554ebaa9390610c05a5315734087513d8c09862074f653884a096d36bad118d01b4762691789a9a4fb84456418eb0ca3fb4aa9b419eedf99fb865a481883a740fbccb302171e6b31fbdcc4a318d918a3fb2772ae179e15aefb5dcf1b17b3873ffb7673f4189ca65c5d080bdc43f1e1b278e9bbf0411aed639db279b76db39473596dd293164dfc0317fddbabfb866f2cf49fee5afb376ea4f3351975fb9baa96f394a45afbd65b6bf333ddaffb9de9fdf212c3d7fbeeead4f2262aa9fbf329a1f4fa10ccfbaee586f41f6791fbe442375aab92fb3ebf0cd287434e9d6e5b5143a22f6941660f17d858c6629c18cba73c167536ce1e8e78a81944d168f419b32118417e79f37ee3a4168ea062f3684ff8160f7514f3d3335e16d0c984f4e44f5716db178bf3f1e44f1765e6d5f39b589417ffd4263cb1b60b56568bf7410b9931975f374f710f5c7f4fa42325bcbf1b8b7648524f17d3a2bc1d17f181fb389846f3eaf47dfb8dede9f2ef7b22fb6cb646f4429fd8fb1ab5a5f4cd8e2ffb7dc74ef4164ac2fb955678f3aea1abfb511264f4825bd7fb2cdbf5f268318f5c44110177dd73146b7a24ef4d9557b1ac71c8ac855c5302606910468a110d2833d76a203d85cc1c16f25d02f36cc7671902a893f3c335ff186fdffbf23bdcd317eae2b3f3dfb9001a3c8153f3a8edd118ccf62bf491591a17bed596f344cc8916cbf73c423ef6c45d15bc03651b1912a83850df6979ba2a6292c2eebd5d91e87574332d1ec8640e210884defb523cdff2811f84fb900283f397e066fbb5636bf4b5af3afbe896e9f2ed4ea3fbaabb7cf42cfc51fb744940f4fc3dc7fb444010f3ebf46cfb40019ff4ba45685818c3743cc9991ca49c3d626e6cdb6d54ca28d67ab141e2599329871efca9c71b6444e22057e352f45dd8b917feaa52f42bfc1119743121f3694f9818db6c99f3d79c4618989917f426394b16467b0df3b1fb8f19521d21f48db4ca175a186e3dbffda754ced3533d92a3eea77ad2e668dd293056741d36bf0ff6d877943fff1c5c2be22145ecd620c546c1f3241b6b1627e58ef43e187e1951f342f42ab1b917ec3602f4f8a719192312a0f21e3ac51704a731f4981c4f168ba270f48c969c181fea6d40d92c977aaa69c464c1fe0b4fe4ac6e6dca35ef5f6aa19dc29fe940765b492821c377c822552bbe2132b22720a4a99cfbe66ccb18874f90fb5de48618e3bcc8fb7a9dfc174fca80fb033b2e19226885fb5cbaa018cf7481fb4bbe3b1690f45071cf3b545fc7dc4c460fb904a5f494e4710bb28c59b37201bc93c3b85cedf29ed26f8cac231756f41e282b6e208e484d416f57f1f2d56f3617c0a984f402e336196a0dacf401f23a182db681f4e431cd161e6be5f31d3a03177b0239f33755483d85c9d2624864d23f6bb7c5a69c7e2164d4f8ed6167d7fdbd05c2405ff28607d169ffc3238fcc5423c78c9346c614a93f473a2b17750683fbeed5a017f40664fb11227117579a43fbf768d91957ef44fb4994591639592ffb3898db867e356462c5292e4270ba30a3145c994dc63817c2b506ff790c88855f7484a1d36b3cb022b49dc01f39897e3db627e7453b7eaa47ee9c181a325d08f3aea14718447cc5f3ce9d6d187dabeef346352a168c4c9bf38ff00e189a54f0817d9e5867e164264acf9f89a0468af5865b1d0f5d44650780f7a37565a8f4c0ceb96346217425be3f42ddfb460186a443dc4f4f39e726fd2e11ac22fba65269162b0d79fbccdde017447c95fbeeead617a64c9a609f26b64105687099d3e8f96edd6e714832a030810d602862a462e0c908e95486467e4f657a255646fefc1b3d6612ce46f05c183a0aa2e63122e07a4fe77fc847dfdb81f4981cdd5a7e25095e2496ff7c0d982d61f1b45a40c98a5da72c8cd36f9bae985ea04c49826f6e0159848c46d189116c7425229a29dca5753180914230f7d87f2cd1e2294a23bd653c8f2c033180eb015dc4796a35ffb37e5d2a91a83e040b6f9551375c7318d897491c79c9bfd5a26b563d7258cbb89e8e7b06429a6fdbbb519019578d2cf852092d88bd0f2a78859a2f1ffe22519dd8cb507fba725b0e80ca5d8ed18c6087f6007e90e4ac6bd0224e504285c6ad5e2a4885c47c8e5608003a80cdac406c2de6e9d9c33b3d881826ea313c35a52f98773329023e2e2f644eed4c9fd91548d5819c5845a9c356a9e281411746cb75d8b9686bb07213513a6827af9e2d2582d3aaee5d0a1e1582463d496d83be81d6d0003b8586b2b42e814ecb2eb4b31b288dd08d4a6d71253f6f90872d7f2ee65a725a8f582404ef5c515ac37806644d66e187784bf25f74a43c7dd98747933f580caf12c97de8796af508f6ce38d753833fa7e3df673b922672b38b4a3750af52b2e56f46a293d2301edf675a87c40637fa24ff5de154a43f0bf38b907403487346618150454a15be8935547faf98945cf4502f7649b7fb6993be0d924ba7e87e5c44373d6a05774e1f29b0405671ec2d2912145352a9f45d41c46d625518ce670cea41617a3a074385e691abd1d9156a1d614d5fb54f097d82d80c614b6b92cfc8bbf18ecd7c70d5e7049d93d1e01d3208d0df28de97dd2f92b2384b83a3414fd99c8754c10b9e5dd1be2056f367ff898dec986d36884b48e0487aa87651128106a3085ec747b37f462bcf65f40a63d5ef3e7f7cceecdee0471af487ef9a024980f7d83f5964932f413bab5da896195fea92a65bb5e08a7a9bd68e57b2e1444310b9ef9f9b1b0772aea0435d832578761abacc584d3588cdec05e37241fdd2de96b2b67eb007b4e5f9d4ef2a8742af5235a45147c3cab7323fd344569e919373f12bd5554e858d3c3b21c295a1d79c4a4fb2a7b79f3ab4817fe0416134b576cce565e369d8770ed9c2924f8be0dfa9dd680fe77af006c4499b2cf442c3a8c83284915263e978a0343afd905502056046dc7ab6773c132468e7578f4cfde095720b8e785a720e4bc40228f788b0f27669314a5f931b46bd7903017f8e10890fe23b330b2f9651075346d3114f7bd0563a61aa2b540a0abd34d4772278bec85e703c9d214d3cb2b767c686f94e8433cfbe3fab6a77d952576510c5cc764230fd772df1fee062380a787e5e1da520a88c3e08b7c330d28d614ff959b861ecc7795fe87c22712ae536609e6bee407518e19d641c5b653da09e59b8800e89d17848545190aad2538d869bd717dbd8356a67798d9ec5e38da75c9caf09b6ab547b3941643edf2f02e64254d50e36362c41616048da6c425bf9318c40ad18669821964ec7cbd2b8714e8f5dc27626caff71a47bf64d476ce899f18c24556f7820202b9b3fc5f4e77ac5be8c1bd2e3492682645389b4b359578edf64a5a823571c07547829153e647579c44813fa75b8937cd5797249dd5803ee0386f9cab266917789d973c3c989dff5e0de1a65817d238899a57e9e48eb67c3d0321d4dee57cc778c5525bf8f542e90828a8b72085cd25067411b57e1a7d11a4f67da559757ad36fbb9f6f3c55cf6723acf5d58348dc055fce03fd929925ba3f6e40db6df8f0358c8a335945849649d783b52b0006124cf4042c3f16a854dd4a7672206614e215921735710d162219312c171da4b7649882772eb6ac18293790f8a6ad0eb8a98988789622911a626f368e825d45f92441e6949bc1b3e57a98a2136eda230713b4b6c6175aa129315646973336e21535ebbb8b8a549687da77a9c603751abd14723da67adc45dd8ecffb37995aabce4d743db9059e992aa435f87ebf2069785b20d1282e032f87ec90a5977b5b6eb7ce5e14e76816f6d8aa2a99d88a41cda754a8eed7955bdc677bda57b7c9308d8853619ea8795f972807be4487ad3c6ba8177c1897f6ea77077cd107d7b0c6eb9775068bd82b5994983546a8b789ca4fc7e30fe328a23afde89fc09b97d0dc4b878a796bc885f381176c0dedd7c3009868708763778074f1483b056e47b2d2e6f775e060d80613be47905e3c28197a2b2867f2087840da05978d324ca77d0d2c3838b448282d320027d0815b57a46e25386e546797aea5eba75c4748a77a68fe6769eb2d488d27ee978dcf669752152f679d5d4447e23d3767a076168784a958b79e1e6cb7e174abe7e0952b07a7e773b7e902dfe83891d937b603f948047799278c0e56181423661814ddcad7e50682c7bd2708e8791bd117bd3ad5d764ab9e9851e6116883d29db86051203825f38767ecf081c7edad64780ccc1007a419fa88156cbfb8877f0068a366cf17ab74967805410d1775c0ec084f283567a15ff0480a7bab185479db782a0e0027c86b9e58487498f89cbd316877cf25b801767548ac2714878a7a81c89caa1d885c0633589a0289b7edbef3e82b44ae88619e8d979c7e36585e1ac7d81e3dea681258e21841709f6844a668580588df77ba9ec97766b4321899d7c8f84f0b64b880840f485a1533d851767a57d4a544c83b06ffa7dc8b02f8747de5c7fbfcc1387f25f5a8a96d15289712fee8898a5408dfef27fb1fe337a96b4d9119e22eb87a7befdb497371c3793e2cc0aac6839ae8fdf2214934812e67a0fae55765e185b83fc9293793110d187dcce0e868708c67c2d76639bf921f880fcbef0956f67119f67b9559a35d5fb9b7c1ecc997a8cb6b78d5cf38c291b8a8b95baa28623c1f77ac0c1d18300ec467e9c6e94869bba197d07b41b8215ed717c33a3518a2a69078e6c91f6ad16430393da5506a55aa5d0037315fafc42ea2304936366d8c6a231a413a65288914a4878fdecb7772cc2ad83e9a63a83e6830079d593e17e3d6ab47b4116c192d8e6c68cfe19c9af3ec9c39005755d013a19f177bd9ea67a4d820f7a4e487c042afd998ae5808088048d1c7cc641628a98e6237ed84a2e7b4c74f67ceebe667d388172975a9ae8afa684c0785fc93092ba7ee176bb07db75b140997b504ba975669b2c865791fb8b03a2327b42ee2879af368c80edb7ac827a8a198220b7b9783bfb7779379079828ed03eb60c7aed938ef44a98ff16557824090280d15731762a53287703a3b77fe63bd287bed734819a8f2080aac48c8253cc6a75084b27795ed0db7599b7f18705651188868021a7a69f5eb33e38d97dc4fd1985411d5076c1516a76d8de15829ba8e8861fdc0f88aa783f7b9aac607cc4b52478d9b68f7d03c7a57974203779ea94e0764e1d8f9d8ac846a5eb023c84085245853201b782e10ac287e06f07774edcdb8465e7e67b4f201381f6363f8327e4cc7f49584576e49dec82aad62b849a18e57ddab9dfa1dfa972a6a2b7127f6d3b3278c7a2f881f0af98824535538250c2998900cf9b88288d2778e3a5a29607b80c8af1e1f989ebb4ae7dd81bfe750a478a76390a5b7b16d7b9993e2d42cf578d667a5a367b78e9f23b7b6d993680088c68756815f1891602298a214723abf3ed7f8f93785d8a60b62d7f9eb218890b14197c055eff793efab48717d3f3b1cef2697a0b0daf7db98d5c89fd22457b7ea64a823c2d0d7cbbea0f763d9900fbcd7c0993dd268a901da4f37cdd3adc772d0a257608a94f6af2ecfe8990c841a548ad0f0355bd0b81c8cd508356dde386276d8987e4c8a17eae24597cac2c9685aa9cc780e78af9a7128b35a7e9e43f76e95770804540f4893590636813988480ba2f139c9f0c55cf83ba19860744d489391892880cfe0388f03fa186e898e57bdd04e379cba8b8fab785aa7d307981941cf013891e2b397be66ac778effb7b751ce013894acb3e846196ee03de219d897ead1781e16f55890797767732717b7de9e02981710be977bbb463fcf62c2695d6343a977160de77eb897f7530e5f883ab1320711d583f8542c6327aa93f847c26e8ae8708649b7e8188db85b068b58886efc983bb205d897fa99c8468f85ef91cde28a52f53e29aed1c0d7f8d8119889b02c485d946ab664e23bf880482d580c720ae03112885d3da3ef5804946a079c54cd5818cf8d489cd3b628376f4f882b02727872cc97d22c71cbb9c815fe9843299d185b9f9268620db128aaa5432880e540f7cb833b28a1d5a6dd08ba32078d731a87a3e5420770bf03f8511f95e7a99760a8607a9747f5599b1fab4e9db81987a0e879b025b7c8d6f6978d1bc797d09ed717cc600de87c2131b8498b4da03fa05068478a4b287491ec17eaf7e0c897045e87ea6f48782d212087c4ae8261d0f6f8a88c0755084709f6979ab8ade7818d3fd752beacb841a37c8786bccc77c149311847b83808ad929b8893b3819847bd2c27b19348181d8928287ace0be81a2481c1b8b644980cf780f771cc794839d461e7a85872d8038e63b7e25abcd8744d4f87b76233aa0aa52ebd7dcf395882d352a8351529c88f9ed62882f1b3d8a2e67d87b6dfe6bf8af405a83b1c9a7781e89ca76b46e807b4dd55f83761f5e88a1414e8af230b1851248a69d78bd977f239dc87a30b68d7f59940889c67e1177fd92fd861dee88864cb1591be244838471e77587929508875f678889cfd22b885a6c6081052f387e616a7a95bd77bbb1b62c138a067367797a4de184bef4d981d4d4f285ee3ca07ddad63c7a8003257fe6a788793612258267cd397e8529538850e641762ba213796a18c57ed784b7a52fd508a5ff20d6869efabf75d4df5f8a0e37078a9a432585d194c478d9b3b2786337658a8ca57d878c9eac7a19cf377e01f38482fee8c97926b98085796ae89e949cc590dc73e87d162af77c02e8088786b96a808534d2869636ba7c3117c086a46f587ac74f0e7ad36cd0806677b183ef845e870b1448822f4aa087dbd2be7aca2314810d587d869815da803de1e7855f800b850d17f47e7a1e32f90724a69a3f96087f43ea127b6a182a7bfd348b830732597c4f97457bcdbd9182687a998096417287ac455787b3a8cc8246a11e03b6260486f3a3837effe43b89e505de9b95289f9334b3ab840b670f7df76c63884d12b084dc574579ebb4018104286881d85c12861f1510767af346872d88fb86b01c9176e2bb40dccaa58cfa8517f60409c52a9ecaebf394ed2204a1499d827e71164f818c8ce57bf993528a8dff547c5a128f78fdab6e8acf492e82caa1737939ff837903492c9e15b105837ccb6c96d364cea13718beab45cc63a4dbb267872ee9ba80433d0f89b982877b7aa0437c178bc57cc9db49812ee96d839b96ec7f3087a979a9fe4f8942f577a8b8aa46a5009723940ef30e8fdd242eaf54b30298a5b8d579ef96f8844b5bf77d5e8fd989c2dd558aa5f488833c105b7734aa5889366c7f787df91d806ecb87859e787d9079ff13a63b6b2a8b01851c8c0015a1a35783748ad81b147ec9a56b894303be88adf98775b82cea775b4f787ba9ec7675b3313d7e4d8de588bcf81d8969f4238d5e69be94a58fecaa4121839ae315a69706ddf68a3c56d97b031a4487a743597a04bca87a08df6284aa30628a2da15488948dab86f283667e2ded9e895a7ef0864a1ece89683dfe7946884da33af14bac9579888c54d36097cbe562899b6efe818e3cda7c6f139b800d6a0c842c6fd87c625ffc79621e5084fe4da9803ad79080c31a237694b56d762587fe7576d051879db28578da6af183a7ba867b838b1388eb4f7384144be37e35e7437bd647c37642b8047bac91fd8509359281e07abc84e38bcd7b2ef4177e16d7e4829677b57b6a3c1c86ffaeea7554a4c381e629cd76f4b5647af3c05781599421804f32568846ba047bf5f23485aa42797d24c8e1823a8f7d7ef5c3137cb9f9f17d9b79c5771320817ec486607559163f8aad94d487d96a8478604ae689faf40f884899338a71ca6f8052b3ca7934c7b279ef72b6833c2dcf87157d32833183f87e41530f850d5f2f7f6271647a08dfcc76e52240864fd8967f99ff6c81e8509d75436ca985506f117690e56b82115360820063ec842f79887b035b9e81b91d167da253ea76c2179082a27e977eeebe1482cc8030886afb707ce3c56a868b4f457870aa77776ea76c77fd1b65780504aa7812bf8d87f5700f7f4a42167a2d9aa485e8eba27a02a7f98750398e754c7f1c887ba3f17f01a0b27dcbba247c8da525856b67a37ac57b168437f122843eef50897e485d7de3cc4683d97ca77da1c35f7b1e65eb79f4b56a88bc1597889e305e7b62cb8975661d3d7e1b6dd27fe8bc4079c2f3808adaa7f8865c81887f9797c6852b613681a2003e7ca021df7d2683247de48b3d806d107e75b2c9a0758575197e3457fb84c129f88193ae7b80eb7e668391225c87e994eb86a62a357d2003e5822c5d6989eb3d3d89e4e5fb82447a8c7eab8af6799e71b775277fe87aca187d82215976893f7f4277bcbb3d7aeab82e82a4b01789650b0179d29442896852507cef31227c8015c47a1ebf568a159a7d7d797c5080c1995f7b5cdfcf7e7743fc81c01b817e6dfeb0770e1e5479b355ae7be5cf2d8905addf7b8d5d8e83f57b35834e903f77ed5de57da439b5794eca49779e6a8d7f03743b88c0da998279b2597da81b237ca9466478589160773815fa845326708352a80576e0dfed75c23b5d863773717622b332872989b17f3d4d2a786f7f6586858e6981eb61547e87ae438220d4b781ca47f88066367f77171f6a88bd47c281d086d77c69edcb7881ed067b7a423b84e9e73d85d3a99788c01bc985b61e8d76b1b04178483ff5807d0b4b7ddf077f82ea658b811eb49c8866adfa7e3dc41d861bf6b97b1da66c8463379688ba6c5778bf607b82eed76178484af37837732a8261abaf7cfe95a67f144ba6784c62e087cae92979238bb68159c3217f4d16e97d58695287eda5f579b737557e8a4804765d5d4888738cf9790689308957215e8069a5c6889500347e88bc947e6cb65577c719ef8680d45c7d6f8aef86feb97182e5059a7b7b08898a5ff7cc7ae2be8b81c89ebd89ad77c57532305b85370ef17ad5c9d68482fba7880ffdf18283140b8a546afd7f4809617e5e7dd8788e9a0c83ce42227ada17358838520b785fcca87d83ccb57e3cec797c81ed177d3797b3796f6d557c59827e879f99c49d4094599d8f2e11a25021b88741121578fcf0f187ab6d9d86fe9540800201cb80da5f0f8072dce8867182408610c3e687b517098405940177a3c62f87a11de7a140c6518b772ffe90d0ff517a6337bc7a4731e884f009e481c9ff5d7e10aaaf85640f837a9ddae585f677827570a3df88fd176c7fb821e581e3141a880da01185b9c74d91a8d0adb5a830b98a98d596854b503a7f71f93979f199b87b576d82856732b6802081e17513731f86aa71de7bab9c0b7b9504b77dd33dc588c3081d8711a6d69ce9d132b70f581690eeb4c387ef1f3f891488ff850c6ad17f65c33c83fb556d7a7593da766c6ea289b8f2d4773175507ff665ba7b1b1a07889b55d5872eb3a3ad2635c08f9e5cb1abf8cd4880b438bd8207fc1880c7852a825ff03b799761ba7d45ff6e83f3c032836bd33c88f9528b7842413a8acd5f41791241c6797e00768626b90a94288aa1a5666113b2936c9e8674c93378bd4b018435dcbc896f86f58183f0878944c2787e8bc6a3800e95f28030ab2f84eff0738796e3f086a3bb4a787ab2db8e8605e8029dba41fc0fec099202a3146465e9e48541ca737910aaee828218f280c17cd777ba82bb7f86543685b164ef7c2ba9438786dd3a8a7b507f0163f5d885402166773f8ac7876b9d607ce33c1c7e19b2be8724cf6d7c03e4fc8980c2947b38276678a01a957f5b20d979fbb3b980449eb677a3f51a7f85875e977409adb1d85985923d3d9285a373648968b7367a99c2bf777a4d5e8bec6933b49ebb36866d3b2a857b913e801439228606bf4879af072c7846471082c4eb50792a9bacd048f7eaaf50a4298c43f866892c81747939ed307b3117b0807c33b579b10ac6ab76fefd84ed4008863e54757ee60c6c84d8e57b7d6f137d7befe98b81fc80327e5272b490077466a3fa75cc7bd93f9b809600d4816a061682318eb88537eacc9f21a31596839c47862c81877795452d83768f2486d13aef84288d59805cf1fc7da8802b7d5c2bd79efe2c8a7ba4035a8adce0c37c9689f17f1addd17ffb0d3d76923ba99a5f20aa87138ca276bc035f79cd58d37a36caff7de1d482802d1158980da6d278e6c8b2b0243f45784809ef7ebfcca47fc88c2e7670912e824b6d88813c80618ac0073991fe161885080abf80bf4366782a53be7d00c88f7c081ca67d279ca488d6e2fc838529d8da6786987e49e16a8672369b85ea9bab7632300484fc094a834564e5821320058750819d787050477ac7c6fc85a97c4c77ce05b385d731aa81ec7a6b7b21116d9f402da080b61ed37b640f807b9557458322ba2980bf02c67f26cbf57f844a31f92599597dcabe038254c80a7c11f9247eda30877de65f277dacaa7c751e2fb2862d35b4d8ab39677e7c740f822d9a4b8286fa6d88fb38668752b38b8981ac3286cae9891c02f27487ab62bb7a1fbbd7830cdae57b0009c67d972b7b7f732b0b8a8c270a7926b9557e26b965778754407bdb421988008793830761d8810386eb891e616e7dcdfeb21daf446f7f4d284f88033e8284a97cc4898d76f6794403cf75b181cc8384b694886398b385b1ed06868003e785b80f6c789337238259b1cf8602d2ab82d17b4076c8df6b76b19eec7db223cb7af598fb8416b355867f0e5387afea5e8336d12c79d8f7827d10ceb685f72b9b76943ec675625f6c7b8ed07d7bf0e51289590b7789512ae7f942a87d193bc3b7860cfe8b756a23c6798e6bac77e4c1b776f9a53082692e80857c69bd0294a0e67cb08c0388f86fa6869b434e7c16188e8164bc08860b8beb8269e2dd7fec151e79bc9e1880227d888822e976806f499c7e152e227e8bf5fe7c00c82481e898fade846be38140e0277b84f7417c4f07417e06246179c3130784a5407a7d9868321b0570a17582be397afa231e825cc2eb795e065278485135838804da8666c69177ecf1107f5355087c41e7a28673c63484afc6d57e43856c7d52fb6b813af4d0844c1f6f76d44f8783c1e17f7db42da482acf24e771cfd3281b546ac7526d60b8748fe1f983c79bc753462cc825ed78578bda51c8887083f82eb0eeb84495f067e0fe4491cabd286868a4831815475fd818f38ea777403c98871e7ef7ea3c6678512d81d865d110f8c34698d7554afad851fcdd8810c87aa7b7576bd87b58e8d783051d57750323d8688983780655e137f06774080977ead773b79897760af1f7ab713d97c320134a58490f57fc391ec771c748778eeed3a83d8e5cd7b0c1b317650397e751e2d439514250f8869f46e7e32011f7b923bd47f1415e87cca2ae676abd23088e0933786f3370faf90fc5c7a11700077b044bb7d6b67398893c04976bb6ce7844caacb8e90150b8a47387d87a7267a8092e8f383250cb87f92304877e0684c79be2311806aa14e90e6c4b184e8d9447a36415e7e985d2b781cce728a5505d084eb7edd94a0c6317d564da07d912216873720188445ffa3887be4cc850b4ac98349c4fd77b0035ab57743148037b193853c104580ad82d77514159f7eb4c19d8ad4e6aaa8f7030ab738f7d0840fe4f07f92831f80181bbd80af198a8857912a874cc3538aa3a9b184886909a28f67ac8db04c29208044f37b744b1d85543f9976bb1265857df9789baf534c97fb418d816624f780bb2b107f3e951479f5987581800a257985c88e7e6c757b7600a4c1a0b45b9c9448f01495730fb57c8b73cf849c925379f7070f94c5f476aef6b56c92385d8c87d66b3c89f469477c88869387e26060883f981786026df37e2a19ef88f051149ed7d571ab211d0696fa4b4c925b06cdf90b12b2acea4cd994d5f38fa9096b1baa1006b2833d1705846fd93c7608d46e834a25df80a5acbf794cb5a77e37326d8a1b3e6a75d1efd3932d0e509fdb5a679bdeb55f839591fa9214bbeeb30790b58de9e509994ae8207b4929a68874c20377692e2b81b23c58827e0750779f499b816087c97dc582d977e65fd27dfad0327dae652276a0e4e380c964e3814df92e81d70d058694216f790b798d810e953b86987a5c76f1631e7a3199107cecbb598a1b5000879416c67a433d1e807fa9d0788b7e6b7d6b1f6b80f450b3784ad6cb7e7f3d7789b09e05783ff6838450b7a67c10fd09819ea75b84483429889117d079eb12ff7a64ce877e86dd3a7e44c2e576c4e4c78992dd2184b41b1083ad8de681a2659884516b99797ea68b8a7c3a96812140577d7050d186273ea2868625a48003f62486497c2d88cde11c82c797597a68273a86fda03f7a72d19a8025cf8e85c3e48a868b3d3c8216a1b67b863b8c7b9eb9ee81410b977d9bde3c7bcb1f817ad4cd4283a743b689f40f92893852d2824564128963b528848678487e4cd9178a6b7933817714a683b4a4d1794593ff83b695d47e01c4fa7facb56682ef67a086e7080681fb67627f9dcf917c8438338385bd647cffdd427886d68784084b84788f721284ccc1ae804a8a5f76b0731179ec61a875d319af7742add57f49588b781ff5878382a1be75ad9fc286be0da075eab1bf8001057f821ebf5179a17bce7f95c3768523d345893eef997f9803a383b5587d7ea65984813428377ccb4377750e1eb88273b48686eb199e7d47431b837e5a8c76a2000e8217f7a989b529a2871d00c0889cab9b8092fa3982b886b4760832407b0732107918d3578636b48d81ad9fce7f8b4f658a51ac688904d5e378be8fcd7758862e7960512d88e2602684f06ed37ad84ad7875f38518621ac3d84c5f94f83c105c17efc6e887f88864f8349f38381003f2e7a1c0f90805953987e2d11df7a75b7c276c87a1d7633d23b83f3c07b7f271a99754485fd89ae19697fcf49c475db428f75355e16875ac6f27f986fb77704451081b5ab4f8199c9fb85ddd5ff815bcdc98699d0da7e40aa8478d7a8217de64da08891b21a7b6a4e477f162aa184ef848f7963e4ae7f55b2747ee8aae78113973e85bc15dd7d10eb9576c3541b853c511277f7e38d8129ee7c8277de3d8425f39989f3ae567b08c297791d942b7743eacb864c9f9581eaee987a2bfc8e89b6255189a1a604884780c6894f322383d6c503779d874487740ab27a1987977ecd05c47d9e42d37e9582c97e93a3827a8b07197b60807e88ec27cb89c33ed2779cf7a38491b29d87e8ce317c7606967c1cbc427ff2a0a4895ca50c84099aba75434fd6808ec5db790bbae582d59a267b2193377c198e02882392d9786ce58185cd223a764444b782d5ed938493f6fa88497cbb88a547368407df8277524747800ac52479c3ef9379b7ef637d0a7d448ae505fb85d2000b81f89e868a14eded78354c89764d69d6883a67ea761f730d7c1660c57e4b910c7f4265d77adf24907994d9e97d9790c1794b25d48978b6ca805ba2e27bc9e65c825d47877a0075ac86e4f7ef885260a5894e07c382873e7f7a765976775ddb657c9d6a5c867224b68795a61e8a8b32bc854df9c77e2bc6047b471f6c88dafa7576b252ba86dfb46f7752befd880ec0ba89b9c3e67b955e41806d104688ebeaee817da6207ebb5ae182a6f4a0802140548aa224798a7d8296828dffb27c268397866c75ac893ee4f184c092557816be177d6cf78b8489c31a7a8b90237e0af46883a3bb458803d91f7f9653b476079058880c6ad07ed731e88555f31a8873442379ff13398a14f8d9820ffd8f882093ef7c55feb27f2c15658a7e072788a4931b7b7afaf276a3bfcb7fe65f8b848b0e817c89f27c89ae2b6f7653721d7e3a842777da587b7e47a8b17d85eceb7e2451a7855fde4e78d14ceb786f37007e717006847899d67a8015b87736eefa797b3712870022057a8176d47c810a5b88fc1b51832ae3317c6844e189980a4f86a13a727f5a5a8779c873bb79335b6c7f58e0be819283c283f594d77c459a187c4f3dca88dac04689497cdb7571e07b76cc02387cb3de3e7e1d82c389e2b3d77e79e1c187681c76786295c77a50157483bd35367f2dbec389cbba5088dae83a7827781a7e48f7e084e31fb586c9359a77f83d0b7e02cb9a89ada61b7f89b1e87a67d88c7e6707427b99938e781946a582d18214818af57b892ff7ab7ee8989c83f05c297f6f49ac7b60c87b87f337348746433583d576bc75c06e6582276dbb7d4045f27f54ec7b8095e77f8111b8f19346d17daba9fa6da11cf467aa3859288f3cc3728b9eed0699dce1c498a94081abcc74dc93adc02d80a611e69689d47e76d8e5ef81f8df167bee356686fa47db8079296890fe180ca68ea14a8fd585aea5e57284b721d15690735e838c7fa9fc90139b619ebd8bbb885e595787155da79923dc97853e25f6867c169a89cd4d7d8155b2fb7ef283a7b6a01fc59039f30d8be3f2fcaa038f8c914e98bba90e3c390475cfe121366e6c9c95282d8c24ddfb76fcd3e8a12ce52f8a9e9c2b7dd731f887e5e10678796af378db30477dd29b5e91d6efb598e5c645a6c33d249705e638963a36d927ed7b3f7b468fde7fe61793872174c38c3c56c8806533e4946850c47de95ea0881d24437ecf66a68911ca7183257cf48036e333b14fed0a94b7f8369e40c24ab15e273afbf4242f7bc014267d0d46218697689281f3c0707d42369a96dd92ef8486a7e285868a19877702ab7e74c2ba75911089820964c58cc1bb5a8d0d6168ab7fe96395f8046584913b5e84dcbc9d7d691c4f781880ac7fa4270798fc66e48569596e7919b2f9850b92ac7fbf720d7f5d9a7475b3b304b5ae023e9c438c2ca7b54f16ae68e4fd8838b7e27e9bfb787efa2ae5838a890d7e50f8278074ddea87b8a32d8a8360f575be9a587cd02c0c7fb07aaf7fe7789076ac2c098d48130bb71a90919c94084e8ca2e23e82e93a1c8744d405766af43176f3135e8af881de871356c17b23c142a4336d307fe8ebea7646c51f7bbff01d762d648178ba9bac76c395cd88e8eb12057ce8bfdfa887df81df2b0b8a88218882fc269a7918b6a085ab2ca1813feb8f860249749eda88c17d924dfb855f5cae8124b6bd8722e96f79f4a3c37677f0507ba3a6290509290add8ea2a189b00a0c83699ad087dfcdd688bd35d082444b5381864d367773a2068d65335879d21dee7c9cd324817c45bd793abe9a874f689495c77f489a9d579b87bc5d58813cc8ad7b4385387c0e66b7818d118a7d66129b8af10519864c0458a4fb9f2586dd3a327a2bd82c8087913a76c34221860ecb6b77001bd794f5078d84332c2a7b60e553865d064881db78b57dc3e43185337fb481f4b58376b372c08951e20a857ead35856815ff87070e4e8afdc4007de575328529774a79921e897d22a158fa6e65bb79c5579677223ce77887ef4a8381acdc861a660d851bf6ad8548a4ac16a756c877f57b6a7858b56a879a0d6186631a0281c6bf6a87194d5c8932e4969bfa8ccbf9895f23810a3cf07f65286c78f45bbc7524f7aa84178bd07e3f08cf83d9ab8fa3c8e08576fc02a08a8bcd767df2d64f85af6114827e7ee886805d0476e6a01e83358240fc52a107896e9cf08443329d7538f1f7777befdb8471d5da79adc3ef7bb534d317d69949a6c15000822b97cf78ba65ae790bafbd89fd4d7388d731618871772b831631ba7fbe213a7d233828890a8baf80122b39868a89188a677a57843f5b4c7b895ef2f6a8600f8da00b8d7672a6f5894c7b4788a22bf5863b8bcd7b36eeae7cbc7aa388c0c8e27cb9b1a97f18a43e7ea4155487f1c4797fae5a397d739757783cdaa27b49bdd0b0f72f2684eba23585974f5582e0bbcd7f89f90d7b1d5eef7f7c0f586bc4f47e797fd19e1aa42fcf7d7b08a1832ad13d7c08f1da80f612927d6ea7ea825ba91582df3d60b877428d883129448aa6a1a8846f91f9772b61cd819ba8488817d32b85f3e4827b464e3d1ca62b8d86045e467d770d3e781c5064851cc3268677d3407e6ad78d8027eb5c9da485877c3964d1773c6e7f80b9287481069b7c7d71e72d768671e38039e2f47c8737c1849a065e82acc70280fddad8898f09ac893398c088fd17828828f2fa8ff3a7b978bddbfd891bbcce7cd8a43685f421b5879893427abe2a5d7697bf85825123907933e4917512ad6c7efe17e689528444878994ab7dd2121686a3203218f9ccfbb539f89d83848054883afbea7bea82be837a784089d74359823632c07c7fc62489ba9b2b86aacbd77b6fef3787ddf98777f641ef79bf6031824e12818604e00ca3a529537affef3e821e12c889d10b2787e00a2c7a784ac0764444d9838b73ee81f4aa2a97f456c188aa1e7d789f49e37e23558979e30dd37d36d11778d02c98aa1cca728171e797839ed69f840b094e7c2efbb8805fd3ff8517a4d181051d8582ceb2c3800cfe9eae3e68e2814702ba7e21befd811b7f9383e9b1567e24925198062adda32dbbb07f51d0827d6122a880e0f14c850dfa87893da07f8314d4a184ff784e83bc277b7d83883109d35d4a8746c5a0792c44ad75dae83c7b9eb9a0825c7a1b7a5d52ce8506078986a9466684c7fcf1898c81f8824fb4347dd606fd81d8a42c8af1053179539681856a7dcf8dd362e41904e8497e9462097bc026c016948e1b8652962278811c51853e421278d9878688614d6086cd29d0821c21a97c8adcec7c6d87147671ce407bac0f55806881268f947260a23b13310b5edfd2a1c0c7f8940b8d7877b8c70b775a94d57fa43916770c1b2089645e357d593a168549cf977be181487c77cc1386e845a07535f2b68cc3f93d8f3201b17ac14abc8a8e117eb15ff74f93059ec07cd0aa487e5ed0d4894d0bfc8508db8380e04b67780134877ff9a5b77605c37786ff0130841ad252763105e8a7cdf2757929c75685b799a78a41b690a64996109aa444b7781e368c7c151c1476b3433378a7557c7dc6249381bb4f0d7e01e8c384f2d645887c0fc07c865f978c4b78dd89d64e48a8f454d57ddbf32d96a030748c39814a86ace04b8015be4b7eb8fde777fb7df485a3973f81e1881f89a6ba96887bfded79b98d907d9993f17ac0a40595b5684078cf95c1a99852d1ac70f49fa4fb34fe9073a422856b26b07974203a7613ea107f83cc6088d6e2587dc16a4c80414cba885367f67e9707a4890619d8850c673880f670ad8be94c86962f2c84a966d482915be34883e82c40784062b17e5ee96e76f09d1b8650b0cc7b4784d3877a25967d8c441d7df761db7f97a93080897025826283207be7378684332cfd7e206f437a63498e87e99f8375b4f75189bf8b8b7be32af98687c08479b7aef885f88c6b7d8f846f7bb3e9da7fe558957f0009dc8643a96c7e9b148879dbc08a8215ff388aaa42dd7f4a5ff0811ff1f5818e06e47ac8cd4a86f6eeee82aa30b87abdf8cb8432542b87761f5d86f3b5f486b23c8077ee9ac2777d4ca1751ab2a078171f08853d0527878355ec8757913e781726a784ea9b1c7e45db0980bfba027771e0358258eb2e89aaa7b47f5db73d8a47802a7e321e8879cd346383673d8e7ac4b55884a2772188b2a1717e6976c180ae9b567859579c761d69ee7556b9cb7c9bcc00847e071c82ac50d27a3433ac7948af2d881523bf894b91237b1a1e3c852750dc82ee23dc7840452f7e8cb0057b6d34a688a7f0a275f08be77df90aca76059f577c7397527c7d94e488f744fb83783fed85d5939b8708c94688cfb55b87f8686577fd51968287f6f77f337fbe86165543771acbf4779a06947deba203803e013b8a49172984a08d288449cf7d851a308c8172891783a59ab7898231ee7b1d704d848613c57ef62f6b81dcfd4f8026b9d276339c607d0b676a83f0d3d784e1acfc795372c67f94212d875410a28113cda37a1ad69d85a7d3d47ab6e8107627012f8823792085b2c5b689fe4230843eaee281838b5c7c92a70687ec03157bee18507a9a351d8019295b81ca605a7d1004fa819dab4179e63b4178def95b83a56493860e428676c7480081dc339c7f00feb180301bc287f90a0378d8c1e17a6993787ebc03b389350030881cb133894851ac754fe3c9757a3bce77bb5ac287ec6f8c823ae93f7c3e78068122c5217cfa0680878cf8e678ead59586af858e76f8fc64824caa7889d3a99581f55e177d90c1ee85430ef689c81cb975e0b45e7ef2e8f1820350b67a2d52c081925437839935b97f93ae69818a7e838367fc8384b5e10477daf33b87a7c180893f7f5b8100a4f081c6bf058280f88b85273e0b7f0f374584dcc70782d2891d7f00ab0b7f1e19ad813f50de75676c0f7db93a287f5e4e7583c117797af75a9e773e951688613b787bc217e47769ede279fc26547a405786859d4d487e9e54ac83ace08276357bf07c9d87be829271698a439ec77bef84018a124f4d88fbccb8778beaef890c879076ae2fe2885dff2a7aba41178a9b8b9689aacbe97de235658477559f819271118213ea9089aebfd081aead5a7ad987af758288d4891aef73819d8e8378a9c80579c0f0cc7805d523830a2a2c7b34aaa67d9c09937502cb4f8399110585a810cf7aa48c18812e3174836bd3ca81b4c8bf7ba55280851385bf7a23cc9c88e111248a3f7ff9836565b37b2886a389ad82808143d8d67b0fc02a7ded52378414f8ea85680a7c82021ef280d13ab77ecc26c478415e777595212b7637ea107fdf85e97da2d1d57877a85a8f054fd87817cc73785eacd181fd4d1e7ae8507c8608649675ab49ef753ed6a17d82594b8a75be6684e994417ed008b18982d7a68085346c75527dca7e4cfd827c925fb18a26fb9c7d83969e80d5c962781e2426808f9d187f1c7b6b81bd23737d36ad907c5ccd9b88c213bc7a2044cb7da30eb3848296f97a858edc7e66f5c1804dca5c97e631ac8383d3e9924d704e7be766177fc283e37e0940a081f5c3a577effb0f78d128dc7ef283a3849ff6ac768db7d7864141ba88f4fd0f85ae908783c86fdf7aea1d9976c06eac76d5395c7bff787578c2e8a180a0864e7b18d3047f8188748722b30178ddbcf278d68f468626d2a6818176b87618c81588a141c77d688c5799bc773b7706b86a762f8fd0795bd82a762766388564453c856c63237a9993867c28980d81e372fd82d659ef7c1d1de3817f0e7e7dd36cf77e48e5af80200a027c2b7ea4805127f67540e4ce77fd0900783fae4978ff664c801c57cb775701257d12f56581c313ff8387e42676cdc80a7e0541767dcfefb37c209eec7ab27d24874b3e52908b18f993d8534d932c7e948a6a2a6a81bce6f381587bb77d9feff67ebd766a7e14d49a88bf55a3791535c2888326787a68a97579943e53898613d986d8a4c189c1bdcc85633e9d80a826da754c1a851dfd44aef8d62ba41e5d0958f764995a18c37b007fb563ce7f82183f7a42d1b57d7f0edb788f604c89a6c53f83c6f508863d712182a796a8b87bfc419c5c4d928c461498b3c64e467df0f00577cbb3bd7cf9b0af84652f06779b180e7630af657d3e83c487f88c648321596d777838ed8534b14086f6483682494d52a54b994fb14cdf889674ed6fe45cd01677fac9c77cdae8f77eb63b028737324d82d2775d7bfb0d5d7ce1a574786c8be787446fbe7dd4cdba808b3d3e7f6f081176c736929aec6cdb931c365da2f60b657a63e42f894e61fd7ffa064277e70c1080eba22c7eaff558792e18c983a481be75246e828625a70d7787dd30804b1a267b30c8b7907cb36899915363b8a8da7c832c2e1c881eeaeb78400f5279d4a987769820c27d35d5827d56787d7d35e7d0838aee81787bf6f485b379f08946ba9e85f36d258811ad0cb5713fe3b036c48f803b9dee809a182a7ef8bbb47a816fa786238b207b02837b866815257d73f59f7c2c27247a456f3f8a7df9bd7a65d5ae7c446817839bde42b42288a1ae2704c77caf078d7b2ee94780d796e57625ec0d828d2e037ae850fb8070577a87aa8a7f88b9a6d080448c2a77e563cc89ce9c0e79f6a63779b5abe08996362dab3a1b5295f3a0c788b0816586d5b7c7830c990c78718d2d7ab1520c7945c9ee76279178835aadc77e936d187b67e3087a32c44e7ec7d1317758fd8d7c7db13a9d7462d78fddc781813ad7a88792a79383b4fea2758dc2c989eb612b78cda49f880c754177d7a15284f6e3418453794d7fe8624288e2fbbb792480f88789534188638656a9a84e11e2c2212b82fac52c83c91c0177bc320c81463c8a83a6d73f848fa8f3827ef5c586fee8e884bae36783cb26f87d28fd03897ee3f78490229887bbc6f09981c9e595298684870f9102839f9c44890022577c7403908286427e86c83960881696aa8591a06683b7b5f18627b56288c3c7a28517f01f898dbed87729f9d37fd8d3af9a36f8527b9f8ac97fa81b897950df3377dc74ff7d172686884b2c5e7ce34ea786a10be987fb8b28814606588577141781d0ceb5780080dc7b35b8089af50605a632ae6380b113b9841f448b7c53af8e82629c8e7b6d462c84b529f8853fa33e81f3541a7d5da56888347b008ad8f76f797a7175779db675760aa19a88e6fa9187b1590baab17eb086d71fb08185b2638ab04017856421707e37d805881cb15d88724ffa759038b588f69ba18984bddd7b47cc747938328d8319a72d7e1ae8ad862912c98eb6d158a54eb704887212bc76e02002850249b477f2f3da80020c547fa9222488c3b52c7c5b7edd815e06c4897fd88d7b30ecaf79f2faae8243c6a888761f9395281ded91edd4141ed0d5b978f28ecf8091ab527827aee97c6e424082b75bd187f7195d7c9a7df67ac230ce8419a0958948fe517f51c93877cbd7fe7fec03fd81652fc6882e1c87996f89b81c7afb5c7a5f31277e51b72685560c9a7f80e6cf7a86cbcc7cb64d1778f2c4f377c4eb0b83f3ae66890e01a978324d7d80597000884858f28894e06b6e7f37fc75b98dd887eae34880108d7b877db89d7722e2de869b79b580e99f9e822fd347852df4697514cd9d7fe032f18769db56862380f97f929572899eaeb77bb3670d85bded4318a4fda9827219bb87696b6f79f05cbd858a7e6d8901e84b76f7a2c97cda5fd17fbc7a1e8244d4ec8081234387b7494478ca6b05859607b68926aee289951d3d82e6b2a1769dab9f826582fa75eac33276de3abf77bf1f7a824bd2867eee2a257e93912887daa739834ffce37db83364850947b6875cd437897c1d8d7fa90cc4855ef0627bc0e5568409ac0d7fea82ce85b07afd7eff01eb78a8802189e84568772ccd0c80b2060e7fc271587d5343288876315283a33df2894dad79822b0e6e80b9b1dca037593b873416db7a3e4db47f87d20c89e8ce2aaf8d2b4d87b39d3f7908f86678bf43fe821016298197ea5188eadc098aeff09e7b3ee8858894b85f7d11b12c782ef4e396200a39180823cc7dd0a3477c6ad73278c7c6d4ee5bf2d17fcd6a4382b4c84583ab5b6581b8d90a7d0d46737e1dd5007aa0083076bdf83a7b62a7228138a59679ac983ba1759f3791f434af93ec47b7156889baedb06e6a8c964b139ff953427a3de10f7917afb4882cc93682cec40c7da128338a331abb76fc26618946cc1588e546a6877ff118a6a39c919a6e8d7598e435f3adadf59f9050ddb694d615" + }, + { + "receipt": "{\"profile\":\"wai.video.int_motion/receipt\",\"codestream_hash\":\"277865b574029f700f4fac023de3ab06ae598ee6f8ed726444e91442a6bd59e9\",\"clip_hash\":\"3492566e8e2682e3b3bac083b4db02ef8eba9a7f15d9faf0e27feee0f6eb488c\",\"h\":48,\"w\":48,\"frames\":[\"e1d8e8f8b5c534be1421e5858ed9137808ddb849bdff2bf397beb32568d8eb69\",\"ae7214babf5bbd6ec279434740f3271be43d2392b8167813fa557b5c4426fa14\",\"b3ef86db27b82d303bc6b612cb224ad55259b4f2e2c0461c74dcce188cd64b99\",\"3906f91010bf1b9ca14f6e2ac9b499589ac02ff4465e1d9764a22443a8b29c22\",\"bedb1538c2071d705d2d3ab2df2c569ffed440278494649f9bf1ec881561c519\"],\"merkle_root\":\"0f3fe4aa201c275c10289c22f31e7211b555627b33a251bbe33d094abada6508\",\"work_pixel_ops\":34560,\"joules_micro\":0,\"uj_per_kilopixel_op\":null,\"energy_provenance\":null,\"parent_receipt_hash\":null,\"signer_pubkey\":\"4a29b9b42b4c7b8d947b226d503cfa1ee8b69a5cd3e4cb88b30db023d6d2bb8c\",\"signer_id\":\"did:example:sink/job-3001\",\"sig\":\"74b028a210394b24c9ae318db1a5385801a1abfa5ec78fd334b839eea33d62a162b80931771258ec06e78fad127f2a2a822d3cc6c5d92be39fafb646a7cc3604\",\"receipt_hash\":\"9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae\"}", + "codestream": "57495631010100000500000030000000300000000800000006000000d5ffffff590000000000000004000000090000000f000000160000001e00000028000000330000004100000051000000640000007a00000094000000b3000000d8000000030100003601000073010000bb0100001002000074020000ea020000750300001a040000dd040000c3050000d2060000130800008e0900004e0b00005f0d0000d00f0000b21200001a160000201a0000e11e00007e240000202b0000f6320000383c00002747000012540000556300005c750000a38a0000aa9c0000edab0000d8b80000c7c3000009cd0000dfd4000081db00001ee10000dfe50000e5e900004ded00002ff00000a0f20000b1f4000071f60000ecf700002df900003cfa000022fb0000e5fb00008afc000015fd00008bfd0000effd000044fe00008cfe0000c9fe0000fcfe000027ff00004cff00006bff000085ff00009bff0000aeff0000beff0000ccff0000d7ff0000e1ff0000e9ff0000f0ff0000f6ff0000fbff0000ffff00000000010000000000feff0100ffff01000000000000000000000000000200fdfffbfffbfffcfffbfffdfffbff00000000000000000300fdfffbfffbfffbfffbfffcfffbfffffffbff000000000100fffffdfffbfffbfffbfffbfffbff00000000000000000000000000000000fcfffdfffbfffcff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0400fbff0400fcfffbff0100000000000000feff02000500fbfffbfffbfffbfffbfffdfffbff00000000ffff01000500fcfffefffbfffbfffbfffbfffbff000000000000000000000000fdfffbfffcfffbfffbfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdff0200fcff0300000000000000000000000000fbfffcfffbfffbfffcfffbfffffffdff00000000000000000500fbfffbfffbfffbfffbfffffffbff00000000000000000300fefffdfffbfffbfffbfffbfffbff000000000000000000000000fdfffdfffcfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0200fbff0400ffff010000000000000000000300fefffbfffbfffbfffcff0100feff00000000000000000100fffffffffbfffbfffbfffbfffbff00000000000000000000000001000000fdfffcfffbfffbff74420000280b35593c000000a214bea9451501b9ad0cbdbd9a309164812c7ece531911d14717c3dbbc1d27782217989f7218f20d121d7bd4ca1f3eb3ef1f71131429e2d1f626c3e7ab249c33af4fe2d2c042a6d2222fb9b3c460c33836571567e55a40c90777634123135bfb8e1357858f0dfd6cd3316844ae2fdb041518b067b9167f09231b1d6f1c16b7df311ea6450d1ea29eed1ecc320c2b747de0206b34c82a708a2525b67967473d53e643c54f6f2f42e6355aaafd6534aabbdf5fe1a866406fac26314f6ad812ef006e0dd2c39e124439f5306ba6e0396f65ff1627ef771e0071f21b088eae1efd0a7d22d53ada205042fa23135ba627dfdecc3c473a7353bf1ea7435671e53209bdc9581998ef568e94f260c2af006595d31a5d0301d30b0e96f22e27c43d162997a218be088f12dc9d0915dff4db17246c1a3c61066e3807ec553cb509743e78e21d250c19332ef30e3d2d4f94a0275d0ead4e59f7ff403f44c02ed1b145563b075b55c0ece2599ea8038a52c4e77287a40b3015595e178405f01716799f12508739158ce39537c6364439c2c61335c774823feb0e4a46484b29464146093e52ba6e2e3e5a0631121b992d5a46a848c8478e518c794638949ff05b4c57d23967cc4b57d3bb164147bebb2f4cd1452f40e1701817cec818f564ff13f4072317feda4f17504f253558977544d057484615df8028fbee312a5a55ed2c1c72d1257130d62be71dda51a0a97748680d2735181dc85721d3923f8d192f8794fcc96be998eb135e56840f812d952b26dc2f2f8537db1701de931a9e0b811c99606b1d7a72b81fe6796623b2e3442266abe726bfe71c26713b582970ff964812b3a7511b88474ad1a39d60fe77fb5b93faa43aa689e37f22cf656dcdde8d4a529b091869c19a199bf5af108ce21a33eb8ae43a8485f63a7c0ae7f3e9d6d3fbf35320f44e2572fb823070f38da5d5fb4cd37f3e167531443d7027341943de2d2e0dbe4918ce0f53b1e5a7368b2c3c6ff4ff9044663d54810e945168c3b1d019852e9412c0563e10ce0287359612c8365ce0fd34c5cdb9f290f0e017571aaef2f889ca179debd4f3065bae18380425f4d7c9dd18bb2cf626ea6faa24e3f4384b1da15a3d6df8b52cc90b935da2e4c23b9597355cee7f1945393e249b7b14ad729ff91432962e6218224895175df6f11b30546af34ef81f1840d4b4f24290fa19e90d41f3792fbd17b307eff2702189161f1552f429b1fc18154682320160642d6a8c304b9a74645336beb060762fd36780e26160b5380e4500bf316ab3b6594b76993031ace92b2efad9cb178983121b9d4845f4ba36071a9d404af3f9d4f2199f14cff37ed44717baad75f448628d19af3421f46a8b0f19184461f3ef7bc1178d00634bcf58624c6725ac619927f15545490f360e0fb877c6814c6b9ea2f952ccf3a3abad91da10ef63f3144a0f23340223ff35814709f4d3516c16e5bb75f3a3574719c25228f4b5a03e1636db84f49a58781762e821f35742a2181bc2f7f397ef311637054630ad43d250643a45395291b55b725ae5723bdd1b62eae7a445bd65319f19c63568c61a5b1206b34d3bed1dd63786de01f49a49affb2a9cebf3518ed9fb7f061bf402f2bdfb0bb9c0f344eaa4fb1bb58df3fb10a4fb6bcbb8f3bb45a0fbfbd11ef477204efb6ff5815087d668629a2a0c5d17e9236a698d0061d79fdb460b2f26a9c24f33529ee32911b3aa1515876dab37a91b8339f13feff22ac0af17a839caf36b8b36183cace0f27ca7e419927205f46713bd1740d4a5f49da36019a6baa1f4ceac2c19b530c1f2eaf4de19c6322751ef91df5b92e05f6533f2a760db246a7d1551e266a304d149e19ef5ab9b67c917279abc17e5eb69fbf214f2182014b4fb9ffe3e163705e1fba23dfe17e466a2fb4cd37c16dcc16ffbaaa6f61663923efb92173218345ca6fb512703175f6a95fb422b751962216358fc9aad68a047125962cd87430577849addf21174af2dc5499c4fcf8778b8293377e4ed3b12154cf3afbf46fb6ab6baf3dc41b0fb4cbe91f32c0b39fb2ef0f3f2262a42fbe21813f3cd5230fb476af8f3870f92fbefea62f47a7a92fb7234cdf297d11f5d8e12023c55bf666f4ef6005c8d58bc9549953d730699fd4ff8264fb23cf0ac1886051a1c4d05891af4edc2fbf792baf24163bdfbe896c3f32f65e3fb6023ebf2ca07d7fb66774bf4993ad1fbd99a01f30be2a6fbd34630f3275768fb7ef1a1f2f78972fbe65735554ebaa9390610c05a5315734087513d8c09862074f653884a096d36bad118d01b4762691789a9a4fb84456418eb0ca3fb4aa9b419eedf99fb865a481883a740fbccb302171e6b31fbdcc4a318d918a3fb2772ae179e15aefb5dcf1b17b3873ffb7673f4189ca65c5d080bdc43f1e1b278e9bbf0411aed639db279b76db39473596dd293164dfc0317fddbabfb866f2cf49fee5afb376ea4f3351975fb9baa96f394a45afbd65b6bf333ddaffb9de9fdf212c3d7fbeeead4f2262aa9fbf329a1f4fa10ccfbaee586f41f6791fbe442375aab92fb3ebf0cd287434e9d6e5b5143a22f6941660f17d858c6629c18cba73c167536ce1e8e78a81944d168f419b32118417e79f37ee3a4168ea062f3684ff8160f7514f3d3335e16d0c984f4e44f5716db178bf3f1e44f1765e6d5f39b589417ffd4263cb1b60b56568bf7410b9931975f374f710f5c7f4fa42325bcbf1b8b7648524f17d3a2bc1d17f181fb389846f3eaf47dfb8dede9f2ef7b22fb6cb646f4429fd8fb1ab5a5f4cd8e2ffb7dc74ef4164ac2fb955678f3aea1abfb511264f4825bd7fb2cdbf5f268318f5c44110177dd73146b7a24ef4d9557b1ac71c8ac855c5302606910468a110d2833d76a203d85cc1c16f25d02f36cc7671902a893f3c335ff186fdffbf23bdcd317eae2b3f3dfb9001a3c8153f3a8edd118ccf62bf491591a17bed596f344cc8916cbf73c423ef6c45d15bc03651b1912a83850df6979ba2a6292c2eebd5d91e87574332d1ec8640e210884defb523cdff2811f84fb900283f397e066fbb5636bf4b5af3afbe896e9f2ed4ea3fbaabb7cf42cfc51fb744940f4fc3dc7fb444010f3ebf46cfb40019ff4ba45685818c3743cc9991ca49c3d626e6cdb6d54ca28d67ab141e2599329871efca9c71b6444e22057e352f45dd8b917feaa52f42bfc1119743121f3694f9818db6c99f3d79c4618989917f426394b16467b0df3b1fb8f19521d21f48db4ca175a186e3dbffda754ced3533d92a3eea77ad2e668dd293056741d36bf0ff6d877943fff1c5c2be22145ecd620c546c1f3241b6b1627e58ef43e187e1951f342f42ab1b917ec3602f4f8a719192312a0f21e3ac51704a731f4981c4f168ba270f48c969c181fea6d40d92c977aaa69c464c1fe0b4fe4ac6e6dca35ef5f6aa19dc29fe940765b492821c377c822552bbe2132b22720a4a99cfbe66ccb18874f90fb5de48618e3bcc8fb7a9dfc174fca80fb033b2e19226885fb5cbaa018cf7481fb4bbe3b1690f45071cf3b545fc7dc4c460fb904a5f494e4710bb28c59b37201bc93c3b85cedf29ed26f8cac231756f41e282b6e208e484d416f57f1f2d56f3617c0a984f402e336196a0dacf401f23a182db681f4e431cd161e6be5f31d3a03177b0239f33755483d85c9d2624864d23f6bb7c5a69c7e2164d4f8ed6167d7fdbd05c2405ff28607d169ffc3238fcc5423c78c9346c614a93f473a2b17750683fbeed5a017f40664fb11227117579a43fbf768d91957ef44fb4994591639592ffb3898db867e356462c5292e4270ba30a3145c994dc63817c2b506ff790c88855f7484a1d36b3cb022b49dc01f39897e3db627e7453b7eaa47ee9c181a325d08f3aea14718447cc5f3ce9d6d187dabeef346352a168c4c9bf38ff00e189a54f0817d9e5867e164264acf9f89a0468af5865b1d0f5d44650780f7a37565a8f4c0ceb96346217425be3f42ddfb460186a443dc4f4f39e726fd2e11ac22fba65269162b0d79fbccdde017447c95fbeeead617a64c9a609f26b64105687099d3e8f96edd6e714832a030810d602862a462e0c908e95486467e4f657a255646fefc1b3d6612ce46f05c183a0aa2e63122e07a4fe77fc847dfdb81f4981cdd5a7e25095e2496ff7c0d982d61f1b45a40c98a5da72c8cd36f9bae985ea04c49826f6e0159848c46d189116c7425229a29dca5753180914230f7d87f2cd1e2294a23bd653c8f2c033180eb015dc4796a35ffb37e5d2a91a83e040b6f9551375c7318d897491c79c9bfd5a26b563d7258cbb89e8e7b06429a6fdbbb519019578d2cf852092d88bd0f2a78859a2f1ffe22519dd8cb507fba725b0e80ca5d8ed18c6087f6007e90e4ac6bd0224e504285c6ad5e2a4885c47c8e5608003a80cdac406c2de6e9d9c33b3d881826ea313c35a52f98773329023e2e2f644eed4c9fd91548d5819c5845a9c356a9e281411746cb75d8b9686bb07213513a6827af9e2d2582d3aaee5d0a1e1582463d496d83be81d6d0003b8586b2b42e814ecb2eb4b31b288dd08d4a6d71253f6f90872d7f2ee65a725a8f582404ef5c515ac37806644d66e187784bf25f74a43c7dd98747933f580caf12c97de8796af508f6ce38d753833fa7e3df673b922672b38b4a3750af52b2e56f46a293d2301edf675a87c40637fa24ff5de154a43f0bf38b907403487346618150454a15be8935547faf98945cf4502f7649b7fb6993be0d924ba7e87e5c44373d6a05774e1f29b0405671ec2d2912145352a9f45d41c46d625518ce670cea41617a3a074385e691abd1d9156a1d614d5fb54f097d82d80c614b6b92cfc8bbf18ecd7c70d5e7049d93d1e01d3208d0df28de97dd2f92b2384b83a3414fd99c8754c10b9e5dd1be2056f367ff898dec986d36884b48e0487aa87651128106a3085ec747b37f462bcf65f40a63d5ef3e7f7cceecdee0471af487ef9a024980f7d83f5964932f413bab5da896195fea92a65bb5e08a7a9bd68e57b2e1444310b9ef9f9b1b0772aea0435d832578761abacc584d3588cdec05e37241fdd2de96b2b67eb007b4e5f9d4ef2a8742af5235a45147c3cab7323fd344569e919373f12bd5554e858d3c3b21c295a1d79c4a4fb2a7b79f3ab4817fe0416134b576cce565e369d8770ed9c2924f8be0dfa9dd680fe77af006c4499b2cf442c3a8c83284915263e978a0343afd905502056046dc7ab6773c132468e7578f4cfde095720b8e785a720e4bc40228f788b0f27669314a5f931b46bd7903017f8e10890fe23b330b2f9651075346d3114f7bd0563a61aa2b540a0abd34d4772278bec85e703c9d214d3cb2b767c686f94e8433cfbe3fab6a77d952576510c5cc764230fd772df1fee062380a787e5e1da520a88c3e08b7c330d28d614ff959b861ecc7795fe87c22712ae536609e6bee407518e19d641c5b653da09e59b8800e89d17848545190aad2538d869bd717dbd8356a67798d9ec5e38da75c9caf09b6ab547b3941643edf2f02e64254d50e36362c41616048da6c425bf9318c40ad18669821964ec7cbd2b8714e8f5dc27626caff71a47bf64d476ce899f18c24556f7820202b9b3fc5f4e77ac5be8c1bd2e3492682645389b4b359578edf64a5a823571c07547829153e647579c44813fa75b8937cd5797249dd5803ee0386f9cab266917789d973c3c989dff5e0de1a65817d238899a57e9e48eb67c3d0321d4dee57cc778c5525bf8f542e90828a8b72085cd25067411b57e1a7d11a4f67da559757ad36fbb9f6f3c55cf6723acf5d58348dc055fce03fd929925ba3f6e40db6df8f0358c8a335945849649d783b52b0006124cf4042c3f16a854dd4a7672206614e215921735710d162219312c171da4b7649882772eb6ac18293790f8a6ad0eb8a98988789622911a626f368e825d45f92441e6949bc1b3e57a98a2136eda230713b4b6c6175aa129315646973336e21535ebbb8b8a549687da77a9c603751abd14723da67adc45dd8ecffb37995aabce4d743db9059e992aa435f87ebf2069785b20d1282e032f87ec90a5977b5b6eb7ce5e14e76816f6d8aa2a99d88a41cda754a8eed7955bdc677bda57b7c9308d8853619ea8795f972807be4487ad3c6ba8177c1897f6ea77077cd107d7b0c6eb9775068bd82b5994983546a8b789ca4fc7e30fe328a23afde89fc09b97d0dc4b878a796bc885f381176c0dedd7c3009868708763778074f1483b056e47b2d2e6f775e060d80613be47905e3c28197a2b2867f2087840da05978d324ca77d0d2c3838b448282d320027d0815b57a46e25386e546797aea5eba75c4748a77a68fe6769eb2d488d27ee978dcf669752152f679d5d4447e23d3767a076168784a958b79e1e6cb7e174abe7e0952b07a7e773b7e902dfe83891d937b603f948047799278c0e56181423661814ddcad7e50682c7bd2708e8791bd117bd3ad5d764ab9e9851e6116883d29db86051203825f38767ecf081c7edad64780ccc1007a419fa88156cbfb8877f0068a366cf17ab74967805410d1775c0ec084f283567a15ff0480a7bab185479db782a0e0027c86b9e58487498f89cbd316877cf25b801767548ac2714878a7a81c89caa1d885c0633589a0289b7edbef3e82b44ae88619e8d979c7e36585e1ac7d81e3dea681258e21841709f6844a668580588df77ba9ec97766b4321899d7c8f84f0b64b880840f485a1533d851767a57d4a544c83b06ffa7dc8b02f8747de5c7fbfcc1387f25f5a8a96d15289712fee8898a5408dfef27fb1fe337a96b4d9119e22eb87a7befdb497371c3793e2cc0aac6839ae8fdf2214934812e67a0fae55765e185b83fc9293793110d187dcce0e868708c67c2d76639bf921f880fcbef0956f67119f67b9559a35d5fb9b7c1ecc997a8cb6b78d5cf38c291b8a8b95baa28623c1f77ac0c1d18300ec467e9c6e94869bba197d07b41b8215ed717c33a3518a2a69078e6c91f6ad16430393da5506a55aa5d0037315fafc42ea2304936366d8c6a231a413a65288914a4878fdecb7772cc2ad83e9a63a83e6830079d593e17e3d6ab47b4116c192d8e6c68cfe19c9af3ec9c39005755d013a19f177bd9ea67a4d820f7a4e487c042afd998ae5808088048d1c7cc641628a98e6237ed84a2e7b4c74f67ceebe667d388172975a9ae8afa684c0785fc93092ba7ee176bb07db75b140997b504ba975669b2c865791fb8b03a2327b42ee2879af368c80edb7ac827a8a198220b7b9783bfb7779379079828ed03eb60c7aed938ef44a98ff16557824090280d15731762a53287703a3b77fe63bd287bed734819a8f2080aac48c8253cc6a75084b27795ed0db7599b7f18705651188868021a7a69f5eb33e38d97dc4fd1985411d5076c1516a76d8de15829ba8e8861fdc0f88aa783f7b9aac607cc4b52478d9b68f7d03c7a57974203779ea94e0764e1d8f9d8ac846a5eb023c84085245853201b782e10ac287e06f07774edcdb8465e7e67b4f201381f6363f8327e4cc7f49584576e49dec82aad62b849a18e57ddab9dfa1dfa972a6a2b7127f6d3b3278c7a2f881f0af98824535538250c2998900cf9b88288d2778e3a5a29607b80c8af1e1f989ebb4ae7dd81bfe750a478a76390a5b7b16d7b9993e2d42cf578d667a5a367b78e9f23b7b6d993680088c68756815f1891602298a214723abf3ed7f8f93785d8a60b62d7f9eb218890b14197c055eff793efab48717d3f3b1cef2697a0b0daf7db98d5c89fd22457b7ea64a823c2d0d7cbbea0f763d9900fbcd7c0993dd268a901da4f37cdd3adc772d0a257608a94f6af2ecfe8990c841a548ad0f0355bd0b81c8cd508356dde386276d8987e4c8a17eae24597cac2c9685aa9cc780e78af9a7128b35a7e9e43f76e95770804540f4893590636813988480ba2f139c9f0c55cf83ba19860744d489391892880cfe0388f03fa186e898e57bdd04e379cba8b8fab785aa7d307981941cf013891e2b397be66ac778effb7b751ce013894acb3e846196ee03de219d897ead1781e16f55890797767732717b7de9e02981710be977bbb463fcf62c2695d6343a977160de77eb897f7530e5f883ab1320711d583f8542c6327aa93f847c26e8ae8708649b7e8188db85b068b58886efc983bb205d897fa99c8468f85ef91cde28a52f53e29aed1c0d7f8d8119889b02c485d946ab664e23bf880482d580c720ae03112885d3da3ef5804946a079c54cd5818cf8d489cd3b628376f4f882b02727872cc97d22c71cbb9c815fe9843299d185b9f9268620db128aaa5432880e540f7cb833b28a1d5a6dd08ba32078d731a87a3e5420770bf03f8511f95e7a99760a8607a9747f5599b1fab4e9db81987a0e879b025b7c8d6f6978d1bc797d09ed717cc600de87c2131b8498b4da03fa05068478a4b287491ec17eaf7e0c897045e87ea6f48782d212087c4ae8261d0f6f8a88c0755084709f6979ab8ade7818d3fd752beacb841a37c8786bccc77c149311847b83808ad929b8893b3819847bd2c27b19348181d8928287ace0be81a2481c1b8b644980cf780f771cc794839d461e7a85872d8038e63b7e25abcd8744d4f87b76233aa0aa52ebd7dcf395882d352a8351529c88f9ed62882f1b3d8a2e67d87b6dfe6bf8af405a83b1c9a7781e89ca76b46e807b4dd55f83761f5e88a1414e8af230b1851248a69d78bd977f239dc87a30b68d7f59940889c67e1177fd92fd861dee88864cb1591be244838471e77587929508875f678889cfd22b885a6c6081052f387e616a7a95bd77bbb1b62c138a067367797a4de184bef4d981d4d4f285ee3ca07ddad63c7a8003257fe6a788793612258267cd397e8529538850e641762ba213796a18c57ed784b7a52fd508a5ff20d6869efabf75d4df5f8a0e37078a9a432585d194c478d9b3b2786337658a8ca57d878c9eac7a19cf377e01f38482fee8c97926b98085796ae89e949cc590dc73e87d162af77c02e8088786b96a808534d2869636ba7c3117c086a46f587ac74f0e7ad36cd0806677b183ef845e870b1448822f4aa087dbd2be7aca2314810d587d869815da803de1e7855f800b850d17f47e7a1e32f90724a69a3f96087f43ea127b6a182a7bfd348b830732597c4f97457bcdbd9182687a998096417287ac455787b3a8cc8246a11e03b6260486f3a3837effe43b89e505de9b95289f9334b3ab840b670f7df76c63884d12b084dc574579ebb4018104286881d85c12861f1510767af346872d88fb86b01c9176e2bb40dccaa58cfa8517f60409c52a9ecaebf394ed2204a1499d827e71164f818c8ce57bf993528a8dff547c5a128f78fdab6e8acf492e82caa1737939ff837903492c9e15b105837ccb6c96d364cea13718beab45cc63a4dbb267872ee9ba80433d0f89b982877b7aa0437c178bc57cc9db49812ee96d839b96ec7f3087a979a9fe4f8942f577a8b8aa46a5009723940ef30e8fdd242eaf54b30298a5b8d579ef96f8844b5bf77d5e8fd989c2dd558aa5f488833c105b7734aa5889366c7f787df91d806ecb87859e787d9079ff13a63b6b2a8b01851c8c0015a1a35783748ad81b147ec9a56b894303be88adf98775b82cea775b4f787ba9ec7675b3313d7e4d8de588bcf81d8969f4238d5e69be94a58fecaa4121839ae315a69706ddf68a3c56d97b031a4487a743597a04bca87a08df6284aa30628a2da15488948dab86f283667e2ded9e895a7ef0864a1ece89683dfe7946884da33af14bac9579888c54d36097cbe562899b6efe818e3cda7c6f139b800d6a0c842c6fd87c625ffc79621e5084fe4da9803ad79080c31a237694b56d762587fe7576d051879db28578da6af183a7ba867b838b1388eb4f7384144be37e35e7437bd647c37642b8047bac91fd8509359281e07abc84e38bcd7b2ef4177e16d7e4829677b57b6a3c1c86ffaeea7554a4c381e629cd76f4b5647af3c05781599421804f32568846ba047bf5f23485aa42797d24c8e1823a8f7d7ef5c3137cb9f9f17d9b79c5771320817ec486607559163f8aad94d487d96a8478604ae689faf40f884899338a71ca6f8052b3ca7934c7b279ef72b6833c2dcf87157d32833183f87e41530f850d5f2f7f6271647a08dfcc76e52240864fd8967f99ff6c81e8509d75436ca985506f117690e56b82115360820063ec842f79887b035b9e81b91d167da253ea76c2179082a27e977eeebe1482cc8030886afb707ce3c56a868b4f457870aa77776ea76c77fd1b65780504aa7812bf8d87f5700f7f4a42167a2d9aa485e8eba27a02a7f98750398e754c7f1c887ba3f17f01a0b27dcbba247c8da525856b67a37ac57b168437f122843eef50897e485d7de3cc4683d97ca77da1c35f7b1e65eb79f4b56a88bc1597889e305e7b62cb8975661d3d7e1b6dd27fe8bc4079c2f3808adaa7f8865c81887f9797c6852b613681a2003e7ca021df7d2683247de48b3d806d107e75b2c9a0758575197e3457fb84c129f88193ae7b80eb7e668391225c87e994eb86a62a357d2003e5822c5d6989eb3d3d89e4e5fb82447a8c7eab8af6799e71b775277fe87aca187d82215976893f7f4277bcbb3d7aeab82e82a4b01789650b0179d29442896852507cef31227c8015c47a1ebf568a159a7d7d797c5080c1995f7b5cdfcf7e7743fc81c01b817e6dfeb0770e1e5479b355ae7be5cf2d8905addf7b8d5d8e83f57b35834e903f77ed5de57da439b5794eca49779e6a8d7f03743b88c0da998279b2597da81b237ca9466478589160773815fa845326708352a80576e0dfed75c23b5d863773717622b332872989b17f3d4d2a786f7f6586858e6981eb61547e87ae438220d4b781ca47f88066367f77171f6a88bd47c281d086d77c69edcb7881ed067b7a423b84e9e73d85d3a99788c01bc985b61e8d76b1b04178483ff5807d0b4b7ddf077f82ea658b811eb49c8866adfa7e3dc41d861bf6b97b1da66c8463379688ba6c5778bf607b82eed76178484af37837732a8261abaf7cfe95a67f144ba6784c62e087cae92979238bb68159c3217f4d16e97d58695287eda5f579b737557e8a4804765d5d4888738cf9790689308957215e8069a5c6889500347e88bc947e6cb65577c719ef8680d45c7d6f8aef86feb97182e5059a7b7b08898a5ff7cc7ae2be8b81c89ebd89ad77c57532305b85370ef17ad5c9d68482fba7880ffdf18283140b8a546afd7f4809617e5e7dd8788e9a0c83ce42227ada17358838520b785fcca87d83ccb57e3cec797c81ed177d3797b3796f6d557c59827e879f99c49d4094599d8f2e11a25021b88741121578fcf0f187ab6d9d86fe9540800201cb80da5f0f8072dce8867182408610c3e687b517098405940177a3c62f87a11de7a140c6518b772ffe90d0ff517a6337bc7a4731e884f009e481c9ff5d7e10aaaf85640f837a9ddae585f677827570a3df88fd176c7fb821e581e3141a880da01185b9c74d91a8d0adb5a830b98a98d596854b503a7f71f93979f199b87b576d82856732b6802081e17513731f86aa71de7bab9c0b7b9504b77dd33dc588c3081d8711a6d69ce9d132b70f581690eeb4c387ef1f3f891488ff850c6ad17f65c33c83fb556d7a7593da766c6ea289b8f2d4773175507ff665ba7b1b1a07889b55d5872eb3a3ad2635c08f9e5cb1abf8cd4880b438bd8207fc1880c7852a825ff03b799761ba7d45ff6e83f3c032836bd33c88f9528b7842413a8acd5f41791241c6797e00768626b90a94288aa1a5666113b2936c9e8674c93378bd4b018435dcbc896f86f58183f0878944c2787e8bc6a3800e95f28030ab2f84eff0738796e3f086a3bb4a787ab2db8e8605e8029dba41fc0fec099202a3146465e9e48541ca737910aaee828218f280c17cd777ba82bb7f86543685b164ef7c2ba9438786dd3a8a7b507f0163f5d885402166773f8ac7876b9d607ce33c1c7e19b2be8724cf6d7c03e4fc8980c2947b38276678a01a957f5b20d979fbb3b980449eb677a3f51a7f85875e977409adb1d85985923d3d9285a373648968b7367a99c2bf777a4d5e8bec6933b49ebb36866d3b2a857b913e801439228606bf4879af072c7846471082c4eb50792a9bacd048f7eaaf50a4298c43f866892c81747939ed307b3117b0807c33b579b10ac6ab76fefd84ed4008863e54757ee60c6c84d8e57b7d6f137d7befe98b81fc80327e5272b490077466a3fa75cc7bd93f9b809600d4816a061682318eb88537eacc9f21a31596839c47862c81877795452d83768f2486d13aef84288d59805cf1fc7da8802b7d5c2bd79efe2c8a7ba4035a8adce0c37c9689f17f1addd17ffb0d3d76923ba99a5f20aa87138ca276bc035f79cd58d37a36caff7de1d482802d1158980da6d278e6c8b2b0243f45784809ef7ebfcca47fc88c2e7670912e824b6d88813c80618ac0073991fe161885080abf80bf4366782a53be7d00c88f7c081ca67d279ca488d6e2fc838529d8da6786987e49e16a8672369b85ea9bab7632300484fc094a834564e5821320058750819d787050477ac7c6fc85a97c4c77ce05b385d731aa81ec7a6b7b21116d9f402da080b61ed37b640f807b9557458322ba2980bf02c67f26cbf57f844a31f92599597dcabe038254c80a7c11f9247eda30877de65f277dacaa7c751e2fb2862d35b4d8ab39677e7c740f822d9a4b8286fa6d88fb38668752b38b8981ac3286cae9891c02f27487ab62bb7a1fbbd7830cdae57b0009c67d972b7b7f732b0b8a8c270a7926b9557e26b965778754407bdb421988008793830761d8810386eb891e616e7dcdfeb21daf446f7f4d284f88033e8284a97cc4898d76f6794403cf75b181cc8384b694886398b385b1ed06868003e785b80f6c789337238259b1cf8602d2ab82d17b4076c8df6b76b19eec7db223cb7af598fb8416b355867f0e5387afea5e8336d12c79d8f7827d10ceb685f72b9b76943ec675625f6c7b8ed07d7bf0e51289590b7789512ae7f942a87d193bc3b7860cfe8b756a23c6798e6bac77e4c1b776f9a53082692e80857c69bd0294a0e67cb08c0388f86fa6869b434e7c16188e8164bc08860b8beb8269e2dd7fec151e79bc9e1880227d888822e976806f499c7e152e227e8bf5fe7c00c82481e898fade846be38140e0277b84f7417c4f07417e06246179c3130784a5407a7d9868321b0570a17582be397afa231e825cc2eb795e065278485135838804da8666c69177ecf1107f5355087c41e7a28673c63484afc6d57e43856c7d52fb6b813af4d0844c1f6f76d44f8783c1e17f7db42da482acf24e771cfd3281b546ac7526d60b8748fe1f983c79bc753462cc825ed78578bda51c8887083f82eb0eeb84495f067e0fe4491cabd286868a4831815475fd818f38ea777403c98871e7ef7ea3c6678512d81d865d110f8c34698d7554afad851fcdd8810c87aa7b7576bd87b58e8d783051d57750323d8688983780655e137f06774080977ead773b79897760af1f7ab713d97c320134a58490f57fc391ec771c748778eeed3a83d8e5cd7b0c1b317650397e751e2d439514250f8869f46e7e32011f7b923bd47f1415e87cca2ae676abd23088e0933786f3370faf90fc5c7a11700077b044bb7d6b67398893c04976bb6ce7844caacb8e90150b8a47387d87a7267a8092e8f383250cb87f92304877e0684c79be2311806aa14e90e6c4b184e8d9447a36415e7e985d2b781cce728a5505d084eb7edd94a0c6317d564da07d912216873720188445ffa3887be4cc850b4ac98349c4fd77b0035ab57743148037b193853c104580ad82d77514159f7eb4c19d8ad4e6aaa8f7030ab738f7d0840fe4f07f92831f80181bbd80af198a8857912a874cc3538aa3a9b184886909a28f67ac8db04c29208044f37b744b1d85543f9976bb1265857df9789baf534c97fb418d816624f780bb2b107f3e951479f5987581800a257985c88e7e6c757b7600a4c1a0b45b9c9448f01495730fb57c8b73cf849c925379f7070f94c5f476aef6b56c92385d8c87d66b3c89f469477c88869387e26060883f981786026df37e2a19ef88f051149ed7d571ab211d0696fa4b4c925b06cdf90b12b2acea4cd994d5f38fa9096b1baa1006b2833d1705846fd93c7608d46e834a25df80a5acbf794cb5a77e37326d8a1b3e6a75d1efd3932d0e509fdb5a679bdeb55f839591fa9214bbeeb30790b58de9e509994ae8207b4929a68874c20377692e2b81b23c58827e0750779f499b816087c97dc582d977e65fd27dfad0327dae652276a0e4e380c964e3814df92e81d70d058694216f790b798d810e953b86987a5c76f1631e7a3199107cecbb598a1b5000879416c67a433d1e807fa9d0788b7e6b7d6b1f6b80f450b3784ad6cb7e7f3d7789b09e05783ff6838450b7a67c10fd09819ea75b84483429889117d079eb12ff7a64ce877e86dd3a7e44c2e576c4e4c78992dd2184b41b1083ad8de681a2659884516b99797ea68b8a7c3a96812140577d7050d186273ea2868625a48003f62486497c2d88cde11c82c797597a68273a86fda03f7a72d19a8025cf8e85c3e48a868b3d3c8216a1b67b863b8c7b9eb9ee81410b977d9bde3c7bcb1f817ad4cd4283a743b689f40f92893852d2824564128963b528848678487e4cd9178a6b7933817714a683b4a4d1794593ff83b695d47e01c4fa7facb56682ef67a086e7080681fb67627f9dcf917c8438338385bd647cffdd427886d68784084b84788f721284ccc1ae804a8a5f76b0731179ec61a875d319af7742add57f49588b781ff5878382a1be75ad9fc286be0da075eab1bf8001057f821ebf5179a17bce7f95c3768523d345893eef997f9803a383b5587d7ea65984813428377ccb4377750e1eb88273b48686eb199e7d47431b837e5a8c76a2000e8217f7a989b529a2871d00c0889cab9b8092fa3982b886b4760832407b0732107918d3578636b48d81ad9fce7f8b4f658a51ac688904d5e378be8fcd7758862e7960512d88e2602684f06ed37ad84ad7875f38518621ac3d84c5f94f83c105c17efc6e887f88864f8349f38381003f2e7a1c0f90805953987e2d11df7a75b7c276c87a1d7633d23b83f3c07b7f271a99754485fd89ae19697fcf49c475db428f75355e16875ac6f27f986fb77704451081b5ab4f8199c9fb85ddd5ff815bcdc98699d0da7e40aa8478d7a8217de64da08891b21a7b6a4e477f162aa184ef848f7963e4ae7f55b2747ee8aae78113973e85bc15dd7d10eb9576c3541b853c511277f7e38d8129ee7c8277de3d8425f39989f3ae567b08c297791d942b7743eacb864c9f9581eaee987a2bfc8e89b6255189a1a604884780c6894f322383d6c503779d874487740ab27a1987977ecd05c47d9e42d37e9582c97e93a3827a8b07197b60807e88ec27cb89c33ed2779cf7a38491b29d87e8ce317c7606967c1cbc427ff2a0a4895ca50c84099aba75434fd6808ec5db790bbae582d59a267b2193377c198e02882392d9786ce58185cd223a764444b782d5ed938493f6fa88497cbb88a547368407df8277524747800ac52479c3ef9379b7ef637d0a7d448ae505fb85d2000b81f89e868a14eded78354c89764d69d6883a67ea761f730d7c1660c57e4b910c7f4265d77adf24907994d9e97d9790c1794b25d48978b6ca805ba2e27bc9e65c825d47877a0075ac86e4f7ef885260a5894e07c382873e7f7a765976775ddb657c9d6a5c867224b68795a61e8a8b32bc854df9c77e2bc6047b471f6c88dafa7576b252ba86dfb46f7752befd880ec0ba89b9c3e67b955e41806d104688ebeaee817da6207ebb5ae182a6f4a0802140548aa224798a7d8296828dffb27c268397866c75ac893ee4f184c092557816be177d6cf78b8489c31a7a8b90237e0af46883a3bb458803d91f7f9653b476079058880c6ad07ed731e88555f31a8873442379ff13398a14f8d9820ffd8f882093ef7c55feb27f2c15658a7e072788a4931b7b7afaf276a3bfcb7fe65f8b848b0e817c89f27c89ae2b6f7653721d7e3a842777da587b7e47a8b17d85eceb7e2451a7855fde4e78d14ceb786f37007e717006847899d67a8015b87736eefa797b3712870022057a8176d47c810a5b88fc1b51832ae3317c6844e189980a4f86a13a727f5a5a8779c873bb79335b6c7f58e0be819283c283f594d77c459a187c4f3dca88dac04689497cdb7571e07b76cc02387cb3de3e7e1d82c389e2b3d77e79e1c187681c76786295c77a50157483bd35367f2dbec389cbba5088dae83a7827781a7e48f7e084e31fb586c9359a77f83d0b7e02cb9a89ada61b7f89b1e87a67d88c7e6707427b99938e781946a582d18214818af57b892ff7ab7ee8989c83f05c297f6f49ac7b60c87b87f337348746433583d576bc75c06e6582276dbb7d4045f27f54ec7b8095e77f8111b8f19346d17daba9fa6da11cf467aa3859288f3cc3728b9eed0699dce1c498a94081abcc74dc93adc02d80a611e69689d47e76d8e5ef81f8df167bee356686fa47db8079296890fe180ca68ea14a8fd585aea5e57284b721d15690735e838c7fa9fc90139b619ebd8bbb885e595787155da79923dc97853e25f6867c169a89cd4d7d8155b2fb7ef283a7b6a01fc59039f30d8be3f2fcaa038f8c914e98bba90e3c390475cfe121366e6c9c95282d8c24ddfb76fcd3e8a12ce52f8a9e9c2b7dd731f887e5e10678796af378db30477dd29b5e91d6efb598e5c645a6c33d249705e638963a36d927ed7b3f7b468fde7fe61793872174c38c3c56c8806533e4946850c47de95ea0881d24437ecf66a68911ca7183257cf48036e333b14fed0a94b7f8369e40c24ab15e273afbf4242f7bc014267d0d46218697689281f3c0707d42369a96dd92ef8486a7e285868a19877702ab7e74c2ba75911089820964c58cc1bb5a8d0d6168ab7fe96395f8046584913b5e84dcbc9d7d691c4f781880ac7fa4270798fc66e48569596e7919b2f9850b92ac7fbf720d7f5d9a7475b3b304b5ae023e9c438c2ca7b54f16ae68e4fd8838b7e27e9bfb787efa2ae5838a890d7e50f8278074ddea87b8a32d8a8360f575be9a587cd02c0c7fb07aaf7fe7789076ac2c098d48130bb71a90919c94084e8ca2e23e82e93a1c8744d405766af43176f3135e8af881de871356c17b23c142a4336d307fe8ebea7646c51f7bbff01d762d648178ba9bac76c395cd88e8eb12057ce8bfdfa887df81df2b0b8a88218882fc269a7918b6a085ab2ca1813feb8f860249749eda88c17d924dfb855f5cae8124b6bd8722e96f79f4a3c37677f0507ba3a6290509290add8ea2a189b00a0c83699ad087dfcdd688bd35d082444b5381864d367773a2068d65335879d21dee7c9cd324817c45bd793abe9a874f689495c77f489a9d579b87bc5d58813cc8ad7b4385387c0e66b7818d118a7d66129b8af10519864c0458a4fb9f2586dd3a327a2bd82c8087913a76c34221860ecb6b77001bd794f5078d84332c2a7b60e553865d064881db78b57dc3e43185337fb481f4b58376b372c08951e20a857ead35856815ff87070e4e8afdc4007de575328529774a79921e897d22a158fa6e65bb79c5579677223ce77887ef4a8381acdc861a660d851bf6ad8548a4ac16a756c877f57b6a7858b56a879a0d6186631a0281c6bf6a87194d5c8932e4969bfa8ccbf9895f23810a3cf07f65286c78f45bbc7524f7aa84178bd07e3f08cf83d9ab8fa3c8e08576fc02a08a8bcd767df2d64f85af6114827e7ee886805d0476e6a01e83358240fc52a107896e9cf08443329d7538f1f7777befdb8471d5da79adc3ef7bb534d317d69949a6c15000822b97cf78ba65ae790bafbd89fd4d7388d731618871772b831631ba7fbe213a7d233828890a8baf80122b39868a89188a677a57843f5b4c7b895ef2f6a8600f8da00b8d7672a6f5894c7b4788a22bf5863b8bcd7b36eeae7cbc7aa388c0c8e27cb9b1a97f18a43e7ea4155487f1c4797fae5a397d739757783cdaa27b49bdd0b0f72f2684eba23585974f5582e0bbcd7f89f90d7b1d5eef7f7c0f586bc4f47e797fd19e1aa42fcf7d7b08a1832ad13d7c08f1da80f612927d6ea7ea825ba91582df3d60b877428d883129448aa6a1a8846f91f9772b61cd819ba8488817d32b85f3e4827b464e3d1ca62b8d86045e467d770d3e781c5064851cc3268677d3407e6ad78d8027eb5c9da485877c3964d1773c6e7f80b9287481069b7c7d71e72d768671e38039e2f47c8737c1849a065e82acc70280fddad8898f09ac893398c088fd17828828f2fa8ff3a7b978bddbfd891bbcce7cd8a43685f421b5879893427abe2a5d7697bf85825123907933e4917512ad6c7efe17e689528444878994ab7dd2121686a3203218f9ccfbb539f89d83848054883afbea7bea82be837a784089d74359823632c07c7fc62489ba9b2b86aacbd77b6fef3787ddf98777f641ef79bf6031824e12818604e00ca3a529537affef3e821e12c889d10b2787e00a2c7a784ac0764444d9838b73ee81f4aa2a97f456c188aa1e7d789f49e37e23558979e30dd37d36d11778d02c98aa1cca728171e797839ed69f840b094e7c2efbb8805fd3ff8517a4d181051d8582ceb2c3800cfe9eae3e68e2814702ba7e21befd811b7f9383e9b1567e24925198062adda32dbbb07f51d0827d6122a880e0f14c850dfa87893da07f8314d4a184ff784e83bc277b7d83883109d35d4a8746c5a0792c44ad75dae83c7b9eb9a0825c7a1b7a5d52ce8506078986a9466684c7fcf1898c81f8824fb4347dd606fd81d8a42c8af1053179539681856a7dcf8dd362e41904e8497e9462097bc026c016948e1b8652962278811c51853e421278d9878688614d6086cd29d0821c21a97c8adcec7c6d87147671ce407bac0f55806881268f947260a23b13310b5edfd2a1c0c7f8940b8d7877b8c70b775a94d57fa43916770c1b2089645e357d593a168549cf977be181487c77cc1386e845a07535f2b68cc3f93d8f3201b17ac14abc8a8e117eb15ff74f93059ec07cd0aa487e5ed0d4894d0bfc8508db8380e04b67780134877ff9a5b77605c37786ff0130841ad252763105e8a7cdf2757929c75685b799a78a41b690a64996109aa444b7781e368c7c151c1476b3433378a7557c7dc6249381bb4f0d7e01e8c384f2d645887c0fc07c865f978c4b78dd89d64e48a8f454d57ddbf32d96a030748c39814a86ace04b8015be4b7eb8fde777fb7df485a3973f81e1881f89a6ba96887bfded79b98d907d9993f17ac0a40595b5684078cf95c1a99852d1ac70f49fa4fb34fe9073a422856b26b07974203a7613ea107f83cc6088d6e2587dc16a4c80414cba885367f67e9707a4890619d8850c673880f670ad8be94c86962f2c84a966d482915be34883e82c40784062b17e5ee96e76f09d1b8650b0cc7b4784d3877a25967d8c441d7df761db7f97a93080897025826283207be7378684332cfd7e206f437a63498e87e99f8375b4f75189bf8b8b7be32af98687c08479b7aef885f88c6b7d8f846f7bb3e9da7fe558957f0009dc8643a96c7e9b148879dbc08a8215ff388aaa42dd7f4a5ff0811ff1f5818e06e47ac8cd4a86f6eeee82aa30b87abdf8cb8432542b87761f5d86f3b5f486b23c8077ee9ac2777d4ca1751ab2a078171f08853d0527878355ec8757913e781726a784ea9b1c7e45db0980bfba027771e0358258eb2e89aaa7b47f5db73d8a47802a7e321e8879cd346383673d8e7ac4b55884a2772188b2a1717e6976c180ae9b567859579c761d69ee7556b9cb7c9bcc00847e071c82ac50d27a3433ac7948af2d881523bf894b91237b1a1e3c852750dc82ee23dc7840452f7e8cb0057b6d34a688a7f0a275f08be77df90aca76059f577c7397527c7d94e488f744fb83783fed85d5939b8708c94688cfb55b87f8686577fd51968287f6f77f337fbe86165543771acbf4779a06947deba203803e013b8a49172984a08d288449cf7d851a308c8172891783a59ab7898231ee7b1d704d848613c57ef62f6b81dcfd4f8026b9d276339c607d0b676a83f0d3d784e1acfc795372c67f94212d875410a28113cda37a1ad69d85a7d3d47ab6e8107627012f8823792085b2c5b689fe4230843eaee281838b5c7c92a70687ec03157bee18507a9a351d8019295b81ca605a7d1004fa819dab4179e63b4178def95b83a56493860e428676c7480081dc339c7f00feb180301bc287f90a0378d8c1e17a6993787ebc03b389350030881cb133894851ac754fe3c9757a3bce77bb5ac287ec6f8c823ae93f7c3e78068122c5217cfa0680878cf8e678ead59586af858e76f8fc64824caa7889d3a99581f55e177d90c1ee85430ef689c81cb975e0b45e7ef2e8f1820350b67a2d52c081925437839935b97f93ae69818a7e838367fc8384b5e10477daf33b87a7c180893f7f5b8100a4f081c6bf058280f88b85273e0b7f0f374584dcc70782d2891d7f00ab0b7f1e19ad813f50de75676c0f7db93a287f5e4e7583c117797af75a9e773e951688613b787bc217e47769ede279fc26547a405786859d4d487e9e54ac83ace08276357bf07c9d87be829271698a439ec77bef84018a124f4d88fbccb8778beaef890c879076ae2fe2885dff2a7aba41178a9b8b9689aacbe97de235658477559f819271118213ea9089aebfd081aead5a7ad987af758288d4891aef73819d8e8378a9c80579c0f0cc7805d523830a2a2c7b34aaa67d9c09937502cb4f8399110585a810cf7aa48c18812e3174836bd3ca81b4c8bf7ba55280851385bf7a23cc9c88e111248a3f7ff9836565b37b2886a389ad82808143d8d67b0fc02a7ded52378414f8ea85680a7c82021ef280d13ab77ecc26c478415e777595212b7637ea107fdf85e97da2d1d57877a85a8f054fd87817cc73785eacd181fd4d1e7ae8507c8608649675ab49ef753ed6a17d82594b8a75be6684e994417ed008b18982d7a68085346c75527dca7e4cfd827c925fb18a26fb9c7d83969e80d5c962781e2426808f9d187f1c7b6b81bd23737d36ad907c5ccd9b88c213bc7a2044cb7da30eb3848296f97a858edc7e66f5c1804dca5c97e631ac8383d3e9924d704e7be766177fc283e37e0940a081f5c3a577effb0f78d128dc7ef283a3849ff6ac768db7d7864141ba88f4fd0f85ae908783c86fdf7aea1d9976c06eac76d5395c7bff787578c2e8a180a0864e7b18d3047f8188748722b30178ddbcf278d68f468626d2a6818176b87618c81588a141c77d688c5799bc773b7706b86a762f8fd0795bd82a762766388564453c856c63237a9993867c28980d81e372fd82d659ef7c1d1de3817f0e7e7dd36cf77e48e5af80200a027c2b7ea4805127f67540e4ce77fd0900783fae4978ff664c801c57cb775701257d12f56581c313ff8387e42676cdc80a7e0541767dcfefb37c209eec7ab27d24874b3e52908b18f993d8534d932c7e948a6a2a6a81bce6f381587bb77d9feff67ebd766a7e14d49a88bf55a3791535c2888326787a68a97579943e53898613d986d8a4c189c1bdcc85633e9d80a826da754c1a851dfd44aef8d62ba41e5d0958f764995a18c37b007fb563ce7f82183f7a42d1b57d7f0edb788f604c89a6c53f83c6f508863d712182a796a8b87bfc419c5c4d928c461498b3c64e467df0f00577cbb3bd7cf9b0af84652f06779b180e7630af657d3e83c487f88c648321596d777838ed8534b14086f6483682494d52a54b994fb14cdf889674ed6fe45cd01677fac9c77cdae8f77eb63b028737324d82d2775d7bfb0d5d7ce1a574786c8be787446fbe7dd4cdba808b3d3e7f6f081176c736929aec6cdb931c365da2f60b657a63e42f894e61fd7ffa064277e70c1080eba22c7eaff558792e18c983a481be75246e828625a70d7787dd30804b1a267b30c8b7907cb36899915363b8a8da7c832c2e1c881eeaeb78400f5279d4a987769820c27d35d5827d56787d7d35e7d0838aee81787bf6f485b379f08946ba9e85f36d258811ad0cb5713fe3b036c48f803b9dee809a182a7ef8bbb47a816fa786238b207b02837b866815257d73f59f7c2c27247a456f3f8a7df9bd7a65d5ae7c446817839bde42b42288a1ae2704c77caf078d7b2ee94780d796e57625ec0d828d2e037ae850fb8070577a87aa8a7f88b9a6d080448c2a77e563cc89ce9c0e79f6a63779b5abe08996362dab3a1b5295f3a0c788b0816586d5b7c7830c990c78718d2d7ab1520c7945c9ee76279178835aadc77e936d187b67e3087a32c44e7ec7d1317758fd8d7c7db13a9d7462d78fddc781813ad7a88792a79383b4fea2758dc2c989eb612b78cda49f880c754177d7a15284f6e3418453794d7fe8624288e2fbbb792480f88789534188638656a9a84e11e2c2212b82fac52c83c91c0177bc320c81463c8a83a6d73f848fa8f3827ef5c586fee8e884bae36783cb26f87d28fd03897ee3f78490229887bbc6f09981c9e595298684870f9102839f9c44890022577c7403908286427e86c83960881696aa8591a06683b7b5f18627b56288c3c7a28517f01f898dbed87729f9d37fd8d3af9a36f8527b9f8ac97fa81b897950df3377dc74ff7d172686884b2c5e7ce34ea786a10be987fb8b28814606588577141781d0ceb5780080dc7b35b8089af50605a632ae6380b113b9841f448b7c53af8e82629c8e7b6d462c84b529f8853fa33e81f3541a7d5da56888347b008ad8f76f797a7175779db675760aa19a88e6fa9187b1590baab17eb086d71fb08185b2638ab04017856421707e37d805881cb15d88724ffa759038b588f69ba18984bddd7b47cc747938328d8319a72d7e1ae8ad862912c98eb6d158a54eb704887212bc76e02002850249b477f2f3da80020c547fa9222488c3b52c7c5b7edd815e06c4897fd88d7b30ecaf79f2faae8243c6a888761f9395281ded91edd4141ed0d5b978f28ecf8091ab527827aee97c6e424082b75bd187f7195d7c9a7df67ac230ce8419a0958948fe517f51c93877cbd7fe7fec03fd81652fc6882e1c87996f89b81c7afb5c7a5f31277e51b72685560c9a7f80e6cf7a86cbcc7cb64d1778f2c4f377c4eb0b83f3ae66890e01a978324d7d80597000884858f28894e06b6e7f37fc75b98dd887eae34880108d7b877db89d7722e2de869b79b580e99f9e822fd347852df4697514cd9d7fe032f18769db56862380f97f929572899eaeb77bb3670d85bded4318a4fda9827219bb87696b6f79f05cbd858a7e6d8901e84b76f7a2c97cda5fd17fbc7a1e8244d4ec8081234387b7494478ca6b05859607b68926aee289951d3d82e6b2a1769dab9f826582fa75eac33276de3abf77bf1f7a824bd2867eee2a257e93912887daa739834ffce37db83364850947b6875cd437897c1d8d7fa90cc4855ef0627bc0e5568409ac0d7fea82ce85b07afd7eff01eb78a8802189e84568772ccd0c80b2060e7fc271587d5343288876315283a33df2894dad79822b0e6e80b9b1dca037593b873416db7a3e4db47f87d20c89e8ce2aaf8d2b4d87b39d3f7908f86678bf43fe821016298197ea5188eadc098aeff09e7b3ee8858894b85f7d11b12c782ef4e396200a39180823cc7dd0a3477c6ad73278c7c6d4ee5bf2d17fcd6a4382b4c84583ab5b6581b8d90a7d0d46737e1dd5007aa0083076bdf83a7b62a7228138a59679ac983ba1759f3791f434af93ec47b7156889baedb06e6a8c964b139ff953427a3de10f7917afb4882cc93682cec40c7da128338a331abb76fc26618946cc1588e546a6877ff118a6a39c919a6e8d7598e435f3adadf59f9050ddb694d615" + } + ] + }, + "job_v2_unclassed_failure": { + "kind": "job", + "request": "{\"capability\":\"wai.video.int_motion\",\"deadline_us\":30000000,\"fallback\":\"wai.video.av1\",\"job\":\"job-3006\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"media.encode\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.av1\",\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":300000,\"failures\":{\"billed_price\":0,\"failed\":10,\"failed_ms\":500,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":12000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.decode\",\"price\":10000,\"provider\":\"prov-beta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy_class\":null,\"energy_uj\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\"},{\"capability\":\"wai.video.int_motion\",\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy_class\":null,\"energy_uj\":null,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"region\":\"eu-west\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793000000000000,\"attempts\":[{\"billed\":false,\"end\":1793000002000000,\"endpoint\":\"im.alpha\",\"error\":\"server_error\",\"hop\":1,\"not_billed\":\"failed\",\"outcome\":\"failed\",\"outputs\":[],\"receipt\":\"sha256:7eda0029a9d0e0cf1ae61971605998868f97cc6866a86a7ae0205cbf61133efc\",\"start\":1793000000001000},{\"billed\":true,\"end\":1793000009000000,\"endpoint\":\"im.eta\",\"error\":null,\"hop\":2,\"not_billed\":null,\"outcome\":\"served\",\"outputs\":[\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"],\"receipt\":\"sha256:0057c24ce7523cc7ae15145d9ed961de42e650fda1f6a2bba2a09d001c3c7afd\",\"start\":1793000002000100}],\"candidates\":[{\"capability\":\"wai.video.av1\",\"cost\":480000000,\"divisor\":1,\"endpoint\":\"av1.alpha\",\"energy\":10000000,\"energy_class\":\"ModelBased\",\"energy_uj\":2500000,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":120000000,\"provider\":\"prov-alpha\",\"quality\":820,\"rank\":10,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":900,\"unit\":\"seconds\",\"via_fallback\":true},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.alpha\",\"energy\":31104000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":900000,\"expected_cost\":1036800,\"expected_ttfb_ms\":300,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":300,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1036800,\"divisor\":1000000,\"endpoint\":\"im.beta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1296000,\"expected_ttfb_ms\":700,\"failures\":{\"billed_price\":30000,\"failed\":200,\"failed_ms\":2000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30000,\"provider\":\"prov-beta\",\"quality\":950,\"rank\":4,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":200,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":967680,\"divisor\":1000000,\"endpoint\":\"im.delta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":99,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":28000,\"provider\":\"prov-delta\",\"quality\":900,\"rank\":9,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":898560,\"divisor\":1000000,\"endpoint\":\"im.epsilon\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":30000,\"from\":1790404400000000,\"hops\":500,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":26000,\"provider\":\"prov-epsilon\",\"quality\":900,\"rank\":8,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":250,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1054080,\"divisor\":1000000,\"endpoint\":\"im.eta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1054080,\"expected_ttfb_ms\":10100,\"failures\":{\"billed_price\":0,\"failed\":500,\"failed_ms\":10000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":30500,\"provider\":\"prov-eta\",\"quality\":950,\"rank\":2,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":100,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":864000,\"divisor\":1000000,\"endpoint\":\"im.gamma\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":null,\"expected_ttfb_ms\":null,\"failures\":null,\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":25000,\"provider\":\"prov-gamma\",\"quality\":900,\"rank\":7,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":150,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1071360,\"divisor\":1000000,\"endpoint\":\"im.iota\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1071360,\"expected_ttfb_ms\":280,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":100,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":31000,\"provider\":\"prov-iota\",\"quality\":900,\"rank\":3,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":280,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":1382400,\"divisor\":1000000,\"endpoint\":\"im.theta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1382400,\"expected_ttfb_ms\":240,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":40000,\"provider\":\"prov-theta\",\"quality\":900,\"rank\":6,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":240,\"unit\":\"subpixels\",\"via_fallback\":false},{\"capability\":\"wai.video.int_motion\",\"cost\":933120,\"divisor\":1000000,\"endpoint\":\"im.zeta\",\"energy\":null,\"energy_class\":null,\"energy_uj\":null,\"expected_cost\":1333028,\"expected_ttfb_ms\":648,\"failures\":{\"billed_price\":27000,\"failed\":300,\"failed_ms\":1000,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"media.encode\",\"price\":27000,\"provider\":\"prov-zeta\",\"quality\":900,\"rank\":5,\"region\":\"eu-west\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":220,\"unit\":\"subpixels\",\"via_fallback\":false}],\"capability\":\"wai.video.int_motion\",\"deadline\":1793000030000000,\"decision\":{\"decided_by\":\"price\",\"runner_up\":\"im.eta\"},\"fallback\":\"wai.video.av1\",\"job\":\"job-3006\",\"kind\":\"wai-route-record\",\"operation\":\"media.encode\",\"order\":[\"im.alpha\",\"im.eta\",\"im.iota\",\"im.beta\",\"im.zeta\",\"im.theta\",\"im.gamma\",\"im.epsilon\",\"im.delta\",\"av1.alpha\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"3fe0b709d0a08b368ae357c7451507dbed9d5634a8b38dde1167efb3d9399c16\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":4,\"unit\":\"seconds\"},{\"quantity\":34560000,\"unit\":\"subpixels\"}],\"request\":\"ed6f9d115c97c284149d2b37ef65269b6e33e84f0156fc4b4d61cc0674f9cf5b\",\"sig\":\"ce184938edf7331a33e66370d73fc9bad4ee9cc9a80d07056359167cc390088fe9aa08ab6bf08079ebcd36c6e3ef9cecf54c74ba1e9fe0fc8373d2f868911e08\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:7eda0029a9d0e0cf1ae61971605998868f97cc6866a86a7ae0205cbf61133efc\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:891df435b7ad5cb588cb9808b3404f338b2dc1121666dfab843dc2d85feb28e4\"],\"output\":\"\"},\"work\":{\"status\":-1,\"outcome\":\"failed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"2.25\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"2.25\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\"},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:50744e1eac4e1fc71a4490886d3da94c5cf9350a09706669d2cbeec54472a2b9\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"1c444b3be7d85ef6c19e04b8a54f80a91a51ac39dcad04c312c1ce2bc83871fc301bc9d626675173b2ac3f2fae4e324a5fb6e09e0f61f9dbc868a3b29f990a04\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}", + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:0057c24ce7523cc7ae15145d9ed961de42e650fda1f6a2bba2a09d001c3c7afd\",\"kind\":\"job\",\"capability\":\"oer.job.media.encode\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:4e89edd40559dfefd2ffe2a9872d15c5ee655af5387dcf09b5ab0c29429dc953\"],\"output\":\"9489bec83829fd0e694a10ff891e61445848a0888f44c486d2961703eae3d3ea\"},\"work\":{\"status\":1,\"outcome\":\"completed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"29.5\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"29.5\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"im.eta\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:d15bb3b7cfa9a3c30eb9b297efba7519afc5d99fec2274c69215b0efba44e19e\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"bc9131cf10910f285d13b3b40a89cc2db996c28a42c5936e49ce3870af5a7130dfedcaa34b8fa72198347dca8a0effa96f6c838fe524867860842e8c14b9d50e\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [ + { + "receipt": "{\"profile\":\"wai.video.int_motion/receipt\",\"codestream_hash\":\"277865b574029f700f4fac023de3ab06ae598ee6f8ed726444e91442a6bd59e9\",\"clip_hash\":\"3492566e8e2682e3b3bac083b4db02ef8eba9a7f15d9faf0e27feee0f6eb488c\",\"h\":48,\"w\":48,\"frames\":[\"e1d8e8f8b5c534be1421e5858ed9137808ddb849bdff2bf397beb32568d8eb69\",\"ae7214babf5bbd6ec279434740f3271be43d2392b8167813fa557b5c4426fa14\",\"b3ef86db27b82d303bc6b612cb224ad55259b4f2e2c0461c74dcce188cd64b99\",\"3906f91010bf1b9ca14f6e2ac9b499589ac02ff4465e1d9764a22443a8b29c22\",\"bedb1538c2071d705d2d3ab2df2c569ffed440278494649f9bf1ec881561c519\"],\"merkle_root\":\"0f3fe4aa201c275c10289c22f31e7211b555627b33a251bbe33d094abada6508\",\"work_pixel_ops\":34560,\"joules_micro\":0,\"uj_per_kilopixel_op\":null,\"energy_provenance\":null,\"parent_receipt_hash\":null,\"signer_pubkey\":\"4a29b9b42b4c7b8d947b226d503cfa1ee8b69a5cd3e4cb88b30db023d6d2bb8c\",\"signer_id\":\"did:example:sink/job-3006\",\"sig\":\"463c9b5299182716ffba98aa970205d3a9a4c81fdf12ad62c5e3b5232ecaed5b0615e3856f6742ae509f550d8c96d0cb63a93b1dd139b2e0b9ddfd4e79501509\",\"receipt_hash\":\"ef1543d81b0437599fbd9edac9328592a7cd5684636144c516a953325d4fcd63\"}", + "codestream": "57495631010100000500000030000000300000000800000006000000d5ffffff590000000000000004000000090000000f000000160000001e00000028000000330000004100000051000000640000007a00000094000000b3000000d8000000030100003601000073010000bb0100001002000074020000ea020000750300001a040000dd040000c3050000d2060000130800008e0900004e0b00005f0d0000d00f0000b21200001a160000201a0000e11e00007e240000202b0000f6320000383c00002747000012540000556300005c750000a38a0000aa9c0000edab0000d8b80000c7c3000009cd0000dfd4000081db00001ee10000dfe50000e5e900004ded00002ff00000a0f20000b1f4000071f60000ecf700002df900003cfa000022fb0000e5fb00008afc000015fd00008bfd0000effd000044fe00008cfe0000c9fe0000fcfe000027ff00004cff00006bff000085ff00009bff0000aeff0000beff0000ccff0000d7ff0000e1ff0000e9ff0000f0ff0000f6ff0000fbff0000ffff00000000010000000000feff0100ffff01000000000000000000000000000200fdfffbfffbfffcfffbfffdfffbff00000000000000000300fdfffbfffbfffbfffbfffcfffbfffffffbff000000000100fffffdfffbfffbfffbfffbfffbff00000000000000000000000000000000fcfffdfffbfffcff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0400fbff0400fcfffbff0100000000000000feff02000500fbfffbfffbfffbfffbfffdfffbff00000000ffff01000500fcfffefffbfffbfffbfffbfffbff000000000000000000000000fdfffbfffcfffbfffbfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdff0200fcff0300000000000000000000000000fbfffcfffbfffbfffcfffbfffffffdff00000000000000000500fbfffbfffbfffbfffbfffffffbff00000000000000000300fefffdfffbfffbfffbfffbfffbff000000000000000000000000fdfffdfffcfffbff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbff0200fbff0400ffff010000000000000000000300fefffbfffbfffbfffcff0100feff00000000000000000100fffffffffbfffbfffbfffbfffbff00000000000000000000000001000000fdfffcfffbfffbff74420000280b35593c000000a214bea9451501b9ad0cbdbd9a309164812c7ece531911d14717c3dbbc1d27782217989f7218f20d121d7bd4ca1f3eb3ef1f71131429e2d1f626c3e7ab249c33af4fe2d2c042a6d2222fb9b3c460c33836571567e55a40c90777634123135bfb8e1357858f0dfd6cd3316844ae2fdb041518b067b9167f09231b1d6f1c16b7df311ea6450d1ea29eed1ecc320c2b747de0206b34c82a708a2525b67967473d53e643c54f6f2f42e6355aaafd6534aabbdf5fe1a866406fac26314f6ad812ef006e0dd2c39e124439f5306ba6e0396f65ff1627ef771e0071f21b088eae1efd0a7d22d53ada205042fa23135ba627dfdecc3c473a7353bf1ea7435671e53209bdc9581998ef568e94f260c2af006595d31a5d0301d30b0e96f22e27c43d162997a218be088f12dc9d0915dff4db17246c1a3c61066e3807ec553cb509743e78e21d250c19332ef30e3d2d4f94a0275d0ead4e59f7ff403f44c02ed1b145563b075b55c0ece2599ea8038a52c4e77287a40b3015595e178405f01716799f12508739158ce39537c6364439c2c61335c774823feb0e4a46484b29464146093e52ba6e2e3e5a0631121b992d5a46a848c8478e518c794638949ff05b4c57d23967cc4b57d3bb164147bebb2f4cd1452f40e1701817cec818f564ff13f4072317feda4f17504f253558977544d057484615df8028fbee312a5a55ed2c1c72d1257130d62be71dda51a0a97748680d2735181dc85721d3923f8d192f8794fcc96be998eb135e56840f812d952b26dc2f2f8537db1701de931a9e0b811c99606b1d7a72b81fe6796623b2e3442266abe726bfe71c26713b582970ff964812b3a7511b88474ad1a39d60fe77fb5b93faa43aa689e37f22cf656dcdde8d4a529b091869c19a199bf5af108ce21a33eb8ae43a8485f63a7c0ae7f3e9d6d3fbf35320f44e2572fb823070f38da5d5fb4cd37f3e167531443d7027341943de2d2e0dbe4918ce0f53b1e5a7368b2c3c6ff4ff9044663d54810e945168c3b1d019852e9412c0563e10ce0287359612c8365ce0fd34c5cdb9f290f0e017571aaef2f889ca179debd4f3065bae18380425f4d7c9dd18bb2cf626ea6faa24e3f4384b1da15a3d6df8b52cc90b935da2e4c23b9597355cee7f1945393e249b7b14ad729ff91432962e6218224895175df6f11b30546af34ef81f1840d4b4f24290fa19e90d41f3792fbd17b307eff2702189161f1552f429b1fc18154682320160642d6a8c304b9a74645336beb060762fd36780e26160b5380e4500bf316ab3b6594b76993031ace92b2efad9cb178983121b9d4845f4ba36071a9d404af3f9d4f2199f14cff37ed44717baad75f448628d19af3421f46a8b0f19184461f3ef7bc1178d00634bcf58624c6725ac619927f15545490f360e0fb877c6814c6b9ea2f952ccf3a3abad91da10ef63f3144a0f23340223ff35814709f4d3516c16e5bb75f3a3574719c25228f4b5a03e1636db84f49a58781762e821f35742a2181bc2f7f397ef311637054630ad43d250643a45395291b55b725ae5723bdd1b62eae7a445bd65319f19c63568c61a5b1206b34d3bed1dd63786de01f49a49affb2a9cebf3518ed9fb7f061bf402f2bdfb0bb9c0f344eaa4fb1bb58df3fb10a4fb6bcbb8f3bb45a0fbfbd11ef477204efb6ff5815087d668629a2a0c5d17e9236a698d0061d79fdb460b2f26a9c24f33529ee32911b3aa1515876dab37a91b8339f13feff22ac0af17a839caf36b8b36183cace0f27ca7e419927205f46713bd1740d4a5f49da36019a6baa1f4ceac2c19b530c1f2eaf4de19c6322751ef91df5b92e05f6533f2a760db246a7d1551e266a304d149e19ef5ab9b67c917279abc17e5eb69fbf214f2182014b4fb9ffe3e163705e1fba23dfe17e466a2fb4cd37c16dcc16ffbaaa6f61663923efb92173218345ca6fb512703175f6a95fb422b751962216358fc9aad68a047125962cd87430577849addf21174af2dc5499c4fcf8778b8293377e4ed3b12154cf3afbf46fb6ab6baf3dc41b0fb4cbe91f32c0b39fb2ef0f3f2262a42fbe21813f3cd5230fb476af8f3870f92fbefea62f47a7a92fb7234cdf297d11f5d8e12023c55bf666f4ef6005c8d58bc9549953d730699fd4ff8264fb23cf0ac1886051a1c4d05891af4edc2fbf792baf24163bdfbe896c3f32f65e3fb6023ebf2ca07d7fb66774bf4993ad1fbd99a01f30be2a6fbd34630f3275768fb7ef1a1f2f78972fbe65735554ebaa9390610c05a5315734087513d8c09862074f653884a096d36bad118d01b4762691789a9a4fb84456418eb0ca3fb4aa9b419eedf99fb865a481883a740fbccb302171e6b31fbdcc4a318d918a3fb2772ae179e15aefb5dcf1b17b3873ffb7673f4189ca65c5d080bdc43f1e1b278e9bbf0411aed639db279b76db39473596dd293164dfc0317fddbabfb866f2cf49fee5afb376ea4f3351975fb9baa96f394a45afbd65b6bf333ddaffb9de9fdf212c3d7fbeeead4f2262aa9fbf329a1f4fa10ccfbaee586f41f6791fbe442375aab92fb3ebf0cd287434e9d6e5b5143a22f6941660f17d858c6629c18cba73c167536ce1e8e78a81944d168f419b32118417e79f37ee3a4168ea062f3684ff8160f7514f3d3335e16d0c984f4e44f5716db178bf3f1e44f1765e6d5f39b589417ffd4263cb1b60b56568bf7410b9931975f374f710f5c7f4fa42325bcbf1b8b7648524f17d3a2bc1d17f181fb389846f3eaf47dfb8dede9f2ef7b22fb6cb646f4429fd8fb1ab5a5f4cd8e2ffb7dc74ef4164ac2fb955678f3aea1abfb511264f4825bd7fb2cdbf5f268318f5c44110177dd73146b7a24ef4d9557b1ac71c8ac855c5302606910468a110d2833d76a203d85cc1c16f25d02f36cc7671902a893f3c335ff186fdffbf23bdcd317eae2b3f3dfb9001a3c8153f3a8edd118ccf62bf491591a17bed596f344cc8916cbf73c423ef6c45d15bc03651b1912a83850df6979ba2a6292c2eebd5d91e87574332d1ec8640e210884defb523cdff2811f84fb900283f397e066fbb5636bf4b5af3afbe896e9f2ed4ea3fbaabb7cf42cfc51fb744940f4fc3dc7fb444010f3ebf46cfb40019ff4ba45685818c3743cc9991ca49c3d626e6cdb6d54ca28d67ab141e2599329871efca9c71b6444e22057e352f45dd8b917feaa52f42bfc1119743121f3694f9818db6c99f3d79c4618989917f426394b16467b0df3b1fb8f19521d21f48db4ca175a186e3dbffda754ced3533d92a3eea77ad2e668dd293056741d36bf0ff6d877943fff1c5c2be22145ecd620c546c1f3241b6b1627e58ef43e187e1951f342f42ab1b917ec3602f4f8a719192312a0f21e3ac51704a731f4981c4f168ba270f48c969c181fea6d40d92c977aaa69c464c1fe0b4fe4ac6e6dca35ef5f6aa19dc29fe940765b492821c377c822552bbe2132b22720a4a99cfbe66ccb18874f90fb5de48618e3bcc8fb7a9dfc174fca80fb033b2e19226885fb5cbaa018cf7481fb4bbe3b1690f45071cf3b545fc7dc4c460fb904a5f494e4710bb28c59b37201bc93c3b85cedf29ed26f8cac231756f41e282b6e208e484d416f57f1f2d56f3617c0a984f402e336196a0dacf401f23a182db681f4e431cd161e6be5f31d3a03177b0239f33755483d85c9d2624864d23f6bb7c5a69c7e2164d4f8ed6167d7fdbd05c2405ff28607d169ffc3238fcc5423c78c9346c614a93f473a2b17750683fbeed5a017f40664fb11227117579a43fbf768d91957ef44fb4994591639592ffb3898db867e356462c5292e4270ba30a3145c994dc63817c2b506ff790c88855f7484a1d36b3cb022b49dc01f39897e3db627e7453b7eaa47ee9c181a325d08f3aea14718447cc5f3ce9d6d187dabeef346352a168c4c9bf38ff00e189a54f0817d9e5867e164264acf9f89a0468af5865b1d0f5d44650780f7a37565a8f4c0ceb96346217425be3f42ddfb460186a443dc4f4f39e726fd2e11ac22fba65269162b0d79fbccdde017447c95fbeeead617a64c9a609f26b64105687099d3e8f96edd6e714832a030810d602862a462e0c908e95486467e4f657a255646fefc1b3d6612ce46f05c183a0aa2e63122e07a4fe77fc847dfdb81f4981cdd5a7e25095e2496ff7c0d982d61f1b45a40c98a5da72c8cd36f9bae985ea04c49826f6e0159848c46d189116c7425229a29dca5753180914230f7d87f2cd1e2294a23bd653c8f2c033180eb015dc4796a35ffb37e5d2a91a83e040b6f9551375c7318d897491c79c9bfd5a26b563d7258cbb89e8e7b06429a6fdbbb519019578d2cf852092d88bd0f2a78859a2f1ffe22519dd8cb507fba725b0e80ca5d8ed18c6087f6007e90e4ac6bd0224e504285c6ad5e2a4885c47c8e5608003a80cdac406c2de6e9d9c33b3d881826ea313c35a52f98773329023e2e2f644eed4c9fd91548d5819c5845a9c356a9e281411746cb75d8b9686bb07213513a6827af9e2d2582d3aaee5d0a1e1582463d496d83be81d6d0003b8586b2b42e814ecb2eb4b31b288dd08d4a6d71253f6f90872d7f2ee65a725a8f582404ef5c515ac37806644d66e187784bf25f74a43c7dd98747933f580caf12c97de8796af508f6ce38d753833fa7e3df673b922672b38b4a3750af52b2e56f46a293d2301edf675a87c40637fa24ff5de154a43f0bf38b907403487346618150454a15be8935547faf98945cf4502f7649b7fb6993be0d924ba7e87e5c44373d6a05774e1f29b0405671ec2d2912145352a9f45d41c46d625518ce670cea41617a3a074385e691abd1d9156a1d614d5fb54f097d82d80c614b6b92cfc8bbf18ecd7c70d5e7049d93d1e01d3208d0df28de97dd2f92b2384b83a3414fd99c8754c10b9e5dd1be2056f367ff898dec986d36884b48e0487aa87651128106a3085ec747b37f462bcf65f40a63d5ef3e7f7cceecdee0471af487ef9a024980f7d83f5964932f413bab5da896195fea92a65bb5e08a7a9bd68e57b2e1444310b9ef9f9b1b0772aea0435d832578761abacc584d3588cdec05e37241fdd2de96b2b67eb007b4e5f9d4ef2a8742af5235a45147c3cab7323fd344569e919373f12bd5554e858d3c3b21c295a1d79c4a4fb2a7b79f3ab4817fe0416134b576cce565e369d8770ed9c2924f8be0dfa9dd680fe77af006c4499b2cf442c3a8c83284915263e978a0343afd905502056046dc7ab6773c132468e7578f4cfde095720b8e785a720e4bc40228f788b0f27669314a5f931b46bd7903017f8e10890fe23b330b2f9651075346d3114f7bd0563a61aa2b540a0abd34d4772278bec85e703c9d214d3cb2b767c686f94e8433cfbe3fab6a77d952576510c5cc764230fd772df1fee062380a787e5e1da520a88c3e08b7c330d28d614ff959b861ecc7795fe87c22712ae536609e6bee407518e19d641c5b653da09e59b8800e89d17848545190aad2538d869bd717dbd8356a67798d9ec5e38da75c9caf09b6ab547b3941643edf2f02e64254d50e36362c41616048da6c425bf9318c40ad18669821964ec7cbd2b8714e8f5dc27626caff71a47bf64d476ce899f18c24556f7820202b9b3fc5f4e77ac5be8c1bd2e3492682645389b4b359578edf64a5a823571c07547829153e647579c44813fa75b8937cd5797249dd5803ee0386f9cab266917789d973c3c989dff5e0de1a65817d238899a57e9e48eb67c3d0321d4dee57cc778c5525bf8f542e90828a8b72085cd25067411b57e1a7d11a4f67da559757ad36fbb9f6f3c55cf6723acf5d58348dc055fce03fd929925ba3f6e40db6df8f0358c8a335945849649d783b52b0006124cf4042c3f16a854dd4a7672206614e215921735710d162219312c171da4b7649882772eb6ac18293790f8a6ad0eb8a98988789622911a626f368e825d45f92441e6949bc1b3e57a98a2136eda230713b4b6c6175aa129315646973336e21535ebbb8b8a549687da77a9c603751abd14723da67adc45dd8ecffb37995aabce4d743db9059e992aa435f87ebf2069785b20d1282e032f87ec90a5977b5b6eb7ce5e14e76816f6d8aa2a99d88a41cda754a8eed7955bdc677bda57b7c9308d8853619ea8795f972807be4487ad3c6ba8177c1897f6ea77077cd107d7b0c6eb9775068bd82b5994983546a8b789ca4fc7e30fe328a23afde89fc09b97d0dc4b878a796bc885f381176c0dedd7c3009868708763778074f1483b056e47b2d2e6f775e060d80613be47905e3c28197a2b2867f2087840da05978d324ca77d0d2c3838b448282d320027d0815b57a46e25386e546797aea5eba75c4748a77a68fe6769eb2d488d27ee978dcf669752152f679d5d4447e23d3767a076168784a958b79e1e6cb7e174abe7e0952b07a7e773b7e902dfe83891d937b603f948047799278c0e56181423661814ddcad7e50682c7bd2708e8791bd117bd3ad5d764ab9e9851e6116883d29db86051203825f38767ecf081c7edad64780ccc1007a419fa88156cbfb8877f0068a366cf17ab74967805410d1775c0ec084f283567a15ff0480a7bab185479db782a0e0027c86b9e58487498f89cbd316877cf25b801767548ac2714878a7a81c89caa1d885c0633589a0289b7edbef3e82b44ae88619e8d979c7e36585e1ac7d81e3dea681258e21841709f6844a668580588df77ba9ec97766b4321899d7c8f84f0b64b880840f485a1533d851767a57d4a544c83b06ffa7dc8b02f8747de5c7fbfcc1387f25f5a8a96d15289712fee8898a5408dfef27fb1fe337a96b4d9119e22eb87a7befdb497371c3793e2cc0aac6839ae8fdf2214934812e67a0fae55765e185b83fc9293793110d187dcce0e868708c67c2d76639bf921f880fcbef0956f67119f67b9559a35d5fb9b7c1ecc997a8cb6b78d5cf38c291b8a8b95baa28623c1f77ac0c1d18300ec467e9c6e94869bba197d07b41b8215ed717c33a3518a2a69078e6c91f6ad16430393da5506a55aa5d0037315fafc42ea2304936366d8c6a231a413a65288914a4878fdecb7772cc2ad83e9a63a83e6830079d593e17e3d6ab47b4116c192d8e6c68cfe19c9af3ec9c39005755d013a19f177bd9ea67a4d820f7a4e487c042afd998ae5808088048d1c7cc641628a98e6237ed84a2e7b4c74f67ceebe667d388172975a9ae8afa684c0785fc93092ba7ee176bb07db75b140997b504ba975669b2c865791fb8b03a2327b42ee2879af368c80edb7ac827a8a198220b7b9783bfb7779379079828ed03eb60c7aed938ef44a98ff16557824090280d15731762a53287703a3b77fe63bd287bed734819a8f2080aac48c8253cc6a75084b27795ed0db7599b7f18705651188868021a7a69f5eb33e38d97dc4fd1985411d5076c1516a76d8de15829ba8e8861fdc0f88aa783f7b9aac607cc4b52478d9b68f7d03c7a57974203779ea94e0764e1d8f9d8ac846a5eb023c84085245853201b782e10ac287e06f07774edcdb8465e7e67b4f201381f6363f8327e4cc7f49584576e49dec82aad62b849a18e57ddab9dfa1dfa972a6a2b7127f6d3b3278c7a2f881f0af98824535538250c2998900cf9b88288d2778e3a5a29607b80c8af1e1f989ebb4ae7dd81bfe750a478a76390a5b7b16d7b9993e2d42cf578d667a5a367b78e9f23b7b6d993680088c68756815f1891602298a214723abf3ed7f8f93785d8a60b62d7f9eb218890b14197c055eff793efab48717d3f3b1cef2697a0b0daf7db98d5c89fd22457b7ea64a823c2d0d7cbbea0f763d9900fbcd7c0993dd268a901da4f37cdd3adc772d0a257608a94f6af2ecfe8990c841a548ad0f0355bd0b81c8cd508356dde386276d8987e4c8a17eae24597cac2c9685aa9cc780e78af9a7128b35a7e9e43f76e95770804540f4893590636813988480ba2f139c9f0c55cf83ba19860744d489391892880cfe0388f03fa186e898e57bdd04e379cba8b8fab785aa7d307981941cf013891e2b397be66ac778effb7b751ce013894acb3e846196ee03de219d897ead1781e16f55890797767732717b7de9e02981710be977bbb463fcf62c2695d6343a977160de77eb897f7530e5f883ab1320711d583f8542c6327aa93f847c26e8ae8708649b7e8188db85b068b58886efc983bb205d897fa99c8468f85ef91cde28a52f53e29aed1c0d7f8d8119889b02c485d946ab664e23bf880482d580c720ae03112885d3da3ef5804946a079c54cd5818cf8d489cd3b628376f4f882b02727872cc97d22c71cbb9c815fe9843299d185b9f9268620db128aaa5432880e540f7cb833b28a1d5a6dd08ba32078d731a87a3e5420770bf03f8511f95e7a99760a8607a9747f5599b1fab4e9db81987a0e879b025b7c8d6f6978d1bc797d09ed717cc600de87c2131b8498b4da03fa05068478a4b287491ec17eaf7e0c897045e87ea6f48782d212087c4ae8261d0f6f8a88c0755084709f6979ab8ade7818d3fd752beacb841a37c8786bccc77c149311847b83808ad929b8893b3819847bd2c27b19348181d8928287ace0be81a2481c1b8b644980cf780f771cc794839d461e7a85872d8038e63b7e25abcd8744d4f87b76233aa0aa52ebd7dcf395882d352a8351529c88f9ed62882f1b3d8a2e67d87b6dfe6bf8af405a83b1c9a7781e89ca76b46e807b4dd55f83761f5e88a1414e8af230b1851248a69d78bd977f239dc87a30b68d7f59940889c67e1177fd92fd861dee88864cb1591be244838471e77587929508875f678889cfd22b885a6c6081052f387e616a7a95bd77bbb1b62c138a067367797a4de184bef4d981d4d4f285ee3ca07ddad63c7a8003257fe6a788793612258267cd397e8529538850e641762ba213796a18c57ed784b7a52fd508a5ff20d6869efabf75d4df5f8a0e37078a9a432585d194c478d9b3b2786337658a8ca57d878c9eac7a19cf377e01f38482fee8c97926b98085796ae89e949cc590dc73e87d162af77c02e8088786b96a808534d2869636ba7c3117c086a46f587ac74f0e7ad36cd0806677b183ef845e870b1448822f4aa087dbd2be7aca2314810d587d869815da803de1e7855f800b850d17f47e7a1e32f90724a69a3f96087f43ea127b6a182a7bfd348b830732597c4f97457bcdbd9182687a998096417287ac455787b3a8cc8246a11e03b6260486f3a3837effe43b89e505de9b95289f9334b3ab840b670f7df76c63884d12b084dc574579ebb4018104286881d85c12861f1510767af346872d88fb86b01c9176e2bb40dccaa58cfa8517f60409c52a9ecaebf394ed2204a1499d827e71164f818c8ce57bf993528a8dff547c5a128f78fdab6e8acf492e82caa1737939ff837903492c9e15b105837ccb6c96d364cea13718beab45cc63a4dbb267872ee9ba80433d0f89b982877b7aa0437c178bc57cc9db49812ee96d839b96ec7f3087a979a9fe4f8942f577a8b8aa46a5009723940ef30e8fdd242eaf54b30298a5b8d579ef96f8844b5bf77d5e8fd989c2dd558aa5f488833c105b7734aa5889366c7f787df91d806ecb87859e787d9079ff13a63b6b2a8b01851c8c0015a1a35783748ad81b147ec9a56b894303be88adf98775b82cea775b4f787ba9ec7675b3313d7e4d8de588bcf81d8969f4238d5e69be94a58fecaa4121839ae315a69706ddf68a3c56d97b031a4487a743597a04bca87a08df6284aa30628a2da15488948dab86f283667e2ded9e895a7ef0864a1ece89683dfe7946884da33af14bac9579888c54d36097cbe562899b6efe818e3cda7c6f139b800d6a0c842c6fd87c625ffc79621e5084fe4da9803ad79080c31a237694b56d762587fe7576d051879db28578da6af183a7ba867b838b1388eb4f7384144be37e35e7437bd647c37642b8047bac91fd8509359281e07abc84e38bcd7b2ef4177e16d7e4829677b57b6a3c1c86ffaeea7554a4c381e629cd76f4b5647af3c05781599421804f32568846ba047bf5f23485aa42797d24c8e1823a8f7d7ef5c3137cb9f9f17d9b79c5771320817ec486607559163f8aad94d487d96a8478604ae689faf40f884899338a71ca6f8052b3ca7934c7b279ef72b6833c2dcf87157d32833183f87e41530f850d5f2f7f6271647a08dfcc76e52240864fd8967f99ff6c81e8509d75436ca985506f117690e56b82115360820063ec842f79887b035b9e81b91d167da253ea76c2179082a27e977eeebe1482cc8030886afb707ce3c56a868b4f457870aa77776ea76c77fd1b65780504aa7812bf8d87f5700f7f4a42167a2d9aa485e8eba27a02a7f98750398e754c7f1c887ba3f17f01a0b27dcbba247c8da525856b67a37ac57b168437f122843eef50897e485d7de3cc4683d97ca77da1c35f7b1e65eb79f4b56a88bc1597889e305e7b62cb8975661d3d7e1b6dd27fe8bc4079c2f3808adaa7f8865c81887f9797c6852b613681a2003e7ca021df7d2683247de48b3d806d107e75b2c9a0758575197e3457fb84c129f88193ae7b80eb7e668391225c87e994eb86a62a357d2003e5822c5d6989eb3d3d89e4e5fb82447a8c7eab8af6799e71b775277fe87aca187d82215976893f7f4277bcbb3d7aeab82e82a4b01789650b0179d29442896852507cef31227c8015c47a1ebf568a159a7d7d797c5080c1995f7b5cdfcf7e7743fc81c01b817e6dfeb0770e1e5479b355ae7be5cf2d8905addf7b8d5d8e83f57b35834e903f77ed5de57da439b5794eca49779e6a8d7f03743b88c0da998279b2597da81b237ca9466478589160773815fa845326708352a80576e0dfed75c23b5d863773717622b332872989b17f3d4d2a786f7f6586858e6981eb61547e87ae438220d4b781ca47f88066367f77171f6a88bd47c281d086d77c69edcb7881ed067b7a423b84e9e73d85d3a99788c01bc985b61e8d76b1b04178483ff5807d0b4b7ddf077f82ea658b811eb49c8866adfa7e3dc41d861bf6b97b1da66c8463379688ba6c5778bf607b82eed76178484af37837732a8261abaf7cfe95a67f144ba6784c62e087cae92979238bb68159c3217f4d16e97d58695287eda5f579b737557e8a4804765d5d4888738cf9790689308957215e8069a5c6889500347e88bc947e6cb65577c719ef8680d45c7d6f8aef86feb97182e5059a7b7b08898a5ff7cc7ae2be8b81c89ebd89ad77c57532305b85370ef17ad5c9d68482fba7880ffdf18283140b8a546afd7f4809617e5e7dd8788e9a0c83ce42227ada17358838520b785fcca87d83ccb57e3cec797c81ed177d3797b3796f6d557c59827e879f99c49d4094599d8f2e11a25021b88741121578fcf0f187ab6d9d86fe9540800201cb80da5f0f8072dce8867182408610c3e687b517098405940177a3c62f87a11de7a140c6518b772ffe90d0ff517a6337bc7a4731e884f009e481c9ff5d7e10aaaf85640f837a9ddae585f677827570a3df88fd176c7fb821e581e3141a880da01185b9c74d91a8d0adb5a830b98a98d596854b503a7f71f93979f199b87b576d82856732b6802081e17513731f86aa71de7bab9c0b7b9504b77dd33dc588c3081d8711a6d69ce9d132b70f581690eeb4c387ef1f3f891488ff850c6ad17f65c33c83fb556d7a7593da766c6ea289b8f2d4773175507ff665ba7b1b1a07889b55d5872eb3a3ad2635c08f9e5cb1abf8cd4880b438bd8207fc1880c7852a825ff03b799761ba7d45ff6e83f3c032836bd33c88f9528b7842413a8acd5f41791241c6797e00768626b90a94288aa1a5666113b2936c9e8674c93378bd4b018435dcbc896f86f58183f0878944c2787e8bc6a3800e95f28030ab2f84eff0738796e3f086a3bb4a787ab2db8e8605e8029dba41fc0fec099202a3146465e9e48541ca737910aaee828218f280c17cd777ba82bb7f86543685b164ef7c2ba9438786dd3a8a7b507f0163f5d885402166773f8ac7876b9d607ce33c1c7e19b2be8724cf6d7c03e4fc8980c2947b38276678a01a957f5b20d979fbb3b980449eb677a3f51a7f85875e977409adb1d85985923d3d9285a373648968b7367a99c2bf777a4d5e8bec6933b49ebb36866d3b2a857b913e801439228606bf4879af072c7846471082c4eb50792a9bacd048f7eaaf50a4298c43f866892c81747939ed307b3117b0807c33b579b10ac6ab76fefd84ed4008863e54757ee60c6c84d8e57b7d6f137d7befe98b81fc80327e5272b490077466a3fa75cc7bd93f9b809600d4816a061682318eb88537eacc9f21a31596839c47862c81877795452d83768f2486d13aef84288d59805cf1fc7da8802b7d5c2bd79efe2c8a7ba4035a8adce0c37c9689f17f1addd17ffb0d3d76923ba99a5f20aa87138ca276bc035f79cd58d37a36caff7de1d482802d1158980da6d278e6c8b2b0243f45784809ef7ebfcca47fc88c2e7670912e824b6d88813c80618ac0073991fe161885080abf80bf4366782a53be7d00c88f7c081ca67d279ca488d6e2fc838529d8da6786987e49e16a8672369b85ea9bab7632300484fc094a834564e5821320058750819d787050477ac7c6fc85a97c4c77ce05b385d731aa81ec7a6b7b21116d9f402da080b61ed37b640f807b9557458322ba2980bf02c67f26cbf57f844a31f92599597dcabe038254c80a7c11f9247eda30877de65f277dacaa7c751e2fb2862d35b4d8ab39677e7c740f822d9a4b8286fa6d88fb38668752b38b8981ac3286cae9891c02f27487ab62bb7a1fbbd7830cdae57b0009c67d972b7b7f732b0b8a8c270a7926b9557e26b965778754407bdb421988008793830761d8810386eb891e616e7dcdfeb21daf446f7f4d284f88033e8284a97cc4898d76f6794403cf75b181cc8384b694886398b385b1ed06868003e785b80f6c789337238259b1cf8602d2ab82d17b4076c8df6b76b19eec7db223cb7af598fb8416b355867f0e5387afea5e8336d12c79d8f7827d10ceb685f72b9b76943ec675625f6c7b8ed07d7bf0e51289590b7789512ae7f942a87d193bc3b7860cfe8b756a23c6798e6bac77e4c1b776f9a53082692e80857c69bd0294a0e67cb08c0388f86fa6869b434e7c16188e8164bc08860b8beb8269e2dd7fec151e79bc9e1880227d888822e976806f499c7e152e227e8bf5fe7c00c82481e898fade846be38140e0277b84f7417c4f07417e06246179c3130784a5407a7d9868321b0570a17582be397afa231e825cc2eb795e065278485135838804da8666c69177ecf1107f5355087c41e7a28673c63484afc6d57e43856c7d52fb6b813af4d0844c1f6f76d44f8783c1e17f7db42da482acf24e771cfd3281b546ac7526d60b8748fe1f983c79bc753462cc825ed78578bda51c8887083f82eb0eeb84495f067e0fe4491cabd286868a4831815475fd818f38ea777403c98871e7ef7ea3c6678512d81d865d110f8c34698d7554afad851fcdd8810c87aa7b7576bd87b58e8d783051d57750323d8688983780655e137f06774080977ead773b79897760af1f7ab713d97c320134a58490f57fc391ec771c748778eeed3a83d8e5cd7b0c1b317650397e751e2d439514250f8869f46e7e32011f7b923bd47f1415e87cca2ae676abd23088e0933786f3370faf90fc5c7a11700077b044bb7d6b67398893c04976bb6ce7844caacb8e90150b8a47387d87a7267a8092e8f383250cb87f92304877e0684c79be2311806aa14e90e6c4b184e8d9447a36415e7e985d2b781cce728a5505d084eb7edd94a0c6317d564da07d912216873720188445ffa3887be4cc850b4ac98349c4fd77b0035ab57743148037b193853c104580ad82d77514159f7eb4c19d8ad4e6aaa8f7030ab738f7d0840fe4f07f92831f80181bbd80af198a8857912a874cc3538aa3a9b184886909a28f67ac8db04c29208044f37b744b1d85543f9976bb1265857df9789baf534c97fb418d816624f780bb2b107f3e951479f5987581800a257985c88e7e6c757b7600a4c1a0b45b9c9448f01495730fb57c8b73cf849c925379f7070f94c5f476aef6b56c92385d8c87d66b3c89f469477c88869387e26060883f981786026df37e2a19ef88f051149ed7d571ab211d0696fa4b4c925b06cdf90b12b2acea4cd994d5f38fa9096b1baa1006b2833d1705846fd93c7608d46e834a25df80a5acbf794cb5a77e37326d8a1b3e6a75d1efd3932d0e509fdb5a679bdeb55f839591fa9214bbeeb30790b58de9e509994ae8207b4929a68874c20377692e2b81b23c58827e0750779f499b816087c97dc582d977e65fd27dfad0327dae652276a0e4e380c964e3814df92e81d70d058694216f790b798d810e953b86987a5c76f1631e7a3199107cecbb598a1b5000879416c67a433d1e807fa9d0788b7e6b7d6b1f6b80f450b3784ad6cb7e7f3d7789b09e05783ff6838450b7a67c10fd09819ea75b84483429889117d079eb12ff7a64ce877e86dd3a7e44c2e576c4e4c78992dd2184b41b1083ad8de681a2659884516b99797ea68b8a7c3a96812140577d7050d186273ea2868625a48003f62486497c2d88cde11c82c797597a68273a86fda03f7a72d19a8025cf8e85c3e48a868b3d3c8216a1b67b863b8c7b9eb9ee81410b977d9bde3c7bcb1f817ad4cd4283a743b689f40f92893852d2824564128963b528848678487e4cd9178a6b7933817714a683b4a4d1794593ff83b695d47e01c4fa7facb56682ef67a086e7080681fb67627f9dcf917c8438338385bd647cffdd427886d68784084b84788f721284ccc1ae804a8a5f76b0731179ec61a875d319af7742add57f49588b781ff5878382a1be75ad9fc286be0da075eab1bf8001057f821ebf5179a17bce7f95c3768523d345893eef997f9803a383b5587d7ea65984813428377ccb4377750e1eb88273b48686eb199e7d47431b837e5a8c76a2000e8217f7a989b529a2871d00c0889cab9b8092fa3982b886b4760832407b0732107918d3578636b48d81ad9fce7f8b4f658a51ac688904d5e378be8fcd7758862e7960512d88e2602684f06ed37ad84ad7875f38518621ac3d84c5f94f83c105c17efc6e887f88864f8349f38381003f2e7a1c0f90805953987e2d11df7a75b7c276c87a1d7633d23b83f3c07b7f271a99754485fd89ae19697fcf49c475db428f75355e16875ac6f27f986fb77704451081b5ab4f8199c9fb85ddd5ff815bcdc98699d0da7e40aa8478d7a8217de64da08891b21a7b6a4e477f162aa184ef848f7963e4ae7f55b2747ee8aae78113973e85bc15dd7d10eb9576c3541b853c511277f7e38d8129ee7c8277de3d8425f39989f3ae567b08c297791d942b7743eacb864c9f9581eaee987a2bfc8e89b6255189a1a604884780c6894f322383d6c503779d874487740ab27a1987977ecd05c47d9e42d37e9582c97e93a3827a8b07197b60807e88ec27cb89c33ed2779cf7a38491b29d87e8ce317c7606967c1cbc427ff2a0a4895ca50c84099aba75434fd6808ec5db790bbae582d59a267b2193377c198e02882392d9786ce58185cd223a764444b782d5ed938493f6fa88497cbb88a547368407df8277524747800ac52479c3ef9379b7ef637d0a7d448ae505fb85d2000b81f89e868a14eded78354c89764d69d6883a67ea761f730d7c1660c57e4b910c7f4265d77adf24907994d9e97d9790c1794b25d48978b6ca805ba2e27bc9e65c825d47877a0075ac86e4f7ef885260a5894e07c382873e7f7a765976775ddb657c9d6a5c867224b68795a61e8a8b32bc854df9c77e2bc6047b471f6c88dafa7576b252ba86dfb46f7752befd880ec0ba89b9c3e67b955e41806d104688ebeaee817da6207ebb5ae182a6f4a0802140548aa224798a7d8296828dffb27c268397866c75ac893ee4f184c092557816be177d6cf78b8489c31a7a8b90237e0af46883a3bb458803d91f7f9653b476079058880c6ad07ed731e88555f31a8873442379ff13398a14f8d9820ffd8f882093ef7c55feb27f2c15658a7e072788a4931b7b7afaf276a3bfcb7fe65f8b848b0e817c89f27c89ae2b6f7653721d7e3a842777da587b7e47a8b17d85eceb7e2451a7855fde4e78d14ceb786f37007e717006847899d67a8015b87736eefa797b3712870022057a8176d47c810a5b88fc1b51832ae3317c6844e189980a4f86a13a727f5a5a8779c873bb79335b6c7f58e0be819283c283f594d77c459a187c4f3dca88dac04689497cdb7571e07b76cc02387cb3de3e7e1d82c389e2b3d77e79e1c187681c76786295c77a50157483bd35367f2dbec389cbba5088dae83a7827781a7e48f7e084e31fb586c9359a77f83d0b7e02cb9a89ada61b7f89b1e87a67d88c7e6707427b99938e781946a582d18214818af57b892ff7ab7ee8989c83f05c297f6f49ac7b60c87b87f337348746433583d576bc75c06e6582276dbb7d4045f27f54ec7b8095e77f8111b8f19346d17daba9fa6da11cf467aa3859288f3cc3728b9eed0699dce1c498a94081abcc74dc93adc02d80a611e69689d47e76d8e5ef81f8df167bee356686fa47db8079296890fe180ca68ea14a8fd585aea5e57284b721d15690735e838c7fa9fc90139b619ebd8bbb885e595787155da79923dc97853e25f6867c169a89cd4d7d8155b2fb7ef283a7b6a01fc59039f30d8be3f2fcaa038f8c914e98bba90e3c390475cfe121366e6c9c95282d8c24ddfb76fcd3e8a12ce52f8a9e9c2b7dd731f887e5e10678796af378db30477dd29b5e91d6efb598e5c645a6c33d249705e638963a36d927ed7b3f7b468fde7fe61793872174c38c3c56c8806533e4946850c47de95ea0881d24437ecf66a68911ca7183257cf48036e333b14fed0a94b7f8369e40c24ab15e273afbf4242f7bc014267d0d46218697689281f3c0707d42369a96dd92ef8486a7e285868a19877702ab7e74c2ba75911089820964c58cc1bb5a8d0d6168ab7fe96395f8046584913b5e84dcbc9d7d691c4f781880ac7fa4270798fc66e48569596e7919b2f9850b92ac7fbf720d7f5d9a7475b3b304b5ae023e9c438c2ca7b54f16ae68e4fd8838b7e27e9bfb787efa2ae5838a890d7e50f8278074ddea87b8a32d8a8360f575be9a587cd02c0c7fb07aaf7fe7789076ac2c098d48130bb71a90919c94084e8ca2e23e82e93a1c8744d405766af43176f3135e8af881de871356c17b23c142a4336d307fe8ebea7646c51f7bbff01d762d648178ba9bac76c395cd88e8eb12057ce8bfdfa887df81df2b0b8a88218882fc269a7918b6a085ab2ca1813feb8f860249749eda88c17d924dfb855f5cae8124b6bd8722e96f79f4a3c37677f0507ba3a6290509290add8ea2a189b00a0c83699ad087dfcdd688bd35d082444b5381864d367773a2068d65335879d21dee7c9cd324817c45bd793abe9a874f689495c77f489a9d579b87bc5d58813cc8ad7b4385387c0e66b7818d118a7d66129b8af10519864c0458a4fb9f2586dd3a327a2bd82c8087913a76c34221860ecb6b77001bd794f5078d84332c2a7b60e553865d064881db78b57dc3e43185337fb481f4b58376b372c08951e20a857ead35856815ff87070e4e8afdc4007de575328529774a79921e897d22a158fa6e65bb79c5579677223ce77887ef4a8381acdc861a660d851bf6ad8548a4ac16a756c877f57b6a7858b56a879a0d6186631a0281c6bf6a87194d5c8932e4969bfa8ccbf9895f23810a3cf07f65286c78f45bbc7524f7aa84178bd07e3f08cf83d9ab8fa3c8e08576fc02a08a8bcd767df2d64f85af6114827e7ee886805d0476e6a01e83358240fc52a107896e9cf08443329d7538f1f7777befdb8471d5da79adc3ef7bb534d317d69949a6c15000822b97cf78ba65ae790bafbd89fd4d7388d731618871772b831631ba7fbe213a7d233828890a8baf80122b39868a89188a677a57843f5b4c7b895ef2f6a8600f8da00b8d7672a6f5894c7b4788a22bf5863b8bcd7b36eeae7cbc7aa388c0c8e27cb9b1a97f18a43e7ea4155487f1c4797fae5a397d739757783cdaa27b49bdd0b0f72f2684eba23585974f5582e0bbcd7f89f90d7b1d5eef7f7c0f586bc4f47e797fd19e1aa42fcf7d7b08a1832ad13d7c08f1da80f612927d6ea7ea825ba91582df3d60b877428d883129448aa6a1a8846f91f9772b61cd819ba8488817d32b85f3e4827b464e3d1ca62b8d86045e467d770d3e781c5064851cc3268677d3407e6ad78d8027eb5c9da485877c3964d1773c6e7f80b9287481069b7c7d71e72d768671e38039e2f47c8737c1849a065e82acc70280fddad8898f09ac893398c088fd17828828f2fa8ff3a7b978bddbfd891bbcce7cd8a43685f421b5879893427abe2a5d7697bf85825123907933e4917512ad6c7efe17e689528444878994ab7dd2121686a3203218f9ccfbb539f89d83848054883afbea7bea82be837a784089d74359823632c07c7fc62489ba9b2b86aacbd77b6fef3787ddf98777f641ef79bf6031824e12818604e00ca3a529537affef3e821e12c889d10b2787e00a2c7a784ac0764444d9838b73ee81f4aa2a97f456c188aa1e7d789f49e37e23558979e30dd37d36d11778d02c98aa1cca728171e797839ed69f840b094e7c2efbb8805fd3ff8517a4d181051d8582ceb2c3800cfe9eae3e68e2814702ba7e21befd811b7f9383e9b1567e24925198062adda32dbbb07f51d0827d6122a880e0f14c850dfa87893da07f8314d4a184ff784e83bc277b7d83883109d35d4a8746c5a0792c44ad75dae83c7b9eb9a0825c7a1b7a5d52ce8506078986a9466684c7fcf1898c81f8824fb4347dd606fd81d8a42c8af1053179539681856a7dcf8dd362e41904e8497e9462097bc026c016948e1b8652962278811c51853e421278d9878688614d6086cd29d0821c21a97c8adcec7c6d87147671ce407bac0f55806881268f947260a23b13310b5edfd2a1c0c7f8940b8d7877b8c70b775a94d57fa43916770c1b2089645e357d593a168549cf977be181487c77cc1386e845a07535f2b68cc3f93d8f3201b17ac14abc8a8e117eb15ff74f93059ec07cd0aa487e5ed0d4894d0bfc8508db8380e04b67780134877ff9a5b77605c37786ff0130841ad252763105e8a7cdf2757929c75685b799a78a41b690a64996109aa444b7781e368c7c151c1476b3433378a7557c7dc6249381bb4f0d7e01e8c384f2d645887c0fc07c865f978c4b78dd89d64e48a8f454d57ddbf32d96a030748c39814a86ace04b8015be4b7eb8fde777fb7df485a3973f81e1881f89a6ba96887bfded79b98d907d9993f17ac0a40595b5684078cf95c1a99852d1ac70f49fa4fb34fe9073a422856b26b07974203a7613ea107f83cc6088d6e2587dc16a4c80414cba885367f67e9707a4890619d8850c673880f670ad8be94c86962f2c84a966d482915be34883e82c40784062b17e5ee96e76f09d1b8650b0cc7b4784d3877a25967d8c441d7df761db7f97a93080897025826283207be7378684332cfd7e206f437a63498e87e99f8375b4f75189bf8b8b7be32af98687c08479b7aef885f88c6b7d8f846f7bb3e9da7fe558957f0009dc8643a96c7e9b148879dbc08a8215ff388aaa42dd7f4a5ff0811ff1f5818e06e47ac8cd4a86f6eeee82aa30b87abdf8cb8432542b87761f5d86f3b5f486b23c8077ee9ac2777d4ca1751ab2a078171f08853d0527878355ec8757913e781726a784ea9b1c7e45db0980bfba027771e0358258eb2e89aaa7b47f5db73d8a47802a7e321e8879cd346383673d8e7ac4b55884a2772188b2a1717e6976c180ae9b567859579c761d69ee7556b9cb7c9bcc00847e071c82ac50d27a3433ac7948af2d881523bf894b91237b1a1e3c852750dc82ee23dc7840452f7e8cb0057b6d34a688a7f0a275f08be77df90aca76059f577c7397527c7d94e488f744fb83783fed85d5939b8708c94688cfb55b87f8686577fd51968287f6f77f337fbe86165543771acbf4779a06947deba203803e013b8a49172984a08d288449cf7d851a308c8172891783a59ab7898231ee7b1d704d848613c57ef62f6b81dcfd4f8026b9d276339c607d0b676a83f0d3d784e1acfc795372c67f94212d875410a28113cda37a1ad69d85a7d3d47ab6e8107627012f8823792085b2c5b689fe4230843eaee281838b5c7c92a70687ec03157bee18507a9a351d8019295b81ca605a7d1004fa819dab4179e63b4178def95b83a56493860e428676c7480081dc339c7f00feb180301bc287f90a0378d8c1e17a6993787ebc03b389350030881cb133894851ac754fe3c9757a3bce77bb5ac287ec6f8c823ae93f7c3e78068122c5217cfa0680878cf8e678ead59586af858e76f8fc64824caa7889d3a99581f55e177d90c1ee85430ef689c81cb975e0b45e7ef2e8f1820350b67a2d52c081925437839935b97f93ae69818a7e838367fc8384b5e10477daf33b87a7c180893f7f5b8100a4f081c6bf058280f88b85273e0b7f0f374584dcc70782d2891d7f00ab0b7f1e19ad813f50de75676c0f7db93a287f5e4e7583c117797af75a9e773e951688613b787bc217e47769ede279fc26547a405786859d4d487e9e54ac83ace08276357bf07c9d87be829271698a439ec77bef84018a124f4d88fbccb8778beaef890c879076ae2fe2885dff2a7aba41178a9b8b9689aacbe97de235658477559f819271118213ea9089aebfd081aead5a7ad987af758288d4891aef73819d8e8378a9c80579c0f0cc7805d523830a2a2c7b34aaa67d9c09937502cb4f8399110585a810cf7aa48c18812e3174836bd3ca81b4c8bf7ba55280851385bf7a23cc9c88e111248a3f7ff9836565b37b2886a389ad82808143d8d67b0fc02a7ded52378414f8ea85680a7c82021ef280d13ab77ecc26c478415e777595212b7637ea107fdf85e97da2d1d57877a85a8f054fd87817cc73785eacd181fd4d1e7ae8507c8608649675ab49ef753ed6a17d82594b8a75be6684e994417ed008b18982d7a68085346c75527dca7e4cfd827c925fb18a26fb9c7d83969e80d5c962781e2426808f9d187f1c7b6b81bd23737d36ad907c5ccd9b88c213bc7a2044cb7da30eb3848296f97a858edc7e66f5c1804dca5c97e631ac8383d3e9924d704e7be766177fc283e37e0940a081f5c3a577effb0f78d128dc7ef283a3849ff6ac768db7d7864141ba88f4fd0f85ae908783c86fdf7aea1d9976c06eac76d5395c7bff787578c2e8a180a0864e7b18d3047f8188748722b30178ddbcf278d68f468626d2a6818176b87618c81588a141c77d688c5799bc773b7706b86a762f8fd0795bd82a762766388564453c856c63237a9993867c28980d81e372fd82d659ef7c1d1de3817f0e7e7dd36cf77e48e5af80200a027c2b7ea4805127f67540e4ce77fd0900783fae4978ff664c801c57cb775701257d12f56581c313ff8387e42676cdc80a7e0541767dcfefb37c209eec7ab27d24874b3e52908b18f993d8534d932c7e948a6a2a6a81bce6f381587bb77d9feff67ebd766a7e14d49a88bf55a3791535c2888326787a68a97579943e53898613d986d8a4c189c1bdcc85633e9d80a826da754c1a851dfd44aef8d62ba41e5d0958f764995a18c37b007fb563ce7f82183f7a42d1b57d7f0edb788f604c89a6c53f83c6f508863d712182a796a8b87bfc419c5c4d928c461498b3c64e467df0f00577cbb3bd7cf9b0af84652f06779b180e7630af657d3e83c487f88c648321596d777838ed8534b14086f6483682494d52a54b994fb14cdf889674ed6fe45cd01677fac9c77cdae8f77eb63b028737324d82d2775d7bfb0d5d7ce1a574786c8be787446fbe7dd4cdba808b3d3e7f6f081176c736929aec6cdb931c365da2f60b657a63e42f894e61fd7ffa064277e70c1080eba22c7eaff558792e18c983a481be75246e828625a70d7787dd30804b1a267b30c8b7907cb36899915363b8a8da7c832c2e1c881eeaeb78400f5279d4a987769820c27d35d5827d56787d7d35e7d0838aee81787bf6f485b379f08946ba9e85f36d258811ad0cb5713fe3b036c48f803b9dee809a182a7ef8bbb47a816fa786238b207b02837b866815257d73f59f7c2c27247a456f3f8a7df9bd7a65d5ae7c446817839bde42b42288a1ae2704c77caf078d7b2ee94780d796e57625ec0d828d2e037ae850fb8070577a87aa8a7f88b9a6d080448c2a77e563cc89ce9c0e79f6a63779b5abe08996362dab3a1b5295f3a0c788b0816586d5b7c7830c990c78718d2d7ab1520c7945c9ee76279178835aadc77e936d187b67e3087a32c44e7ec7d1317758fd8d7c7db13a9d7462d78fddc781813ad7a88792a79383b4fea2758dc2c989eb612b78cda49f880c754177d7a15284f6e3418453794d7fe8624288e2fbbb792480f88789534188638656a9a84e11e2c2212b82fac52c83c91c0177bc320c81463c8a83a6d73f848fa8f3827ef5c586fee8e884bae36783cb26f87d28fd03897ee3f78490229887bbc6f09981c9e595298684870f9102839f9c44890022577c7403908286427e86c83960881696aa8591a06683b7b5f18627b56288c3c7a28517f01f898dbed87729f9d37fd8d3af9a36f8527b9f8ac97fa81b897950df3377dc74ff7d172686884b2c5e7ce34ea786a10be987fb8b28814606588577141781d0ceb5780080dc7b35b8089af50605a632ae6380b113b9841f448b7c53af8e82629c8e7b6d462c84b529f8853fa33e81f3541a7d5da56888347b008ad8f76f797a7175779db675760aa19a88e6fa9187b1590baab17eb086d71fb08185b2638ab04017856421707e37d805881cb15d88724ffa759038b588f69ba18984bddd7b47cc747938328d8319a72d7e1ae8ad862912c98eb6d158a54eb704887212bc76e02002850249b477f2f3da80020c547fa9222488c3b52c7c5b7edd815e06c4897fd88d7b30ecaf79f2faae8243c6a888761f9395281ded91edd4141ed0d5b978f28ecf8091ab527827aee97c6e424082b75bd187f7195d7c9a7df67ac230ce8419a0958948fe517f51c93877cbd7fe7fec03fd81652fc6882e1c87996f89b81c7afb5c7a5f31277e51b72685560c9a7f80e6cf7a86cbcc7cb64d1778f2c4f377c4eb0b83f3ae66890e01a978324d7d80597000884858f28894e06b6e7f37fc75b98dd887eae34880108d7b877db89d7722e2de869b79b580e99f9e822fd347852df4697514cd9d7fe032f18769db56862380f97f929572899eaeb77bb3670d85bded4318a4fda9827219bb87696b6f79f05cbd858a7e6d8901e84b76f7a2c97cda5fd17fbc7a1e8244d4ec8081234387b7494478ca6b05859607b68926aee289951d3d82e6b2a1769dab9f826582fa75eac33276de3abf77bf1f7a824bd2867eee2a257e93912887daa739834ffce37db83364850947b6875cd437897c1d8d7fa90cc4855ef0627bc0e5568409ac0d7fea82ce85b07afd7eff01eb78a8802189e84568772ccd0c80b2060e7fc271587d5343288876315283a33df2894dad79822b0e6e80b9b1dca037593b873416db7a3e4db47f87d20c89e8ce2aaf8d2b4d87b39d3f7908f86678bf43fe821016298197ea5188eadc098aeff09e7b3ee8858894b85f7d11b12c782ef4e396200a39180823cc7dd0a3477c6ad73278c7c6d4ee5bf2d17fcd6a4382b4c84583ab5b6581b8d90a7d0d46737e1dd5007aa0083076bdf83a7b62a7228138a59679ac983ba1759f3791f434af93ec47b7156889baedb06e6a8c964b139ff953427a3de10f7917afb4882cc93682cec40c7da128338a331abb76fc26618946cc1588e546a6877ff118a6a39c919a6e8d7598e435f3adadf59f9050ddb694d615" + } + ] + }, "lesson": { "kind": "room", "room": { @@ -1495,6 +1651,111 @@ ], "logs": "[[{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":0,\"ts_ms\":1792108800500,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":1,\"ts_ms\":1792108801100,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":2,\"ts_ms\":1792108822500,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":0,\"ts_ms\":1792108800510,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":1,\"ts_ms\":1792108801147,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":2,\"ts_ms\":1792108805510,\"event\":\"stall-start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":3,\"ts_ms\":1792108805910,\"event\":\"stall-end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":4,\"ts_ms\":1792108822510,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":0,\"ts_ms\":1792108800520,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":1,\"ts_ms\":1792108801194,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":2,\"ts_ms\":1792108822520,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}]]" }, + "lesson_bytes": { + "kind": "room", + "room": { + "descriptor": "5752443101d6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bd0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7200406cd8e95d060040420f0000000000170068747470733a2f2f6c6573736f6e732e6578616d706c651000000004002c0100005745503101fe1f0000000000000000000000000000000000000000000000000000000000000004f4013200000040420f00000000000100000040420f000000000004086469726563746f720101020b1a0f00000000000000000000000000000000000000000000000000000000000009706572666f726d65720301020018110000000000000000000000000000000000000000000000000000000000000861756469656e63650001010018000000000000000000000000000000000000000000000000000000000000000a636f6d706f7369746f720201020402000000000000000000000000000000000000000000000000000000000000000004067370656563680101046f707573000001000000000000100000004000000080bb0000010f056d757369630101046f70757300000100000000000080000000fe01000080bb000002000b63616d6572612d3130383002020d617630312e302e30384d2e30380b617663312e363430303238010003800268011e0096000000f40100000005d0021e00f4010000dc050000800738041e00dc050000a00f00000000000000000a63616d6572612d37323002020d617630312e302e30354d2e30380b617663312e363430303146010002800268011e0096000000f40100000005d0021e00f4010000dc05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011e00d0070000f401000002444546527d2038c499b62ca152978601e0dfa4f2e1c5b15e1ef68449ca33b1d6dcd497037e6ce23ed0aa7b849df375b2e89955d6119b4a878fd20be449be1312c6534501", + "grants": [ + "57524731012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c5200000000000000000000000000000000000000000000000000000000000000000000000000000000f05ad16a0000000080bad26a00000000000101020b00000000000000000000000000000000000000000000000000000000000000000057455031011a0f0000000000000000000000000000000000000000000000000000000000000004f4013200000040420f00000000000100000040420f0000000000ffffffffffffffffffffffffffffffff0000000100011568747470733a2f2f72656c61792e6578616d706c650000bea5ab08f1545cb8dc513b29a89599253fa6e205f706abf0464328c151580465de8533f866bf72b43df493570544a0255c57f275f4cab2f63c86ad7521b3e600", + "57524731012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f500000000000000000000000000000000000000000000000000000000000000000000000000000000f05ad16a0000000080bad26a000000000103010200000000000000000000000000000000000000000000000000000000000000000000574550310118110000000000000000000000000000000000000000000000000000000000000004f4013200000040420f00000000000100000040420f0000000000ffffffffffffffffffffffffffffffff000000020102011568747470733a2f2f72656c61792e6578616d706c655900086665617475726564040074727565077375626a656374400035393432353436353030343530303033326436383933663938306137646164343833616637306234653131366131306237636161346532303532353933363939e8c84e771a717476baa11cf942325fe291a1df45c01de5500df09f929cfe4afda793a413095db8ef85c0834bd20532b4e665684a44d311ada6cb0c887942fd06", + "57524731012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee00000000000000000000000000000000000000000000000000000000000000000000000000000000f05ad16a0000000080bad26a000000000103010200000000000000000000000000000000000000000000000000000000000000000000574550310118110000000000000000000000000000000000000000000000000000000000000004f4013200000040420f00000000000100000040420f0000000000ffffffffffffffffffffffffffffffff0000000101011568747470733a2f2f72656c61792e6578616d706c654a00077375626a656374400032623935366261393932646264326433366438316663346134613737316237303438623733326132653336636565613266353734343832313665663536366336cfbe463d94a52e508797cf955379ea84c17812512bd8ce814c994de9acbb1b3549879f17e06a51d786bc13c4fa644f39eb0e8afc6720e5157710a4eeb338df00", + "57524731012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c100000000000000000000000000000000000000000000000000000000000000000000000000000000f05ad16a0000000080bad26a000000000302010204000000000000000000000000000000000000000000000000000000000000000000574550310102000000000000000000000000000000000000000000000000000000000000000004f4013200000040420f00000000000100000040420f0000000000ffffffffffffffffffffffffffffffff0000000103011568747470733a2f2f72656c61792e6578616d706c6500003869c45831770faf0563fbece44f7cbcef4cd3fbf19d2a59aa34ee7b95676c956edc96c72ed89e2a11bae6c2ac04e150e899269f76ddc766018d439764d01004", + "57524731012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa78a50426ccfca7ce958e1c52db484fc712687799e1ff84bc4cdd4182aad891c600000000000000000000000000000000000000000000000000000000000000000000000000000000f05ad16a0000000080bad26a000000000200010100000000000000000000000000000000000000000000000000000000000000000000574550310118000000000000000000000000000000000000000000000000000000000000000004f4013200000040420f00000000000100000040420f0000000000ffffffffffffffffffffffffffffffff00000000011568747470733a2f2f72656c61792e6578616d706c6500006269a123cbac9dd31be7210d27fb2ee2fdd1f062db4f8546fc4d004435da090bdf022e6e8fad6d2e1220582094847a1c7607d330d6056ae1798ec2960c6b2b0c", + "57524731012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa764a37268db038e6a6700c23f1e1b6ded3fd817e2faea48b1e62cf20cc65cd000000000000000000000000000000000000000000000000000000000000000000000000000000000f05ad16a0000000080bad26a000000000200010100000000000000000000000000000000000000000000000000000000000000000000574550310118000000000000000000000000000000000000000000000000000000000000000004f4013200000040420f00000000000100000040420f00000000008096980000000000ffffffffffffffff00000000011568747470733a2f2f72656c61792e6578616d706c650000c4cbf1a57fe4987d85f84b0d28b1a8261efce7cd6cefabbc2881e56696f83f04c65b12a6398643b5cf09c71774cea97564acd3adc6e3ce5576aa431db40de90b", + "57524731012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa2d8bca2005c2ba7300d28cda48ba74c2217bc1990aa7a2b25931bcc89ca580c00000000000000000000000000000000000000000000000000000000000000000000000000000000f05ad16a0000000080bad26a000000000200010100000000000000000000000000000000000000000000000000000000000000000000574550310118000000000000000000000000000000000000000000000000000000000000000004f4013200000040420f00000000000100000040420f0000000000ffffffffffffffff640000000000000045555200011568747470733a2f2f72656c61792e6578616d706c6500008a8b973614ae2b0d1e85469d8cffe0e9d207fbbaf0a27e1af25583ba2926f1cc38f5cd8cc3d3cf4ec191227b9242ae798b2c281b684b71f2f7c59deaf981dc03" + ], + "key_log_head": "{\"grant_max_s\":86400,\"issued_at\":\"2026-10-15T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"room-authority\",\"key\":\"d6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bd\",\"may_sign\":[\"live/room\",\"energy/OnChipCounter\",\"energy/ModelBased\",\"energy/Estimator\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"take-store\",\"key\":\"0f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba13\",\"may_sign\":[\"capture/store\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"relay\",\"key\":\"0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b72\",\"may_sign\":[\"live/relay\",\"energy/OnChipCounter\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"compositor\",\"key\":\"a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c1\",\"may_sign\":[\"live/compositor\",\"energy/OnChipCounter\",\"energy/ModelBased\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"ingest\",\"key\":\"3549cf93c7fb47a5cee15993419720433466b527ad7a7423ccc78de33baf2cc9\",\"may_sign\":[\"live/ingest\",\"energy/Estimator\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"meter\",\"key\":\"8be2039bc5d06e7cf9d0188c3f22c659f1687b08b69b97f50b134552c46da783\",\"may_sign\":[\"live/meter\",\"energy/OnChipCounter\",\"energy/ModelBased\",\"energy/Estimator\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-10-14T00:00:00Z\",\"id\":\"meter-old\",\"key\":\"1c5430e51de83d2adf16caf0c8ab6ffaeed421d6569611674a685117eb385180\",\"may_sign\":[\"live/meter\",\"energy/OnChipCounter\",\"energy/ModelBased\",\"energy/Estimator\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-10-14T00:00:00Z\",\"id\":\"relay-old\",\"key\":\"e079d6f85a4fb3fecc7f4a94cde29c757313f84e0bd726c9c9dfe640a5745931\",\"may_sign\":[\"live/relay\",\"energy/OnChipCounter\"],\"status\":\"revoked\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"fa2ec0c92dcc45c59d8ede47e5f6cbaa0f89e36186a25c7007ec718415288a8d\",\"origin\":\"https://lessons.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"93bd7020e78d0ced730d16b3df0385340bb6ad05773df662e19ec3d4735c5e5c\",\"seq\":0,\"sig\":\"412da30d6f3f35c71d6c8075a78713129497b1a28c2887990c99cc16dd26dc9c33593f894286ced846c36b597013b39e583d83ce42cb1ffa75812e9222bad104\",\"status_max_age_s\":3600}", + "chains": [ + [ + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104000d927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c52d436e9616073a533831cfbec646020b5d4dcc9d1df4b792ccaff6e7e23ee686ad90f34467ecd1ae1beee4715b6ad56a1066885f45de845b5e1254f022b9504b191eee829d5007a0391a30af95d9efc41cb6e7b9fe1bb4591e7f587b35fc12103", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720100000000000000427fb576b2ce3ae19b7f085dc335864687bcc94f64e8d47e8d7a0baab7acffc2000000000000000000104000e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5d1ee853e5c092553edc99a0cc2468a7307afd83533a3a34f401b0695da3433140315765b5e69cf9cda0aa975fff4ff243328d62ddd0d53798472165bba87b9921d60cadec42afa900b559ae469f7a3bb5870d6a180c30d368daca0aca4f43d05", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b72020000000000000095ea09d688d1c33f265428db98aa2a268f391f6ffd908ab6c39843c8e591177c000000000000000000104000a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c1b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0e053886f0bc7ed1fc288c3b8dbe6e2e009998f204f921e1ec247fc870003f99598f8216ff5cbda966841da96c98ae2a727607db2d9b08542e2fb9fce4f4bfa04", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720300000000000000ba5015a517cd3fdebc9cd865fc10df47e2e7c97a444dff51c5cfc647434a3ef6000000000000000000122400a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c100020301e449ecf9f6773169161edefbfdb034114849028534b79602cdd2538371a6b21f18b273b29fe0678f781bbf72c3d75bf17d03adc10a531d788d7e693f3858620a", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720400000000000000fc5a8acc446b029d3d479f4b66d09f53e968f32792aee1f4e278ccab6a195a4c20a10700000000000010400078a50426ccfca7ce958e1c52db484fc712687799e1ff84bc4cdd4182aad891c60c2a9846621d91f9309170b29b95e158e278002ce4cc03a2d097917836a391c028cea7fedad7bfdb6b7402c13da6e6b8c1077aa5290e1954f13ac0082da7cdc9d6ff62a798afe163a44575ce65b558f4266798d75e116d34c58f3c3ea8900907", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720500000000000000044bf302c9f47024ab231a640905353115ce057e85a04c509808e7fe9b21b254c027090000000000001040007d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eeecf4a5892c8a1bef2afba730a4ec868d0830f9355d10f540b757205945c588cb507ef6ba4e6cecea09d1714d6dd41c963ca58cca289c9839eaf74eba473fc28eb2f5b6190e4da8b5fe796eca8212e2c915ec1459aa081a97de67ec5926f450608", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b72060000000000000010ca0251df4b17967f3704e4d3bd4a308ad12fd640aa970e13908ee015aa985660ae0a000000000000104000a764a37268db038e6a6700c23f1e1b6ded3fd817e2faea48b1e62cf20cc65cd06dde44606fd8377d9fa0809b2b36b708de3e6119d8c1c3d1f0d675917c28c619f660a54c57820b95480c0840836278a125593043e58895bdb8e00fed6e0c1308731455a732b1baec43e8e68ee585fc2e272d3c5124e08fdb14c7183eacf33005", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7207000000000000004b49d8a56fe5947607740aef1061d356e7f6e3c83a21701e432405315b10cc5400350c000000000000104000a2d8bca2005c2ba7300d28cda48ba74c2217bc1990aa7a2b25931bcc89ca580ce433cf0201e9b443d808e4406925b6a4a90e9963c6235c742a0ecec87a59e4783ee48164e163b5b78d764f4380a58e1596c7a0b06a78cc26bbc130382bca7e5c863bf635a1f4b4b42cdcc6e788cd6a26e3f89e56af5e83b43b1d12b013282206", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720800000000000000f0719456a072c6baab714eaddccad1b7cd93fa97fe10ecf990edf381e0c1230a40420f000000000000122400e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5000101011fe5381fc3b2acb103f880c2fa9ad52b41f7e792f6dc84b320804531020b477c1dc21fb2afc6b440e441a462e0cb714eda89c7782b0e6c7f9c26f392bb57c307", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720900000000000000062e7b16ad9bfc59a985b0f3e5e68d0c6e28c73355d6be2e11cf8f945ae463ce40420f000000000000122400e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5000202032dbd24bcab531bb61e3759b44e48aa90009652aecc1ac2d66af737af13b577f47adf927eb619d29f59395164eac2f2d3a363c0e4d1847527e8d3b40da9c5ae02", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720a00000000000000fdab89363cafb8a44d66c7bd763a25da8917783ffcf4a97bfd36c70455c2307d40420f000000000000122400d927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c520001000103d7b211d87104be28d03b83d15a94431fd9253524acd08eaea84a500ad9883c12cef58ca5016c10185fded407b57717ef13c5a600ed11818502271390122609", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720b00000000000000b2915db782fe866d5dbe91dca3b09c7e9d7d677045feb73cfa3e5a2881edc11b40420f0000000000001224007d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee000101010e426f3883cc38a43b114bd429ecb3059f7d86df5569989b55cc45f54a44cd9e3a4a459961bb0a1af8030633d23fcbcb7d5fa39c0352ac0c760999e35b2d6908", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720c000000000000002b70c96549302cc9e63155fab6889ca46f91223f5690a2c21ab7081331acdc73002d31010000000000132200e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50002da3a459c92f7c05ffc10bfa3d65ad4387e2deb2b0152056937992ed445b4acd95eb5b93826b09f3bd959da3d8c87a7bbcd4d6f461bebbf8917e5991fb7367b0a", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720d00000000000000041812e956c700e749826b39425905b8034c109e6deda9b07dc4cc106e419b1a002d31010000000000132200e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50001cfebd12a777c322de9cbd0f5f7f47aa305d741a1887ca8eb9d5c5e88fbee77e52301a011319877a391756aef65f5fcce986d7956539612a97653fec894c4750e", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720e000000000000004a9d94ee96ec81db8f434cbf8d46940217d1ec0849ad66769beecda538455b34002d31010000000000132200d927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c520001f9ecc31703ca5a1f00b6cdf9196e371c49a1cb0ab5bd5125835798e52017cf7501e0341746a3e9e81ff559f805b0de751bfea43b60edf33a7a1e808b06333b0d", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720f00000000000000e4fab4da5c6f3c166c5ce005bdc60c491c7137298872ca63fb252d8dad6c1925002d310100000000001322007d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee000124288a152f94c15021ffa82d68b2c9fc1351e4b8fb4a21a345f6b85dcaa0bb65ec93c2f5d9ac406b54064316618582247c4166345156e9aeb3e390580403c00f", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b721000000000000000e8f976794e72bb3e1ac846a01f930aa7181468e136a25151275e77a34fca1c4ce09466010000000000132200a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10002416e0b9f31fedb053ead6f7fe918a3542a9f4f715bad8522e9d77cfaa07d04dce798bb36c48ece9e60cc75deafe5a90afca0185ccf00401877717a3a5384e705", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7211000000000000007adb989ef3fdca75b2116a3c1d8ccc32f9726a370bb1fe74a778367b80ef9b13c0286b01000000000011210078a50426ccfca7ce958e1c52db484fc712687799e1ff84bc4cdd4182aad891c60182ff63588f819d513b3adf9234be70f92276eacbf740d9dd6a2887b35d67ae250874c98219fd203dd46380b790fa11523ef3d647af4bf2c29b6f767fd67d440d", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b72120000000000000046d9ca416acfb977917660e77d1c025dd21fcab6b9c77a84be1ba34126ae4705c0286b010000000000112100a764a37268db038e6a6700c23f1e1b6ded3fd817e2faea48b1e62cf20cc65cd001961a1543c72a2ed7cef5e60a729057980ae0333d3ca172d0d7765ea3cb53e37869fc96d783d87f199d84e403a6590b9cee396e80d8d4a11ddf2c1ed7e1a09108", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b721300000000000000a5bc35e28e4dc80e1246f65538b5ee2d5ce1e63415726c1ab0424f4b3082ca49c0286b010000000000112100a2d8bca2005c2ba7300d28cda48ba74c2217bc1990aa7a2b25931bcc89ca580c01b85d69bae728a80312847181411cbf1b857c7c904c6e3ce393731ec05a8b902aa943ddc1177eb5a85d89d3b8188b368cbb8420bbafd9e518364260f9f7f83704", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7214000000000000009136003edf701bb862143262e21c22fef7493df56a28db3557c789a1e7cd2c4bc0286b0100000000001121007d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee018afe46c99845ba0d7af81f03eb2c8c4067f34c8674cd33106729df8cfd81c48d21ea9df9ebc4662931d865c3a95683c870b3115a1383f2813967b278803c0109", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7215000000000000006f83d7703375750f5cca72fb4c1179c04f2b65202682adbdb3d67b1ea13fc91ac0286b010000000000112100e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f501d906868dc6a495c8188516e2e90a24fddd72396678bb9bf6a699921b0603cfae109e785229a8e9589bc9f8631239e41060170d7b1139b39050dbc85ad4d0ec08", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b72160000000000000095a40cc34fa91bfb041448d1ceaa4d3a30716a6fcef532bfd452ff00242dbe72c0286b010000000000112100d927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c520101de18404ca29dde16299566d3688d1188d8124540fd37c7df87457a4b87d94236d6ad5ba1bdaa6b861505e004378c094de1aa08a45057209e1f972f4443ee0a", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b721700000000000000ccd8e80adcaacc780695d2f91dd925f4a4e666adce7e40b7aed60d8e9fd41dd0c0286b010000000000112100a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c1017b0e0acca851520158b977db04889ec317c5b3b63399ffad2d8f1fa2a3e16a584163fe83cf09e6fc88bfd8320594a3c6d25f2979120a79eb4205f513158d4c00" + ], + [ + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c520000000000000000000000000000000000000000000000000000000000000000000000000000000080841e000000000000092500e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f501a00f00002de246b73724b5efe6fed8b8b500d8d4db72cd1a6bf1fe44a0fcbc1390d38c8b7c34efb79c4f52745b9d945ea0e09b83f2d3ea6e2ebc63ee72cc83963b457e0f", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c520100000000000000b2c4d5251f98cf34d11f86821c2cd542f6bbf5152a07ad54b271f65b2530901880841e0000000000000925007d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee01a00f00001bdab77a3690419feb21de999193a68bf7856807f63c37989d8b1d0d26bab830f17be4ae69e686f15b5f9f58510474fb68a294e32145e972430955bba78f5308", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c520200000000000000b7091c801fbc133089d9612f76d94401ffd0199edd399f9db0beaf3e8a611d4540548900000000000008160004000000020e00727573686564207468652072756e001895215217dce05b5b18cc8f8638ea08e01ad7077de8a741852f15db966b6df81d9603c321949de5dfe7c53fbc553afe7a2439bc18def689a61e9afd2858670b", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c52030000000000000078223b1dc7500f31098e2ef4ae4f615e1eaa5a06e5f3a19c0698970771536431405dc600000000000008170004000000010f006c6f76656c79207068726173696e67003dde71eca895d2587649a3888baef3917077bd6d500d9fcef2348c70e6590bcf16d2738a9bf9a49c30b14d22203fd088c8f492169118a20b323c955172daab07", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c52040000000000000091ef0040cd22f692bad52da2aa2ee4ff3495d571373249b21f7488b583368af40024f4000000000000092100e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f502159e513cebb1af6f51733013724825fbd4b3301b94c9c31c10b4011ab35bd7e4590002d82faadb93cb25ffafd19a236c5caed905ed849d7c246177d48908450d", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad927eb9f5070076df3e4dc37934542e59028145ef587af8e71dc001a4ba81c5205000000000000007ad53acd82e3e7767b6fe17bf1e5cbbefc07729bcbeeacbc71387e043bd5de8a0024f40000000000000921007d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee02feb7e48b31bf62d8b7974e1c15b19f2abfb6190cdf8912b00c9970b386745e81beec63bfc20c7f8046f392aa238f96f0a41a0c8f71095c4e7405c5b21ee55900" + ], + [ + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa78a50426ccfca7ce958e1c52db484fc712687799e1ff84bc4cdd4182aad891c600000000000000000000000000000000000000000000000000000000000000000000000000000000a02526000000000000030b000900676f6f64206c75636baba18e36da1e7d557a55c40c03a8f89ceb77a4dfee113e44680f91c25b60bf8220d0cf49ab0a9f4d1b42b793b90e596a22107b80c7db3a6095749cc3e138bf01" + ], + [ + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa764a37268db038e6a6700c23f1e1b6ded3fd817e2faea48b1e62cf20cc65cd00000000000000000000000000000000000000000000000000000000000000000000000000000000080a8120100000000000307000500627261766f94766cf3326e298ea016d3784bb748cce1ae77e4e939b4a75c7bdb3a912978c251a3935f53acea5081479ea000604095c3ce85a53df644491cdc5a0ccec3a803" + ], + [ + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f500000000000000000000000000000000000000000000000000000000000000000000000000000000c091210000000000000c7e00a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da00000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efad5feffffff0039276d6016497f70ab9d2a5f1ff179a1070b1016d8cdbde6791792f00ada0133af241e3b99a3fca2e21369598281e46c89c41553c97855022f565312fc32a10c", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50100000000000000d7b83f99f213619227fbccadf7069c3f6cffca8e86f2aba6ffb8d15212698fa5e0a57e0000000000000c7e00a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da0100000002d7b83f99f213619227fbccadf7069c3f6cffca8e86f2aba6ffb8d15212698fa500000000000000000200000000000000880211aa301be185e15a6c1895c2d43367360f1104ca7e72fa3c576cf0437c1b000efad5feffffff00cff0422ccfafb46431eeeec478c887b9a5609ed42f7b3b79c0b4c20ae6d87c375a6160907635a9fdd4a3990b2a4dcfdcf4ca46123c7e44dddca935c3354baf06", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f502000000000000001be10b08c6e09a1b9314f45c65bf3c9b6bd507cfa5df3f013d50657245ee48c5602a9d0000000000000c9e00a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da02000000021be10b08c6e09a1b9314f45c65bf3c9b6bd507cfa5df3f013d50657245ee48c502000000000000000400000000000000c6cda45663cd175aa9ba5f30289803a8059baa9924a9f919ef40d91902ca7e00000efad5feffffff01bbf572927af2d03d45aa66c8f630bda9d29429e07e09a3a3d6c9a8d933326244bec776069cf37a98f02833ca20fb02b81e7ccd6dff6d55266db73157ecb1002955cc3aa3b3d1a698be7314dd222b0b61676b727c6e3ed6b93394f4c55dcd100a", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50300000000000000602f2236c9c17b8a1cca6bae144f8f162627d27095a7256e1c5b8bc199c84fb3e0aebb0000000000000c9e00a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da0300000002602f2236c9c17b8a1cca6bae144f8f162627d27095a7256e1c5b8bc199c84fb304000000000000000600000000000000249f88d1dcac0f7d98b53d89fdbeb22c284ffc97c90ff18a1ee27980e3ce88bd000efad5feffffff01eb6ddc57c1c32eeef5f7ff5f2a73f33e16684a4b4249d3cb0b99f72adb199a21bf6c5f49688d465cbdcc26c2dd73ed5b9ec157bf86dba5d2dc0b44e4112193a511a1fe886a482e6876c09119c470ce35e7a046f9d60df4b4085bb7c2093d9309", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50400000000000000d535c9375be68b107355dcfeaab2a78192ba09570642f09de57b7bab1438eadc6033da0000000000000cde00a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da0400000002d535c9375be68b107355dcfeaab2a78192ba09570642f09de57b7bab1438eadc06000000000000000800000000000000cef53df7a17ba27234381bf4fb47ad712b9f2aab80d4f837db1155d18af26a55000efad5feffffff03eb6ddc57c1c32eeef5f7ff5f2a73f33e16684a4b4249d3cb0b99f72adb199a21d75f76241ecda381c6d8d9232daab10b13803e2fe52ab86871c6bca67199fef3c6cda45663cd175aa9ba5f30289803a8059baa9924a9f919ef40d91902ca7e009d53f633fc2fae20b44ccc38918c8ac026ebd6fe90d3548fbe195fec26564bbdfa8ae5862663306a82c0680fc9ad127d5cf6304e92beae4ec0db27c4b54e8700", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50500000000000000703cab1c2158dee2277fea9a9b909df1f7926a3a56996b7db1bfbaaba40ffa29803efa0000000000000c9e00a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da0500000003703cab1c2158dee2277fea9a9b909df1f7926a3a56996b7db1bfbaaba40ffa2908000000000000000a000000000000008883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f25000efad5feffffff01b09aef291cbbb9927cefbbb3a26f4c2d4689a03a6b1cc7f938ce9c615890e9dd16de4bf19b3cfced2d0c7afec09ffdbafe2275901f940330ff39faecfadbc6adf3a784f003d44b0153b753eb6afc1cc30c047dd373457fd21f31de384709060b" + ], + [ + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee000000000000000000000000000000000000000000000000000000000000000000000000000000006018230000000000000c7e00859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf69281000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004039d2ffffffffff00727cd67bbd0a01562d596da5eec92f54c9f9ff4c863b4f7eac3a1d9bf2c762f287a80b347596f5f98eb11463381d7729ee84dbc2afbb52d38d4172e23497d005", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee01000000000000000571c24d887ed7ee13662e1b6b5916b05446674f04a48bb9657a88aa791aa4f7802c800000000000000c7e00859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf6928101000000020571c24d887ed7ee13662e1b6b5916b05446674f04a48bb9657a88aa791aa4f700000000000000000100000000000000ea1a9c44b721ca2a583fad19bca966298c4958034505c8143c6779e0b73bbd9e4039d2ffffffffff003171796be71e8f39fb36708f2ea8a5c0f9290bb7e2f029298d6df465b6b6f7f89715239ea8eb94b4b5e1747c48c82b01ea80c183879adca17efcaf3a45146204", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee02000000000000008c7c1730862c2541afc6faf68f8f1a4b34c99f6c9ea331b8be3a60e97734ac8100b19e0000000000000cbe00859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf6928102000000028c7c1730862c2541afc6faf68f8f1a4b34c99f6c9ea331b8be3a60e97734ac810100000000000000030000000000000075ea44294bf1e20d670345b52e104bd360523168f8b0046b23a6bae059558c5c4039d2ffffffffff02e1a39c21b47bc7d6c78d0678749d84614817a2fb9b0a7dcbf19e940ff564df98a0a547193b22c6cc66acb6f6c926bbb61155ada07da896581acf52eaab6c2112b0c76a9550457dd487ed407b529c2f5e6df599da73b966801709654bd5991bd3ad6a930521ff1b4c63561f13a285c964df44cf4eea7f2ff5c013070e652ae001", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee03000000000000004bcc3352c9690a6b19b9aaa4301286ce746571ec9a1dfd777ce3cdb1ab47ca1e8035bd0000000000000cfe00859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf6928103000000024bcc3352c9690a6b19b9aaa4301286ce746571ec9a1dfd777ce3cdb1ab47ca1e030000000000000005000000000000003935b6c803043cd12ec5bd53c252b49dfc9ca51a329fbc669de2c40288a414934039d2ffffffffff04a0a547193b22c6cc66acb6f6c926bbb61155ada07da896581acf52eaab6c21123ef26fe17f9c983fbd0f910c1b02459555aa96cf6bcb0b9b4ee374c6cbbb4890903e2f87b64d80ebb638e313ac851980a6667905bb6fca955b2786600ea9cc45c3213641a266ecdba0b17573dba5aa10ad9d831686d7e4e4248174f065e0c696a3a31821a93f6e49030d4cf063b8fe4cdf87bdb4e06b59ede349228bbb2d6c3ff83d087fcbb4e8ce4f98a341842c838b0aa852b70587bf0bb1934ee98cb0ed00", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee0400000000000000a6e6c44a5d482193b91fac6a4b86aae708a8fe967079b4dc31dbe6e7da840cab00badb0000000000000cde00859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf692810400000002a6e6c44a5d482193b91fac6a4b86aae708a8fe967079b4dc31dbe6e7da840cab050000000000000006000000000000009a192de50070c39f440893ca66028c0fde3db238081fadf11e676d5cfd6e16bd4039d2ffffffffff03c3213641a266ecdba0b17573dba5aa10ad9d831686d7e4e4248174f065e0c696de40ac758d31d7dcaeff289171af8d3adc07c59cab6f3faaaae3ab769b9d9ce8c40d49c1602bd6fb0f81d107ddfcc04e9e08ba6bb91af36c94d2a7157e8b7a32b1e1ee7336f42352bf73ecbe68563bf291473c749aea18045e1f1f886c28c1cbe4e4c236a411f76e71fb0917b6e2c4ecdb404934f1dfb4af040bcf2c4dac2d01", + "57455631012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee05000000000000000b041b0865ddff65ae4f592bac31b3e3627cb44ed3bfd4678f33dfcdd03c9e6820c5fb0000000000000cde00859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf6928105000000030b041b0865ddff65ae4f592bac31b3e3627cb44ed3bfd4678f33dfcdd03c9e68060000000000000008000000000000005b8ad24298b11d4afe4acabf254c55d99e1badc4d20a3f293fef3c8e9870e6eb4039d2ffffffffff03d3b72f96114a9bdb8b730b48a4075a66d0b5c8641ad0c2e05e35a52e0baa7cb2b946fd25fcd2fff7393541ee8d0fd387535cd9280821cdabfe528936c6784e88c40d49c1602bd6fb0f81d107ddfcc04e9e08ba6bb91af36c94d2a7157e8b7a32acef80c4845b7fb19f6fd811a561f427d385f5066516b6ffdc70555d940e0f9f70edee43ed38e24e8d6bf93e37bfcea45df6423cf20d46b0a4bbe0ec33232501" + ] + ] + }, + "receipt": "574d5231022c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa8be2039bc5d06e7cf9d0188c3f22c659f1687b08b69b97f50b134552c46da783000000000000000000366e0100000000028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a21a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10280de8002000000000400003a9800000000016e360001c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720100c31801000000000400004e2000000000016e3600010265b94ec2ec2932104a7583c08050f61547332fe434464d598cad6464025b3040b598d58ceff895b484641dfdea9bf329f40b464895eb31b2271a83af17cce7fb0a000000d2e2268edd1bfc8a0dbebf1f2287b93e200bc8affd02c3e92ac872b3200731a103000000d290530d77935fe173d0d5dcbb2588170f730b423f93543b4f3ceaee06d4e78e2055cc0400000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000070000000000000040548900000000002c00000000000000f000000000000000002d31010000000054366100000000000001040200000080a1990300000000455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577080000006cc71f1f881b4962c2ff15d8a70c76f6539fa47221af8686664bcf683598018f0000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000694e666812a794f689b2f33591a4b1172f73786ab626a446e9445c10c0a5a00c1c7b78aa7a33ddde167b170dd8c3346a442b6979011879f70e9c6ff58a3d8003", + "hops": [ + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7201000000000000000000366e010000000000c31801000000000400004e2000000000016e360001110001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939023a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f011700000000000000e0040700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0242000000000000004024140000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b6030000000000007094000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366502d80e000000000000c05102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db013a0200000000000040ca22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db023a0200000000000040ca2200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c2c18a1d4c5f9a784336c16e2755ec99f12ba6990cacb81cb23f94aa048d6034013a02000000000000485904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000011600000000000000781e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000002cd000000000000003cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000001720000000000000098850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000002580000000000000020670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000f00000000000000008000000a6c37ecf5177e5e8d350fcc7c97ae32f9046bf15337e07d97453cd8dc79f4aa36d8d6332a0f2a20836f88a057863237aabd71abb0b5f41b8fed92fbbf04d851f567827e521b3ea570cdb126bc2c44e7940eb33690b8244e00abee459e82a8302", + "ledger": "0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000002000000000000000000000018600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018566202000000000c2a9846621d91f9309170b29b95e158e278002ce4cc03a2d097917836a391c0ffffffffffffffffffffffffffffffff000000010000000000000000000000d0870c0000000000a087630100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006dde44606fd8377d9fa0809b2b36b708de3e6119d8c1c3d1f0d675917c28c6198096980000000000ffffffffffffffff000000010000000000000000000000709d0b0000000000607a60010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000e004070000000000c8431200000000000000000000000000801b6801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf4a5892c8a1bef2afba730a4ec868d0830f9355d10f540b757205945c588cb5ffffffffffffffffffffffffffffffff000000010000002c720200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1ee853e5c092553edc99a0cc2468a7307afd83533a3a34f401b0695da343314ffffffffffffffffffffffffffffffff0000000100000020e53600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d436e9616073a533831cfbec646020b5d4dcc9d1df4b792ccaff6e7e23ee686affffffffffffffffffffffffffffffff0000000100000014b400000000000084e022000000000000000000000000000000000000000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e433cf0201e9b443d808e4406925b6a4a90e9963c6235c742a0ecec87a59e478ffffffffffffffff6400000000000000455552010000000000000000000000d0870c0000000000c0f35e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c1020000000000000000801b68010000000080de8002000000000400003a9800000000016e360001050001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f021700000000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b60300000000000070940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000b2083f6a8d3e1c901b93bfb87f5ffe83344214430e91d08f4e422c5ac7f0c0869f25a4e826f34f770f8f63bcea36ec697bbc398f81c06aa8ad11bb1f7a33323de1911cf31bd046195483ef8a8b22a5778adb66cfde02d9e8f8e46360a5577b06", + "ledger": "b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000c843120000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + "descriptors": [ + "57434431012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bd0000000000000000a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10005d00201101010010108000100086665617475726564056f72646572000000000000000000000280bb0000046761696e0370616e0c0c13afc5df1dffed9f80c566f13be392cc90ad1ceba5db69473a7993f8a7ff2e64cb5d094b2fdf651392e4a2d4f317cc6a436ab9b0cd5afe626493549677937002" + ], + "compositions": [ + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f000127a00000000008a826f7851f7a89f5ecf581141292c7f69e9d004ed08b01d25dd3c66e30f43f602540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f08000000000000000000000000000000c264cd78485650e03db23e16774c0566ac52d21be1b9edacaad39fa34dc3100c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593908000000000000000000000000000000e43f0568538eef406fb5ed7901b131c0b789d9c0fdb04d61d590af9bec169a1dd2ed35929ea1d408e2da06ee1c840bacab38929016f1a7ba820a80472485c9c6159b98672266a380458e260007c2baec97749e4941eb6ac370d1660fb0e5f900", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04054890000000000ee27588426463e6a765b4b8b5791670a7ad61be12ef1995102f9220928d6038d02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f090000000000000000000000000000005e05448cb224cb6aa2726e4c0fe448b127e032169bd2ffea55b4693d53ef487f01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593909000000000000000000000000000000f993d88a6b1a587e0980017103aa4fcdbdf1d7b1c948f95a8bfa36a26493bb1e89b7c717020a8a296d3688d7988d8f2e70e54228d60c58514564a12937b2bb9421199fdee27ccf49acb52a32fa0f698b3eb5b28c35c47a797ae5e7d531f7db0a", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f08096980000000000d8bb5ef530c1fe8d1a0478d5ae231aac802d9f99dff906a66aa111420948048a02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0a000000000000000000000000000000539e2bb145135d7de5b00ebf1b1178f83ef60d1b5ceedabf98bbb424a1d0a96301e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390a00000000000000000000000000000031a3cdcd31f70593af11aaf7bc4d22cc1ec5c18ee0d918fb2edd5a9c98b5a4758e74da34c2fb00e235278a3010c44dac99131fa49acc910e04f3929e7a6014833b553fad2cd31d127ad862b76999324556e76388192020c8022db9db6cafb803", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0d8a70000000000c65182e1c2868d42d9c1a244545f3c3416b14e481ade5c42b1979419f360b3e502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0b000000000000000000000000000000491fe4bc5c4bafa0066ec9c2baf4b4287fcd09a778e36d5996a97ab827b7eaae01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390b000000000000000000000000000000414a7eb6f2353358646d5b861979c533b344cc01fb9dafdb9d6518c4ad7e3f6f01a03c915891dac04736b7858fdf34c4137e10f593ab5cb3a64900914b360f6b242ee3ead8c5499f325411942dbe827bd51176f2b049c4453a654c49dc701b09", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0001bb70000000000381618c2dfecc2dea3881cb1d4ed69e43dec01f07ebda92e08cd08ff935ed44502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0c0000000000000000000000000000001915289342627f7f5a8bf4ccaf04c0418735ae65e41ca8692ebd3fca27ea764b01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390c000000000000000000000000000000194d05dbb7218051137b7537fcb320653e7f67071a19ae363969aee47cf08bede3b8b1012f1fc03a132f8793e0eae4389c23da524a7f6482a1d5cdf26ff04249cb81d4f19d8b164ec8eb381c66ba2704c57c7bb6f2389114f14bbfd632199302", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0405dc600000000007629d9fb8d6ac9e846d7ebdbe0a3a64b29ad51f7e4db40be5f96e447abcf6f0202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0d000000000000000000000000000000f98b3489983bd0476673dc05db4f09c092411512ed2da6578e9c254eee0d72f501e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390d000000000000000000000000000000bc87dab2315f8ea4f21a4b5adcb838b8d89f6d67f93bbdf5bf175069ad81fa5d123e5e3721d1b781cfcc4650a2d571df1142f2160b377be26b692636e885cd037553b9041ac8f13b1f2064568957993ff69556b8673f0ad6e6caafd8b4887c07", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0809fd50000000000d32fbadccdb9742ffff99344fe07069e2e89b1d7f2d99859ad48336fadacd7c202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0e00000000000000000000000000000053c09229456148744a940ba828e839eca0cf46d7c15e2c3533b4c65dcb0b4ff701e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390e000000000000000000000000000000b5702d26fbc4708196f576c1d46b7fc92471154fe81689707069bcb43173ecedc36859b37258c17a4294d56d36befaa9fbd975ce62e5deb542372aef4c9240b43ba584fc98e7c5a5066e1ba4060e96ca4e50daa116366c3aca9dfccef285f405", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0e1e40000000000fe93ba9f3d79ff2d3aeb01726ac4728adf60676494fbd0e596f5972be5f4639102540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0f000000000000000000000000000000341b9ec871ad41102a671b153ccd014f32cfe167bf5cca3989470a574196d0a401e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390f0000000000000000000000000000001eafd27ec73cf8676b02ebb4fa82a5bc67b2298a442322797db8cd996f8866d7bfdca1dadbfc723c27a3b6963a74c78570a41403a9cb454643631157e8bddbda8ccd54062aeec216b94406595aeb140b59afd5e697733f45980831357c0bc804", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f00024f4000000000092a195ef7c5e97512b5eed1dd778db0bd1f1c75cf8cf25b61ec800296e459e6302540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f10000000000000000000000000000000c693ed9bd4639c29ceb962b071e0531512929a139ebed7c5e12989d28b316ddc01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593910000000000000000000000000000000c5043e90fe94a06a8b47242bb084c7dc5f8e46aebbe9b2c5a8db30d44d1a8b55ab981922c453fc2c78b58f7ec56293bb26d02c335079fdd1e246e33607ef473f513bd939cfe20da8b94af0963156c7218be49ffd1efbc9c14429fddf91bf5006", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04066030100000000d00e25bb474153c30c4bf88f0fb890a0dd10342388c0be87aa93399d54bbaf5502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f110000000000000000000000000000005f50d92c07b2f57953a701633e9d59575664bfe9b13644d5db11c5d04629b08c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593911000000000000000000000000000000339aa736ed16c43427079481a1b58bb9d370f104bbcba7a9d915ba1528b1a75da2dabf39b4d5d2518a8bef4340b8c5e7b32250ac222cc3e8648a42730b81eeac78da15f7fa7f42f7bb131311eb22aa7f89ada8940b2dd41c18c113a694a50808" + ], + "takes": [ + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f559425465004500032d6893f980a7dad483af70b4e116a10b7caa4e2052593699b2c4d5251f98cf34d11f86821c2cd542f6bbf5152a07ad54b271f65b25309018a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da0f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba1307020a0000000000000000000000807f612a01000000c0c1702a01000000300000000000000037090d56c333ad6c4392ffbb8f80b7854c7ae3d562e182d6b76685f99db2ec1f0100000000000000c0c1702a010000000004802a0100000055000000000000003b9b3da8c3121692dbe9b75ff7b37a77773cf7d71d8b7c885253d5b3855c53b902000000000000000004802a0100000040468f2a010000003a0000000000000097f5ee9829746c16c29946a44489846e4a385eb6d62804ba22a18a99a92642ab030000000000000040468f2a0100000080889e2a010000005f000000000000004bb0df0483b6370199dc9196f695ec65b029d8ffb09dfd7ec24bf5d5c59a72f3040000000000000080889e2a01000000c0caad2a010000004400000000000000733b22d5d80b9a80443b60a14334000a8ab43f139364fa9cd3a547e8a7c523640500000000000000c0caad2a01000000000dbd2a0100000069000000000000009395a39fcaaab116f14a5e4f1e51abe694d712e0f912827045471c6283730a480600000000000000000dbd2a01000000404fcc2a010000004e000000000000002b869dfefc2fe0873e06d23c09f1629470a788c6b8f2aa8e6aafb1298cd73fe60700000000000000404fcc2a010000008091db2a0100000033000000000000009f10cb7a3feccf63f5c0c398375eaf998628d314dc8159d15845fe5a0f8a006b08000000000000008091db2a01000000c0d3ea2a0100000058000000000000008b03281ec96d96d0e76e48ef184b7a60d4856eddf77629af961fe54746404ef60900000000000000c0d3ea2a010000000016fa2a010000003d000000000000001fb42eb87b4ea4dc72d02c9e6ea82aab91be4bbef122892b8921e2f552a462678883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f2506000000d7b83f99f213619227fbccadf7069c3f6cffca8e86f2aba6ffb8d15212698fa51be10b08c6e09a1b9314f45c65bf3c9b6bd507cfa5df3f013d50657245ee48c5602f2236c9c17b8a1cca6bae144f8f162627d27095a7256e1c5b8bc199c84fb3d535c9375be68b107355dcfeaab2a78192ba09570642f09de57b7bab1438eadc703cab1c2158dee2277fea9a9b909df1f7926a3a56996b7db1bfbaaba40ffa2970412cc3dc8306ba8f88774f1a622d1bf21b9ef51fb85b990d279f66fed977340159425465004500032d6893f980a7dad483af70b4e116a10b7caa4e205259369900000000000000000000000000000000000000000000000000000000000000001f250bafd7daed705bd36f8138b7419700ffe4c20991a2a46993dfd25b592a3643977ddbb511d2b51471498d51135c1a724a069a507032f2a3ff93aaa9787f0d", + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee2b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c6b7091c801fbc133089d9612f76d94401ffd0199edd399f9db0beaf3e8a611d45859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf692810f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba130702080000000000000000000000405489000000000010679c000000000030000000000000008fae533ea900dd435a27c7ac6bbe43a78ca53f4ac8bf916accd92a8d374cba94010000000000000010679c0000000000e079af000000000055000000000000006cb63b81a4b11a270dfd91c37eaaed324b1b55999789174218e9990aa186455f0200000000000000e079af0000000000b08cc200000000003a00000000000000e515ec9e690d2bf9be7ce9bd8547b84406445c82682346f3cf84ccb305cf4ae50300000000000000b08cc20000000000809fd500000000005f000000000000008ab19bbbd6173bd1339419c327fadbf9337f7d77aff9e7082ee68da5132756c80400000000000000809fd5000000000050b2e80000000000440000000000000017fca124fd9c32581a3a6f032bc985481cef9852f5f07ba3120fd851511d20ba050000000000000050b2e8000000000020c5fb00000000006900000000000000be2b55d6011931c758ef4700f002f24a947e8e95428049653bc0fc44055b5563060000000000000020c5fb0000000000f0d70e01000000004e0000000000000083da93c67f107a2933b1befbdaaf558a44b2adf41cd3e085f1d48767e8dc3fde0700000000000000f0d70e0100000000c0ea2101000000003300000000000000989f78372ee677d01a1a45c0f4e33989e1e30935ef1f70e0426de38e2cb5ae8a5b8ad24298b11d4afe4acabf254c55d99e1badc4d20a3f293fef3c8e9870e6eb060000000571c24d887ed7ee13662e1b6b5916b05446674f04a48bb9657a88aa791aa4f78c7c1730862c2541afc6faf68f8f1a4b34c99f6c9ea331b8be3a60e97734ac814bcc3352c9690a6b19b9aaa4301286ce746571ec9a1dfd777ce3cdb1ab47ca1ea6e6c44a5d482193b91fac6a4b86aae708a8fe967079b4dc31dbe6e7da840cab0b041b0865ddff65ae4f592bac31b3e3627cb44ed3bfd4678f33dfcdd03c9e684fa04199a174e37753164a4ac950986de9a4abcc3c2cdce827249a9f063289b8012b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c600000000000000000000000000000000000000000000000000000000000000008fdd3b426a73d6a2e5ba04781aafc491c5950f29be46baca5bc57f7e54ba95b22dee29ffae444fb5eeee0e941d74e4e71f8dffbe4f45979a1e8c49aebc023c0c" + ], + "logs": "[[{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":0,\"ts_ms\":1792108800500,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":1,\"ts_ms\":1792108801100,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":2,\"ts_ms\":1792108822500,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":0,\"ts_ms\":1792108800510,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":1,\"ts_ms\":1792108801147,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":2,\"ts_ms\":1792108805510,\"event\":\"stall-start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":3,\"ts_ms\":1792108805910,\"event\":\"stall-end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":4,\"ts_ms\":1792108822510,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":0,\"ts_ms\":1792108800520,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":1,\"ts_ms\":1792108801194,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":2,\"ts_ms\":1792108822520,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}]]" + }, "lesson_mixed_classes": { "kind": "room", "room": { @@ -1619,6 +1880,69 @@ "receipt": "{\"asset_id\":\"video-base-01\",\"components\":[{\"id\":\"v\",\"index\":\"index-v.wsix\",\"index_digest\":\"5ffc2be3f21af79078a1158e3d669e4268a35b0ca61a6e73ff252fdf38f346d0\",\"media_class\":\"video\",\"stage_root\":\"bd0c7799633b108cf9ccb0c7a4cedbdf6173a83470d3d96b94d075c03e0db7b6\"}],\"energy_provenance\":null,\"grant\":{\"capability\":\"wai.video.package\",\"funds_ceiling\":null,\"grant_hash\":\"0000000000000000000000000000000000000000000000000000000000000000\",\"joule_ceiling_micro\":null},\"joules_micro\":0,\"kind\":\"package\",\"packager\":\"builtin:wai-pack@0.1.0\",\"parent_kind\":\"none\",\"parent_receipt_hash\":null,\"policy_digest\":\"e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e\",\"receipt_hash\":\"22c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728\",\"sig\":\"4554bd1c09aaa4af8799e37e2379cde9d341c7982a6d31a050162ee075c07f93c507abfda9c8223e70b9c56a4dbf9cee626ddaa680bd807fb4eda1fd2f885b06\",\"signer_id\":\"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD\",\"signer_pubkey\":\"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0\",\"stored_bytes\":119779,\"total_bytes\":130963,\"total_entries\":10,\"unique_objects\":8,\"version\":2,\"work_units\":10}", "indexes": [] }, + "package_run": { + "kind": "job", + "request": "{\"capability\":\"wai.video.package\",\"deadline_us\":30000000,\"fallback\":null,\"job\":\"pack-0001\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"package.build\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":1,\"unit\":\"packages\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.package\",\"divisor\":1,\"endpoint\":\"pack.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":4500000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"package.build\",\"price\":400000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":500,\"unit\":\"packages\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793000000000000,\"attempts\":[{\"billed\":true,\"end\":1793000003001000,\"endpoint\":\"pack.alpha\",\"error\":null,\"hop\":1,\"not_billed\":null,\"outcome\":\"served\",\"outputs\":[\"babf91ecf373060e4069962ff122c454a07d6abdd669a2175a5b58768f98b659\"],\"receipt\":\"sha256:7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc0\",\"start\":1793000000001000}],\"candidates\":[{\"capability\":\"wai.video.package\",\"cost\":400000,\"divisor\":1,\"endpoint\":\"pack.alpha\",\"energy\":4500000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":4500000,\"expected_cost\":400000,\"expected_ttfb_ms\":500,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"package.build\",\"price\":400000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":500,\"unit\":\"packages\",\"via_fallback\":false}],\"capability\":\"wai.video.package\",\"deadline\":1793000030000000,\"decision\":{\"decided_by\":\"only_survivor\",\"runner_up\":null},\"fallback\":null,\"job\":\"pack-0001\",\"kind\":\"wai-route-record\",\"operation\":\"package.build\",\"order\":[\"pack.alpha\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"eb5385c0f626d3b125bcb31b672cc45f59e6ab8383ffd357d737eed3e6fada05\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":1,\"unit\":\"packages\"}],\"request\":\"15527295015e4a0718224b2334cd3336b38a1ff1f2c1533c41501362152c5faf\",\"sig\":\"435167b39a169c3cb68a595f9732774f917704e064c2b403fd59d630f08fb3b0ad3817bfa41c31aaf29a6ea1041af6a0bb4a8dd9ed3d5c2afbc13680d2c82802\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc0\",\"kind\":\"job\",\"capability\":\"oer.job.package.build\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:25c0cbddb15e43d1ca68a2392454959950d5faf94d3af487ddb2b4980b20d2e9\"],\"output\":\"babf91ecf373060e4069962ff122c454a07d6abdd669a2175a5b58768f98b659\"},\"work\":{\"status\":1,\"outcome\":\"completed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"4.5\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"4.5\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"pack.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:d62df682518d51fc3cccc3a5f64402b8405579bd1519b1a2ec6f37cda8e2b225\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"c478a85210ec9e4a44aa2c9c9f93369bab1cb213aba063276feb1f7238dafb0abe38d61488689c6bdfb71436988e64379729d05e7b7d076ee75a78ce367b7c02\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [ + { + "package": "{\"asset_id\":\"video-base-01\",\"components\":[{\"id\":\"v\",\"index\":\"index-v.wsix\",\"index_digest\":\"5ffc2be3f21af79078a1158e3d669e4268a35b0ca61a6e73ff252fdf38f346d0\",\"media_class\":\"video\",\"stage_root\":\"bd0c7799633b108cf9ccb0c7a4cedbdf6173a83470d3d96b94d075c03e0db7b6\"}],\"energy_provenance\":null,\"grant\":{\"capability\":\"wai.video.package\",\"funds_ceiling\":null,\"grant_hash\":\"0000000000000000000000000000000000000000000000000000000000000000\",\"joule_ceiling_micro\":null},\"joules_micro\":0,\"kind\":\"package\",\"packager\":\"builtin:wai-pack@0.1.0\",\"parent_kind\":\"none\",\"parent_receipt_hash\":null,\"policy_digest\":\"e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e\",\"receipt_hash\":\"22c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728\",\"sig\":\"4554bd1c09aaa4af8799e37e2379cde9d341c7982a6d31a050162ee075c07f93c507abfda9c8223e70b9c56a4dbf9cee626ddaa680bd807fb4eda1fd2f885b06\",\"signer_id\":\"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD\",\"signer_pubkey\":\"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0\",\"stored_bytes\":119779,\"total_bytes\":130963,\"total_entries\":10,\"unique_objects\":8,\"version\":2,\"work_units\":10}", + "indexes": [ + "57534958010000001900000001000000050000000a0000000600000003000000e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005867fc2ae20b6764311037b4dd14166d15e011b93481df24fdb2a116be659ae80000000000000000000000000000000000000000000000003c00000000000000020003000000000000000000000000003c0000000000000019000000020000000200020100000000000000000000000055000000000000003200000004000000020003010000000000000000000000008700000000000000190000000600000002000201000000000000000000000000a00000000000000028000000080000000200030100000000000000000000000024761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d929b0000000000000000000000000000ffffffff040000000200000000000000f60c722a119439058495ee4b99919e3dd41aaf6abe6b39badbc7b0e9e9a157b558d6800000000000b600000000000000d09a000000000000000000000000000035c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f580a0000000000000000000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd3010000000000007908000000000000000000000000000061c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365de260000000000000100000000000000ffffffff040000000200000000000000ff43964375c1bd5277901262e213359564ae1d06c85ce9aca930247e28532f2c90821a0000000000b6000000000000001c2600000000000000000000000000007cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94ad2040000000000000100000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000f3020000000000000000000000000000c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf22a8c0000000000000200000000000000ffffffff0400000002000000000000000ac192ed19d0db9a162adfaa0dc76669f392e98cb3a1d7e26e14db15d42f6be119e4690000000000b600000000000000688b00000000000000000000000000008f748dc64787b5c5ece081270c8559277f926322dd6ddc345306b8231f2d1752c7090000000000000200000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000e807000000000000000000000000000061c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365de260000000000000300000000000000ffffffff040000000202000000000000ff43964375c1bd5277901262e213359564ae1d06c85ce9aca930247e28532f2c90821a0000000000b6000000000000001c2600000000000000000000000000007cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94ad2040000000000000300000000000000ffffffff0500020000060000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000f3020000000000000000000000000000618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481aa630000000000000400000000000000ffffffff04000000020000000000000085521683dbd317477d96484c48fd2c5176a131968c0b04d944385ad53df931b3b5ee580000000000b600000000000000e8620000000000000000000000000000761c4649427c51796a2b699568775765b209ee80d2f4fc1cf040838c6724aa2dae080000000000000400000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000cf0600000000000000000000000000000100000000000000000000000000000002000000640000000000000000000000030000010000000000000000000000000000000000ff00ff00ffffffffffff000100760200747606006d6f62696c6506006c656761637914007761692e766964656f2e696e745f6d6f74696f6e0d007761692e766964656f2e61763100000000" + ] + } + ] + }, + "package_run_again": { + "kind": "job", + "request": "{\"capability\":\"wai.video.package\",\"deadline_us\":30000000,\"fallback\":null,\"job\":\"pack-0001\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"package.build\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":1,\"unit\":\"packages\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.package\",\"divisor\":1,\"endpoint\":\"pack.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":4500000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"package.build\",\"price\":400000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":500,\"unit\":\"packages\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793172800000000,\"attempts\":[{\"billed\":true,\"end\":1793172803001000,\"endpoint\":\"pack.alpha\",\"error\":null,\"hop\":1,\"not_billed\":null,\"outcome\":\"served\",\"outputs\":[\"babf91ecf373060e4069962ff122c454a07d6abdd669a2175a5b58768f98b659\"],\"receipt\":\"sha256:2d893fbf25d3bc10547dba9222379326b4b1a7815478fccd454296b6b6d946d3\",\"start\":1793172800001000}],\"candidates\":[{\"capability\":\"wai.video.package\",\"cost\":400000,\"divisor\":1,\"endpoint\":\"pack.alpha\",\"energy\":4500000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":4500000,\"expected_cost\":400000,\"expected_ttfb_ms\":500,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"package.build\",\"price\":400000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":500,\"unit\":\"packages\",\"via_fallback\":false}],\"capability\":\"wai.video.package\",\"deadline\":1793172830000000,\"decision\":{\"decided_by\":\"only_survivor\",\"runner_up\":null},\"fallback\":null,\"job\":\"pack-0001\",\"kind\":\"wai-route-record\",\"operation\":\"package.build\",\"order\":[\"pack.alpha\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"eb5385c0f626d3b125bcb31b672cc45f59e6ab8383ffd357d737eed3e6fada05\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":1,\"unit\":\"packages\"}],\"request\":\"15527295015e4a0718224b2334cd3336b38a1ff1f2c1533c41501362152c5faf\",\"sig\":\"c1af247b08375d1602caae95a06c50891851e9d55bf2c419505424e6a734ef118063a77acebe0cd8f45a46c2d8c84bae809bdd62a12fb62ae2e417f9a019460e\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:2d893fbf25d3bc10547dba9222379326b4b1a7815478fccd454296b6b6d946d3\",\"kind\":\"job\",\"capability\":\"oer.job.package.build\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:25c0cbddb15e43d1ca68a2392454959950d5faf94d3af487ddb2b4980b20d2e9\"],\"output\":\"babf91ecf373060e4069962ff122c454a07d6abdd669a2175a5b58768f98b659\"},\"work\":{\"status\":1,\"outcome\":\"completed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"4.625\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"4.625\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"pack.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:a243ad15056843e9a44e5e8c87f6ce67a5c0352fe0167c02e98d388872cbd26d\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"5c7ff420d9ccc5973f04c2cef23fce818f7be4a8190644c1971bdeb974f6b91abbcbb6342212b9d93fd04bd7aef3ed8f43fe7adc35e51989728a3b026b14a201\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [ + { + "package": "{\"asset_id\":\"video-base-01\",\"components\":[{\"id\":\"v\",\"index\":\"index-v.wsix\",\"index_digest\":\"5ffc2be3f21af79078a1158e3d669e4268a35b0ca61a6e73ff252fdf38f346d0\",\"media_class\":\"video\",\"stage_root\":\"bd0c7799633b108cf9ccb0c7a4cedbdf6173a83470d3d96b94d075c03e0db7b6\"}],\"energy_provenance\":null,\"grant\":{\"capability\":\"wai.video.package\",\"funds_ceiling\":null,\"grant_hash\":\"0000000000000000000000000000000000000000000000000000000000000000\",\"joule_ceiling_micro\":null},\"joules_micro\":0,\"kind\":\"package\",\"packager\":\"builtin:wai-pack@0.1.0\",\"parent_kind\":\"none\",\"parent_receipt_hash\":null,\"policy_digest\":\"e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e\",\"receipt_hash\":\"22c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728\",\"sig\":\"4554bd1c09aaa4af8799e37e2379cde9d341c7982a6d31a050162ee075c07f93c507abfda9c8223e70b9c56a4dbf9cee626ddaa680bd807fb4eda1fd2f885b06\",\"signer_id\":\"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD\",\"signer_pubkey\":\"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0\",\"stored_bytes\":119779,\"total_bytes\":130963,\"total_entries\":10,\"unique_objects\":8,\"version\":2,\"work_units\":10}", + "indexes": [ + "57534958010000001900000001000000050000000a0000000600000003000000e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005867fc2ae20b6764311037b4dd14166d15e011b93481df24fdb2a116be659ae80000000000000000000000000000000000000000000000003c00000000000000020003000000000000000000000000003c0000000000000019000000020000000200020100000000000000000000000055000000000000003200000004000000020003010000000000000000000000008700000000000000190000000600000002000201000000000000000000000000a00000000000000028000000080000000200030100000000000000000000000024761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d929b0000000000000000000000000000ffffffff040000000200000000000000f60c722a119439058495ee4b99919e3dd41aaf6abe6b39badbc7b0e9e9a157b558d6800000000000b600000000000000d09a000000000000000000000000000035c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f580a0000000000000000000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd3010000000000007908000000000000000000000000000061c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365de260000000000000100000000000000ffffffff040000000200000000000000ff43964375c1bd5277901262e213359564ae1d06c85ce9aca930247e28532f2c90821a0000000000b6000000000000001c2600000000000000000000000000007cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94ad2040000000000000100000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000f3020000000000000000000000000000c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf22a8c0000000000000200000000000000ffffffff0400000002000000000000000ac192ed19d0db9a162adfaa0dc76669f392e98cb3a1d7e26e14db15d42f6be119e4690000000000b600000000000000688b00000000000000000000000000008f748dc64787b5c5ece081270c8559277f926322dd6ddc345306b8231f2d1752c7090000000000000200000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000e807000000000000000000000000000061c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365de260000000000000300000000000000ffffffff040000000202000000000000ff43964375c1bd5277901262e213359564ae1d06c85ce9aca930247e28532f2c90821a0000000000b6000000000000001c2600000000000000000000000000007cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94ad2040000000000000300000000000000ffffffff0500020000060000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000f3020000000000000000000000000000618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481aa630000000000000400000000000000ffffffff04000000020000000000000085521683dbd317477d96484c48fd2c5176a131968c0b04d944385ad53df931b3b5ee580000000000b600000000000000e8620000000000000000000000000000761c4649427c51796a2b699568775765b209ee80d2f4fc1cf040838c6724aa2dae080000000000000400000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000cf0600000000000000000000000000000100000000000000000000000000000002000000640000000000000000000000030000010000000000000000000000000000000000ff00ff00ffffffffffff000100760200747606006d6f62696c6506006c656761637914007761692e766964656f2e696e745f6d6f74696f6e0d007761692e766964656f2e61763100000000" + ] + } + ] + }, + "package_run_replayed": { + "kind": "job", + "request": "{\"capability\":\"wai.video.package\",\"deadline_us\":30000000,\"fallback\":null,\"job\":\"pack-0001\",\"kind\":\"wai-route-request\",\"limits\":{\"consent_on_file\":false,\"ga_only\":true,\"max_price\":[],\"no_training\":true,\"regions\":[\"eu-central\",\"eu-west\"],\"residency\":[\"eu\"],\"spend_ceiling\":{\"amount\":2000000000,\"currency\":\"EUR\"},\"zero_retention\":true},\"operation\":\"package.build\",\"prefer\":{\"quality\":null,\"sort\":null,\"ttfb_ms\":null},\"quantities\":[{\"quantity\":1,\"unit\":\"packages\"}]}", + "pricebook": "{\"currency\":\"EUR\",\"entries\":[{\"capability\":\"wai.video.package\",\"divisor\":1,\"endpoint\":\"pack.alpha\",\"energy_class\":\"OnChipCounter\",\"energy_uj\":4500000,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"package.build\",\"price\":400000,\"provider\":\"prov-alpha\",\"quality\":950,\"region\":\"eu-central\",\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":500,\"unit\":\"packages\"}],\"issued\":1792996400000000,\"kind\":\"wai-route-pricebook\",\"version\":2}", + "policy": "{\"exclude\":[\"prov-x\"],\"keys\":[\"price\",\"quality\",\"ttfb\",\"energy\"],\"kind\":\"wai-route-policy\",\"max_attempts\":3,\"name\":\"lowest-cost\",\"version\":3}", + "record": "{\"accepted\":1793172800000000,\"attempts\":[{\"billed\":true,\"end\":1793172803001000,\"endpoint\":\"pack.alpha\",\"error\":null,\"hop\":1,\"not_billed\":null,\"outcome\":\"served\",\"outputs\":[\"babf91ecf373060e4069962ff122c454a07d6abdd669a2175a5b58768f98b659\"],\"receipt\":\"sha256:7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc0\",\"start\":1793172800001000}],\"candidates\":[{\"capability\":\"wai.video.package\",\"cost\":400000,\"divisor\":1,\"endpoint\":\"pack.alpha\",\"energy\":4500000,\"energy_class\":\"OnChipCounter\",\"energy_uj\":4500000,\"expected_cost\":400000,\"expected_ttfb_ms\":500,\"failures\":{\"billed_price\":0,\"failed\":0,\"failed_ms\":0,\"from\":1790404400000000,\"hops\":1000,\"to\":1792996400000000},\"ga\":true,\"needs_consent\":false,\"operation\":\"package.build\",\"price\":400000,\"provider\":\"prov-alpha\",\"quality\":950,\"rank\":1,\"region\":\"eu-central\",\"removed\":[],\"residency\":\"eu\",\"retention_days\":0,\"trains_on_inputs\":false,\"ttfb_ms\":500,\"unit\":\"packages\",\"via_fallback\":false}],\"capability\":\"wai.video.package\",\"deadline\":1793172830000000,\"decision\":{\"decided_by\":\"only_survivor\",\"runner_up\":null},\"fallback\":null,\"job\":\"pack-0001\",\"kind\":\"wai-route-record\",\"operation\":\"package.build\",\"order\":[\"pack.alpha\"],\"policy\":{\"digest\":\"09d08acf6a76fa45d822f10a6806b21ad1c41172bcccfcd08548e59567c4c741\",\"name\":\"lowest-cost\",\"version\":3},\"pricebook\":{\"currency\":\"EUR\",\"digest\":\"eb5385c0f626d3b125bcb31b672cc45f59e6ab8383ffd357d737eed3e6fada05\",\"issued\":1792996400000000},\"quantities\":[{\"quantity\":1,\"unit\":\"packages\"}],\"request\":\"15527295015e4a0718224b2334cd3336b38a1ff1f2c1533c41501362152c5faf\",\"sig\":\"c05d81e7e57a2d17a80364a2b5434f84b6df4b24482d562da946f48b6f311f0013eaa8f5193b61476ba65e04b49ab9e8b1c7b872de896831064728b48935720d\",\"signer\":\"5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb\",\"version\":2}", + "receipts": [ + "{\"oer\":\"2.1\",\"receipt_id\":\"sha256:7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc0\",\"kind\":\"job\",\"capability\":\"oer.job.package.build\",\"intent\":\"replicate\",\"subject\":{\"inputs\":[\"sha256:25c0cbddb15e43d1ca68a2392454959950d5faf94d3af487ddb2b4980b20d2e9\"],\"output\":\"babf91ecf373060e4069962ff122c454a07d6abdd669a2175a5b58768f98b659\"},\"work\":{\"status\":1,\"outcome\":\"completed\",\"latency_s\":\"1.0\"},\"energy\":{\"joules_total\":\"4.5\",\"boundary\":\"the hop's host\",\"breakdown\":{\"compute_j\":\"4.5\",\"movement_j\":\"0\",\"idle_alloc_j\":\"0\",\"shared_alloc_j\":\"0\",\"upstream_j\":\"0\"},\"method\":\"hardware_meter\",\"temperature_k\":\"300\",\"class\":{\"label\":\"OnChipCounter\",\"relative_ppm\":20000,\"window_us\":4000000,\"filtering\":\"Unknown\"}},\"provenance\":{\"how\":\"measured\",\"device\":\"hardware\",\"weakest_input\":{\"how\":\"measured\",\"input\":\"pack.alpha\"}},\"floor\":{\"bits_committed\":0,\"bits_delivered\":\"0\",\"floor_j\":\"0\",\"decades_above_floor\":\"0\"},\"chain\":{\"prev_hash\":\"sha256:0000000000000000000000000000000000000000000000000000000000000000\",\"receipt_hash\":\"sha256:d62df682518d51fc3cccc3a5f64402b8405579bd1519b1a2ec6f37cda8e2b225\",\"signer\":\"ed25519:route-corpus-hops\",\"signature\":\"c478a85210ec9e4a44aa2c9c9f93369bab1cb213aba063276feb1f7238dafb0abe38d61488689c6bdfb71436988e64379729d05e7b7d076ee75a78ce367b7c02\"},\"hash_alg\":\"sha-256\",\"sig_alg\":\"ed25519\"}" + ], + "keys": { + "ed25519:route-corpus-hops": "733470a6f6824eef91aa6b6fe4094e4e3b864ce6a368122223cf718fdc57fc57" + }, + "outputs": [ + { + "package": "{\"asset_id\":\"video-base-01\",\"components\":[{\"id\":\"v\",\"index\":\"index-v.wsix\",\"index_digest\":\"5ffc2be3f21af79078a1158e3d669e4268a35b0ca61a6e73ff252fdf38f346d0\",\"media_class\":\"video\",\"stage_root\":\"bd0c7799633b108cf9ccb0c7a4cedbdf6173a83470d3d96b94d075c03e0db7b6\"}],\"energy_provenance\":null,\"grant\":{\"capability\":\"wai.video.package\",\"funds_ceiling\":null,\"grant_hash\":\"0000000000000000000000000000000000000000000000000000000000000000\",\"joule_ceiling_micro\":null},\"joules_micro\":0,\"kind\":\"package\",\"packager\":\"builtin:wai-pack@0.1.0\",\"parent_kind\":\"none\",\"parent_receipt_hash\":null,\"policy_digest\":\"e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e\",\"receipt_hash\":\"22c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728\",\"sig\":\"4554bd1c09aaa4af8799e37e2379cde9d341c7982a6d31a050162ee075c07f93c507abfda9c8223e70b9c56a4dbf9cee626ddaa680bd807fb4eda1fd2f885b06\",\"signer_id\":\"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD\",\"signer_pubkey\":\"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0\",\"stored_bytes\":119779,\"total_bytes\":130963,\"total_entries\":10,\"unique_objects\":8,\"version\":2,\"work_units\":10}", + "indexes": [ + "57534958010000001900000001000000050000000a0000000600000003000000e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005867fc2ae20b6764311037b4dd14166d15e011b93481df24fdb2a116be659ae80000000000000000000000000000000000000000000000003c00000000000000020003000000000000000000000000003c0000000000000019000000020000000200020100000000000000000000000055000000000000003200000004000000020003010000000000000000000000008700000000000000190000000600000002000201000000000000000000000000a00000000000000028000000080000000200030100000000000000000000000024761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d929b0000000000000000000000000000ffffffff040000000200000000000000f60c722a119439058495ee4b99919e3dd41aaf6abe6b39badbc7b0e9e9a157b558d6800000000000b600000000000000d09a000000000000000000000000000035c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f580a0000000000000000000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd3010000000000007908000000000000000000000000000061c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365de260000000000000100000000000000ffffffff040000000200000000000000ff43964375c1bd5277901262e213359564ae1d06c85ce9aca930247e28532f2c90821a0000000000b6000000000000001c2600000000000000000000000000007cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94ad2040000000000000100000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000f3020000000000000000000000000000c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf22a8c0000000000000200000000000000ffffffff0400000002000000000000000ac192ed19d0db9a162adfaa0dc76669f392e98cb3a1d7e26e14db15d42f6be119e4690000000000b600000000000000688b00000000000000000000000000008f748dc64787b5c5ece081270c8559277f926322dd6ddc345306b8231f2d1752c7090000000000000200000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000e807000000000000000000000000000061c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365de260000000000000300000000000000ffffffff040000000202000000000000ff43964375c1bd5277901262e213359564ae1d06c85ce9aca930247e28532f2c90821a0000000000b6000000000000001c2600000000000000000000000000007cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94ad2040000000000000300000000000000ffffffff0500020000060000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000f3020000000000000000000000000000618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481aa630000000000000400000000000000ffffffff04000000020000000000000085521683dbd317477d96484c48fd2c5176a131968c0b04d944385ad53df931b3b5ee580000000000b600000000000000e8620000000000000000000000000000761c4649427c51796a2b699568775765b209ee80d2f4fc1cf040838c6724aa2dae080000000000000400000000000000ffffffff0500020000040000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffd301000000000000cf0600000000000000000000000000000100000000000000000000000000000002000000640000000000000000000000030000010000000000000000000000000000000000ff00ff00ffffffffffff000100760200747606006d6f62696c6506006c656761637914007761692e766964656f2e696e745f6d6f74696f6e0d007761692e766964656f2e61763100000000" + ] + } + ] + }, "package_staged": { "kind": "package", "receipt": "{\"asset_id\":\"video-staged-01\",\"components\":[{\"id\":\"v\",\"index\":\"index-v.wsix\",\"index_digest\":\"6842a02b45fb2ddf8095621836901abdbf2526451d740976ffe7079fc210932c\",\"media_class\":\"video\",\"stage_root\":\"c10304943d547971b05fdb57231dcd6e097d7df38cc68ea92c376ddc957e022d\"}],\"energy_provenance\":null,\"grant\":{\"capability\":\"wai.video.package\",\"funds_ceiling\":null,\"grant_hash\":\"0000000000000000000000000000000000000000000000000000000000000000\",\"joule_ceiling_micro\":null},\"joules_micro\":0,\"kind\":\"package\",\"packager\":\"builtin:wai-pack@0.1.0\",\"parent_kind\":\"none\",\"parent_receipt_hash\":null,\"policy_digest\":\"1bed669917d9d78e1a0f65a5a998db50e98e3dbdf836cc2ae00ff2ac97d67e57\",\"receipt_hash\":\"4441a653f101172ee9d4b76f788a10f23ab359e7bf3116fb09327699c2c83ef0\",\"sig\":\"f62bd725148a4203b440769906eacf7083895accc0191782f7e43197d92a598b90f1a5ea04eedd493dda87a5e622889562f0f09a5010cb053700b016f44cb504\",\"signer_id\":\"did:key:z6MkhGok4PzLmtw1v5uW3Bpip8gHHifrCt42QJn4gEBfRVQG\",\"signer_pubkey\":\"29e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55\",\"stored_bytes\":484464,\"total_bytes\":566398,\"total_entries\":18,\"unique_objects\":14,\"version\":2,\"work_units\":18}", @@ -3991,9 +4315,9 @@ }, { "name": "invoice_version", - "about": "an invoice of version 4, which this revision does not define", + "about": "an invoice of version 5, which this revision does not define", "tariff": "574c543101c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c663fece2d2864108f19568bbfa6f08b9905a76ab46a19aa7310128d1995c8ab6100a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d05000064000000002d31010000000080f0fa020000000000b4c40400000000404b4c000000000020a1070000000000e80300000000000080841e0000000000dc05000000000000e8030000000000000800012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0189a7be137d7f3c51d15b0d4ece614d60743d7542b7693c96ac7633793e9c102f02123149749a48decea3d95364f688b821bb45bd7993dcfd3ae12b4e5f0b5b0be302a84fe45dff31d5277a3a7f557454d8f4bb0402a96c58e9215a9b4d896940bceb02b7ccb31f589ef602603d4ae5cd3bada28af9e22cd6858ee65403c8772e9e6f83030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d5504dd8db34c7d7be6dd1da6d72abf89889bd2353de94849c6b39107ca09f4682575356b1ca28a5fdcaf1722314877dcddfe81f120a29b987f595e76d56ddc63a959098d592f1fd40024b9c3b47035564146414296dd5973ff7f169637d6c51d340ff91b4899b8510e8e7ee3008f530b97d4c9ed62d406ab6017a60a23f453b8ef9c232e947e0d875f2b21ad7bbdebea890f176c12d1736cfbd64d1fb0dc83f14103", - "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c663fece2d2864108f19568bbfa6f08b9905a76ab46a19aa7310128d1995c8ab61ba582548ae3be18dd71613ef980c14293c5c3093bde02da32b44002279ea90a8000000000000000000000000000000000000000000000000000000000000000000406cd8e95d060000a043f6fd5d06004555522300000001795b769781fc401a38250614edad12994c05aecaae7687849f25105ff029269d028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102acbe25f7796dd0a3bafe6b443c66a7c7313e759125abed03cbb036ba697c657c02c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d02e28e3d8b84792817760e604cc5d01437f4c06ac01b93bc1ff31753f73396b6ad0349ab20c605d8603471ebe98ba3ed459213fdb620a25fda582f092f2811c22928039afdd42ebb416835c8556cce58d13b0a87c971299086d78255fa40fd8d229cdf03c54a8bc4385d13448aedcb5d1a1a77af507e863e3ab729622d87cee0ee4de26b0406ad5f6e482b877aef68dc2f4260c3816c62f0192524729fda42df2abf1134e10409f417544891b15aac83909edb04f8b9f098a068b1f00a78613d73802793b639041c9beac4631e7d594be6ceb92a6e4709ef512246f37c02e9af31f01f4c0f25d00435a9a5bb9b0094beed7688d3c0c018fe9bda993e1ec6b97647e226ff4edf9d5004c0ad3878d2a1cb0d37689b7c4e388e5e12e5236325d63f4e989d9bcacb8ea11004cb6887d61f4b576652c134da7f9ec5ff4c0bf81220d7a5019f5a47242376720004d1f831945866a2f3a1288ecd4e269ad8ce95a07469e3315c50eda59ad32eea990522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728061c8bff9084c93038bbb8cd767c644800f65048eab2fc258e5d22f9c435ab1b95061e4cbd4e8e8c222e666d430941885cc9b5f7f6f4328b4df38b582c18a71d905b063e6703d3a0d334f8c5a8d3baf2ce176d78cd812a3e2b7fdd3c04142e7eb356950664cf280dec65f0c7d98004308f76520ae42ced5aebf41bd457104aaec8da834506811279c01d8d2c9deb6c0d3a2f5b14143a0fdad50951824ef97378fc810ee037068c044b98f9a891c0840265ac35f526f6b507adb64cd3a7929ed0f10cb9a0fe9b06a685926b46841d22878e0c8f953c53002c539f2525a803d92631e114a709402c0704ecdb6b231ba15abef1ca3085aacecff064f4fb6af7f6ca82e18ce18118230d0746be24fe2cf22bfa77910f9cfaad9d92dab6a4b1bec88f1cd1cf621a5701768c075981f226e204dd8f9ec4bb4ba53d39cf2026a881b3a92bd7e8dcccf09aa65fef075d5e9b8c474daaa3e841a2ab0cecbdb0375ac3fb1231c9818a41a5a9f9a31eaf076cfd5648a26dc864b170a3455c6df4a1c77b45f61b4a0c23c936e14ab43d680e0782e66a104cae4d5c7153254bee825008f7b5383fc83e180fea57e689cca1ad090784610c7818d7907e71ad803287875884826af7f2cded13645d91dc503fb304b107a2de513194881a4ee11377aa6c1701b52b5fbb82cdff49d725b39a1303ceecfe07bbc10c5007ad65dd899f7548a8b61f1ef3208c2c57195e3e62977880f134e0ff07d3920e8dddffca8f01598c5465444a2fcb2e86333bb87493131173ede53ab82907e20fbdd624230fb1f69e7adc59fb22ea90dc5eaa1770339bad2b9f19625bc35607e29408132068a989d84fa5e4404d2393715e2e1074613ebc77acd35ba7276bff1100012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d02123149749a48decea3d95364f688b821bb45bd7993dcfd3ae12b4e5f0b5b0be301442f000000000000002d310100000000f20000000000000003000000a17df995f9de8e497a6e09efcf23447932836eaae64ba4f9695cfecd324d1f0a02123149749a48decea3d95364f688b821bb45bd7993dcfd3ae12b4e5f0b5b0be3048813000000000000404b4c000000000019000000000000000200000042db429a7a23eeb698760f7d4da77f4276d612334d0f863ce81489d9592ad14802a84fe45dff31d5277a3a7f557454d8f4bb0402a96c58e9215a9b4d896940bceb017049000000000000002d310100000000780100000000000002000000f7847c186a8bbf714cf005e91f9bab910f5943899d33c952a0777b31504c3dd502b7ccb31f589ef602603d4ae5cd3bada28af9e22cd6858ee65403c8772e9e6f8301a438000000000000002d3101000000002201000000000000040000003836ff78a74a6133527e5aab6a81cc914d4b49df9a00bc132913d2ecde01c97c030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b001010000000000000020a107000000000020a107000000000001000000953cfab07058f45b391d8e2e0d92cdea272c861da868d3b51bd4cc25b1e5889a030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0020a00000000000000e803000000000000102700000000000001000000953cfab07058f45b391d8e2e0d92cdea272c861da868d3b51bd4cc25b1e5889a030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b003e3d301000000000080841e0000000000ef0000000000000001000000953cfab07058f45b391d8e2e0d92cdea272c861da868d3b51bd4cc25b1e5889a04dd8db34c7d7be6dd1da6d72abf89889bd2353de94849c6b39107ca09f4682575010400000000000000dc050000000000007017000000000000070000002c46144cb834d250fea655575742a3698a5ad710f3d4e53d0f848a7483e36c4304dd8db34c7d7be6dd1da6d72abf89889bd2353de94849c6b39107ca09f4682575020300000000000000e803000000000000b80b0000000000000200000009b6f0b8d12c79b3fcb72953b7b8d856fc26b94ea02720631266ffa59a8df3960501040200000080a1990300000000204e000002020100000020bcbe0000000000000000000204010000004054890000000000a8610000040201000000b0040000000000000000000004040100000084030000000000003075000000000000000000000100000005000000c53e110000000000e980c61261881099b8ca02864e72faa50f3c8ac9ead5ed11469a659a8c18cd224c94e3c3126fc8a33dac5c7166b52cd600dacd3d0ae52564a1a416798d3d4503", + "invoice": "574c493105c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c663fece2d2864108f19568bbfa6f08b9905a76ab46a19aa7310128d1995c8ab61ba582548ae3be18dd71613ef980c14293c5c3093bde02da32b44002279ea90a8000000000000000000000000000000000000000000000000000000000000000000406cd8e95d060000a043f6fd5d06004555522300000001795b769781fc401a38250614edad12994c05aecaae7687849f25105ff029269d028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102acbe25f7796dd0a3bafe6b443c66a7c7313e759125abed03cbb036ba697c657c02c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d02e28e3d8b84792817760e604cc5d01437f4c06ac01b93bc1ff31753f73396b6ad0349ab20c605d8603471ebe98ba3ed459213fdb620a25fda582f092f2811c22928039afdd42ebb416835c8556cce58d13b0a87c971299086d78255fa40fd8d229cdf03c54a8bc4385d13448aedcb5d1a1a77af507e863e3ab729622d87cee0ee4de26b0406ad5f6e482b877aef68dc2f4260c3816c62f0192524729fda42df2abf1134e10409f417544891b15aac83909edb04f8b9f098a068b1f00a78613d73802793b639041c9beac4631e7d594be6ceb92a6e4709ef512246f37c02e9af31f01f4c0f25d00435a9a5bb9b0094beed7688d3c0c018fe9bda993e1ec6b97647e226ff4edf9d5004c0ad3878d2a1cb0d37689b7c4e388e5e12e5236325d63f4e989d9bcacb8ea11004cb6887d61f4b576652c134da7f9ec5ff4c0bf81220d7a5019f5a47242376720004d1f831945866a2f3a1288ecd4e269ad8ce95a07469e3315c50eda59ad32eea990522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728061c8bff9084c93038bbb8cd767c644800f65048eab2fc258e5d22f9c435ab1b95061e4cbd4e8e8c222e666d430941885cc9b5f7f6f4328b4df38b582c18a71d905b063e6703d3a0d334f8c5a8d3baf2ce176d78cd812a3e2b7fdd3c04142e7eb356950664cf280dec65f0c7d98004308f76520ae42ced5aebf41bd457104aaec8da834506811279c01d8d2c9deb6c0d3a2f5b14143a0fdad50951824ef97378fc810ee037068c044b98f9a891c0840265ac35f526f6b507adb64cd3a7929ed0f10cb9a0fe9b06a685926b46841d22878e0c8f953c53002c539f2525a803d92631e114a709402c0704ecdb6b231ba15abef1ca3085aacecff064f4fb6af7f6ca82e18ce18118230d0746be24fe2cf22bfa77910f9cfaad9d92dab6a4b1bec88f1cd1cf621a5701768c075981f226e204dd8f9ec4bb4ba53d39cf2026a881b3a92bd7e8dcccf09aa65fef075d5e9b8c474daaa3e841a2ab0cecbdb0375ac3fb1231c9818a41a5a9f9a31eaf076cfd5648a26dc864b170a3455c6df4a1c77b45f61b4a0c23c936e14ab43d680e0782e66a104cae4d5c7153254bee825008f7b5383fc83e180fea57e689cca1ad090784610c7818d7907e71ad803287875884826af7f2cded13645d91dc503fb304b107a2de513194881a4ee11377aa6c1701b52b5fbb82cdff49d725b39a1303ceecfe07bbc10c5007ad65dd899f7548a8b61f1ef3208c2c57195e3e62977880f134e0ff07d3920e8dddffca8f01598c5465444a2fcb2e86333bb87493131173ede53ab82907e20fbdd624230fb1f69e7adc59fb22ea90dc5eaa1770339bad2b9f19625bc35607e29408132068a989d84fa5e4404d2393715e2e1074613ebc77acd35ba7276bff1100012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d02123149749a48decea3d95364f688b821bb45bd7993dcfd3ae12b4e5f0b5b0be301442f000000000000002d310100000000f20000000000000003000000a17df995f9de8e497a6e09efcf23447932836eaae64ba4f9695cfecd324d1f0a02123149749a48decea3d95364f688b821bb45bd7993dcfd3ae12b4e5f0b5b0be3048813000000000000404b4c000000000019000000000000000200000042db429a7a23eeb698760f7d4da77f4276d612334d0f863ce81489d9592ad14802a84fe45dff31d5277a3a7f557454d8f4bb0402a96c58e9215a9b4d896940bceb017049000000000000002d310100000000780100000000000002000000f7847c186a8bbf714cf005e91f9bab910f5943899d33c952a0777b31504c3dd502b7ccb31f589ef602603d4ae5cd3bada28af9e22cd6858ee65403c8772e9e6f8301a438000000000000002d3101000000002201000000000000040000003836ff78a74a6133527e5aab6a81cc914d4b49df9a00bc132913d2ecde01c97c030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b001010000000000000020a107000000000020a107000000000001000000953cfab07058f45b391d8e2e0d92cdea272c861da868d3b51bd4cc25b1e5889a030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0020a00000000000000e803000000000000102700000000000001000000953cfab07058f45b391d8e2e0d92cdea272c861da868d3b51bd4cc25b1e5889a030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b003e3d301000000000080841e0000000000ef0000000000000001000000953cfab07058f45b391d8e2e0d92cdea272c861da868d3b51bd4cc25b1e5889a04dd8db34c7d7be6dd1da6d72abf89889bd2353de94849c6b39107ca09f4682575010400000000000000dc050000000000007017000000000000070000002c46144cb834d250fea655575742a3698a5ad710f3d4e53d0f848a7483e36c4304dd8db34c7d7be6dd1da6d72abf89889bd2353de94849c6b39107ca09f4682575020300000000000000e803000000000000b80b0000000000000200000009b6f0b8d12c79b3fcb72953b7b8d856fc26b94ea02720631266ffa59a8df3960501040200000080a1990300000000204e000002020100000020bcbe0000000000000000000204010000004054890000000000a8610000040201000000b0040000000000000000000004040100000084030000000000003075000000000000000000000100000005000000c53e110000000000e980c61261881099b8ca02864e72faa50f3c8ac9ead5ed11469a659a8c18cd224c94e3c3126fc8a33dac5c7166b52cd600dacd3d0ae52564a1a416798d3d4503", "previous": null, "sources": [ "lesson", @@ -5903,6 +6227,1030 @@ 0 ] } + }, + { + "name": "version_2_routes_under_version_3", + "about": "version 3: jobs routed under the route record's version 2, per operation and ranked by their measured failures, each output receipt of an object its served hop states it delivered: an encode, a failover billed at the endpoint that served, a decode, a hop past the deadline and three that failed, billed nothing, the failed hops' figures not stated", + "tariff": "574c543103c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6708ca98f0c81494c6a839414a36407fbe750023b8f4da697f31973ac8125ceda00a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d05000064000000002d31010000000080f0fa020000000000b4c40400000000404b4c000000000020a1070000000000e80300000000000080841e0000000000dc05000000000000e80300000000000005000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e0000000000000200030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb4280f4a16c5a0bcc82d1f221da4d7b89b874b3fc22afc6f4140acc9498731a0cb6740a24b61d42621dcd79df237078f42649c74ebfd4f1a10d823179e3e32b0ccf120bee5646f56a9dd230d970d1c5307fb19d3162f07ff704bccdde776fd3c211d5ae045178861cbb4039d485e3d3bd62ef40572290196e8f2393f9a9b04a00", + "invoice": "574c493103c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6708ca98f0c81494c6a839414a36407fbe750023b8f4da697f31973ac8125ceda2678e06d34cc5509a5e5abfb9d94d2a1b6b6f0023d75a7738012b4ec923d53ec000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000040e2b52b5f0600455552150000000e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e0057c24ce7523cc7ae15145d9ed961de42e650fda1f6a2bba2a09d001c3c7afd0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7eda0029a9d0e0cf1ae61971605998868f97cc6866a86a7ae0205cbf61133efc0e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe3870fef1543d81b0437599fbd9edac9328592a7cd5684636144c516a953325d4fcd631043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f07471090f736aba7054f84641be05658fe5cd818459f33170e1adaad2734548a3f9aa310efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290400055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04030000000000000020a107000000000060e316000000000006000000b8acd8bdb815be3781883c24a9db43138d9b5061cf10ac5bf8bc665e4bbb25ec055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb050095010000000000204e000000000000190800000000000009000000431b65c199b0c64ec34b2e89fbfe88726ffd2fc93f1435a519f019dc961aedd601050404000000d0f3080600000000204e0000000000000000000000000000000000000000000062bd1a00000000008cac6b125ad15d21733fe9775eedbaa0cd2e9f998be02dd8cf26ee177e8fdcfc0d2a1dc31e13ef2bd159367b92c405ee3921edd2a1ea4a38f49a4338d70fa20a", + "previous": null, + "sources": [ + "job_v2_encode", + "job_v2_failover", + "job_v2_decode", + "job_v2_late", + "job_v2_all_failed", + "job_v2_unclassed_failure" + ], + "outcome": { + "outcome": "accept", + "digest": "b45c1aa447761bcc8ae1b032e161cd2f5fc6129e008ac1a63c64b17a70a1f08c", + "tariff": "2678e06d34cc5509a5e5abfb9d94d2a1b6b6f0023d75a7738012b4ec923d53ec", + "currency": "EUR", + "start": 1790812800000000, + "end": 1793491200000000, + "records": 21, + "lines": [ + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "jobs", + "quantity": 1, + "price": 250000, + "amount": 250000, + "cites": [ + [ + 14, + "07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d39" + ], + [ + 16, + "43a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b" + ] + ], + "capability": "wai.video.int_motion", + "operation": "media.decode" + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "subpixels", + "quantity": 34560, + "price": 10000, + "amount": 345, + "cites": [ + [ + 14, + "07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d39" + ], + [ + 15, + "a517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe387" + ], + [ + 16, + "43a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b" + ] + ], + "capability": "wai.video.int_motion", + "operation": "media.decode" + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "jobs", + "quantity": 3, + "price": 500000, + "amount": 1500000, + "cites": [ + [ + 14, + "003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff" + ], + [ + 14, + "0057c24ce7523cc7ae15145d9ed961de42e650fda1f6a2bba2a09d001c3c7afd" + ], + [ + 14, + "422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a1" + ], + [ + 16, + "66e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a310" + ], + [ + 16, + "8201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f0747" + ], + [ + 16, + "90f736aba7054f84641be05658fe5cd818459f33170e1adaad2734548a3f9aa3" + ] + ], + "capability": "wai.video.int_motion", + "operation": "media.encode" + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "subpixels", + "quantity": 103680, + "price": 20000, + "amount": 2073, + "cites": [ + [ + 14, + "003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff" + ], + [ + 14, + "0057c24ce7523cc7ae15145d9ed961de42e650fda1f6a2bba2a09d001c3c7afd" + ], + [ + 14, + "422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a1" + ], + [ + 15, + "632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe" + ], + [ + 15, + "9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae" + ], + [ + 15, + "ef1543d81b0437599fbd9edac9328592a7cd5684636144c516a953325d4fcd63" + ], + [ + 16, + "66e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a310" + ], + [ + 16, + "8201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f0747" + ], + [ + 16, + "90f736aba7054f84641be05658fe5cd818459f33170e1adaad2734548a3f9aa3" + ] + ], + "capability": "wai.video.int_motion", + "operation": "media.encode" + } + ], + "energy": [ + { + "scope": "jobs", + "class": "OnChipCounter", + "figures": 4, + "joules": 101250000, + "max_ppm": 20000 + } + ], + "unmetered": { + "room_hops": 0, + "delivery_hops": 0, + "packaging": 0, + "ad_decisions": 0, + "jobs": 0 + }, + "coverage": { + "room_hops": "none", + "delivery_hops": "none", + "packaging": "none", + "ad_decisions": "none", + "jobs": "whole" + }, + "amount": 1752418, + "reports": { + "ads": [], + "stitched": [], + "delivery": { + "parties": [], + "overlaps": [] + } + } + } + }, + { + "name": "an_output_the_hop_did_not_deliver", + "about": "version 3: a job of version 2 whose output receipt is of a clip its served hop does not state it delivered", + "tariff": "574c543103c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6708ca98f0c81494c6a839414a36407fbe750023b8f4da697f31973ac8125ceda00a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d05000064000000002d31010000000080f0fa020000000000b4c40400000000404b4c000000000020a1070000000000e80300000000000080841e0000000000dc05000000000000e80300000000000005000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e0000000000000200030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb4280f4a16c5a0bcc82d1f221da4d7b89b874b3fc22afc6f4140acc9498731a0cb6740a24b61d42621dcd79df237078f42649c74ebfd4f1a10d823179e3e32b0ccf120bee5646f56a9dd230d970d1c5307fb19d3162f07ff704bccdde776fd3c211d5ae045178861cbb4039d485e3d3bd62ef40572290196e8f2393f9a9b04a00", + "invoice": "574c493103c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6708ca98f0c81494c6a839414a36407fbe750023b8f4da697f31973ac8125ceda2678e06d34cc5509a5e5abfb9d94d2a1b6b6f0023d75a7738012b4ec923d53ec000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000040e2b52b5f0600455552150000000e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e0057c24ce7523cc7ae15145d9ed961de42e650fda1f6a2bba2a09d001c3c7afd0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7eda0029a9d0e0cf1ae61971605998868f97cc6866a86a7ae0205cbf61133efc0e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe3870fef1543d81b0437599fbd9edac9328592a7cd5684636144c516a953325d4fcd631043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f07471090f736aba7054f84641be05658fe5cd818459f33170e1adaad2734548a3f9aa310efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290400055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04030000000000000020a107000000000060e316000000000006000000b8acd8bdb815be3781883c24a9db43138d9b5061cf10ac5bf8bc665e4bbb25ec055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb050095010000000000204e000000000000190800000000000009000000431b65c199b0c64ec34b2e89fbfe88726ffd2fc93f1435a519f019dc961aedd601050404000000d0f3080600000000204e0000000000000000000000000000000000000000000062bd1a00000000008cac6b125ad15d21733fe9775eedbaa0cd2e9f998be02dd8cf26ee177e8fdcfc0d2a1dc31e13ef2bd159367b92c405ee3921edd2a1ea4a38f49a4338d70fa20a", + "previous": null, + "sources": [ + "job_v2_another_output" + ], + "outcome": { + "outcome": "refuse", + "reason": "output_not_delivered", + "at": [ + "source", + 0, + "outputs", + 0 + ] + } + }, + { + "name": "one_output_given_twice", + "about": "version 3: a job of version 2 giving the receipt of its one output twice, to bill its subpixels twice", + "tariff": "574c543103c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6708ca98f0c81494c6a839414a36407fbe750023b8f4da697f31973ac8125ceda00a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d05000064000000002d31010000000080f0fa020000000000b4c40400000000404b4c000000000020a1070000000000e80300000000000080841e0000000000dc05000000000000e80300000000000005000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e0000000000000200030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb4280f4a16c5a0bcc82d1f221da4d7b89b874b3fc22afc6f4140acc9498731a0cb6740a24b61d42621dcd79df237078f42649c74ebfd4f1a10d823179e3e32b0ccf120bee5646f56a9dd230d970d1c5307fb19d3162f07ff704bccdde776fd3c211d5ae045178861cbb4039d485e3d3bd62ef40572290196e8f2393f9a9b04a00", + "invoice": "574c493103c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6708ca98f0c81494c6a839414a36407fbe750023b8f4da697f31973ac8125ceda2678e06d34cc5509a5e5abfb9d94d2a1b6b6f0023d75a7738012b4ec923d53ec000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000040e2b52b5f0600455552150000000e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e0057c24ce7523cc7ae15145d9ed961de42e650fda1f6a2bba2a09d001c3c7afd0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7eda0029a9d0e0cf1ae61971605998868f97cc6866a86a7ae0205cbf61133efc0e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe3870fef1543d81b0437599fbd9edac9328592a7cd5684636144c516a953325d4fcd631043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f07471090f736aba7054f84641be05658fe5cd818459f33170e1adaad2734548a3f9aa310efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290400055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04030000000000000020a107000000000060e316000000000006000000b8acd8bdb815be3781883c24a9db43138d9b5061cf10ac5bf8bc665e4bbb25ec055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb050095010000000000204e000000000000190800000000000009000000431b65c199b0c64ec34b2e89fbfe88726ffd2fc93f1435a519f019dc961aedd601050404000000d0f3080600000000204e0000000000000000000000000000000000000000000062bd1a00000000008cac6b125ad15d21733fe9775eedbaa0cd2e9f998be02dd8cf26ee177e8fdcfc0d2a1dc31e13ef2bd159367b92c405ee3921edd2a1ea4a38f49a4338d70fa20a", + "previous": null, + "sources": [ + "job_v2_output_twice" + ], + "outcome": { + "outcome": "refuse", + "reason": "output_not_delivered", + "at": [ + "source", + 0, + "outputs", + 1 + ] + } + }, + { + "name": "version_4_by_the_byte_and_the_work", + "about": "version 4: a lesson room's receipt of version 2 billed by the bytes its hops sent its sessions beside its time, a package listed and not yet billed for storage, the run that made it billed per run and per work unit of the package, and jobs routed under the route record's version 2 at their own prices, every hop's energy stated: the billed hops' in the jobs' scope, the failed hops' and the late hop's in a scope of their own, one of them unmetered", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000828d29ef07ea7d2f73a922fe4996a1b84e91e983dba827bec733089f095f4d822315f795ed1d5942a1d780cafb5f0ca247657e01fdd59a079b01c5e120091101", + "previous": null, + "sources": [ + "lesson_bytes", + "package_base", + "package_run", + "job_v2_encode", + "job_v2_failover", + "job_v2_decode", + "job_v2_late", + "job_v2_all_failed" + ], + "outcome": { + "outcome": "accept", + "digest": "4bf6539d7bc536d2420d3c1090271654f76e94a57caab621a916daf02fe41c60", + "tariff": "86830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068", + "currency": "EUR", + "start": 1790812800000000, + "end": 1793086400000000, + "records": 23, + "lines": [ + { + "source_kind": "room", + "source": "2c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa", + "unit": "publisher_us", + "quantity": 80500000, + "price": 2778, + "amount": 223629, + "cites": [ + [ + 1, + "e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94" + ] + ] + }, + { + "source_kind": "room", + "source": "2c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa", + "unit": "subscriber_us_0", + "quantity": 69400000, + "price": 1389, + "amount": 96396, + "cites": [ + [ + 1, + "e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94" + ] + ] + }, + { + "source_kind": "room", + "source": "2c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa", + "unit": "subscriber_us_1", + "quantity": 23600000, + "price": 2778, + "amount": 65560, + "cites": [ + [ + 1, + "e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94" + ] + ] + }, + { + "source_kind": "room", + "source": "2c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa", + "unit": "subscriber_us_2", + "quantity": 23600000, + "price": 5556, + "amount": 131121, + "cites": [ + [ + 1, + "e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94" + ] + ] + }, + { + "source_kind": "room", + "source": "2c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa", + "unit": "subscriber_us_8", + "quantity": 39999000, + "price": 278, + "amount": 11119, + "cites": [ + [ + 1, + "e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94" + ] + ] + }, + { + "source_kind": "room", + "source": "2c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa", + "unit": "composition_us", + "quantity": 9000000, + "price": 5556, + "amount": 50004, + "cites": [ + [ + 1, + "e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94" + ] + ] + }, + { + "source_kind": "room", + "source": "2c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa", + "unit": "recorded_us", + "quantity": 20000000, + "price": 1389, + "amount": 27780, + "cites": [ + [ + 1, + "e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94" + ] + ] + }, + { + "source_kind": "room", + "source": "2c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa", + "unit": "events_sent", + "quantity": 44, + "price": 100, + "amount": 4400, + "cites": [ + [ + 1, + "e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94" + ] + ] + }, + { + "source_kind": "room", + "source": "2c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa", + "unit": "bytes_out", + "quantity": 6370900, + "price": 2000000000, + "amount": 12741800, + "cites": [ + [ + 1, + "e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94" + ] + ] + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "jobs", + "quantity": 1, + "price": 250000, + "amount": 250000, + "cites": [ + [ + 14, + "07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d39" + ], + [ + 16, + "43a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b" + ] + ], + "capability": "wai.video.int_motion", + "operation": "media.decode" + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "subpixels", + "quantity": 34560, + "price": 10000, + "amount": 345, + "cites": [ + [ + 14, + "07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d39" + ], + [ + 15, + "a517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe387" + ], + [ + 16, + "43a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b" + ] + ], + "capability": "wai.video.int_motion", + "operation": "media.decode" + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "jobs", + "quantity": 2, + "price": 500000, + "amount": 1000000, + "cites": [ + [ + 14, + "003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff" + ], + [ + 14, + "422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a1" + ], + [ + 16, + "66e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a310" + ], + [ + 16, + "8201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f0747" + ] + ], + "capability": "wai.video.int_motion", + "operation": "media.encode" + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "subpixels", + "quantity": 69120, + "price": 20000, + "amount": 1382, + "cites": [ + [ + 14, + "003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff" + ], + [ + 14, + "422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a1" + ], + [ + 15, + "632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe" + ], + [ + 15, + "9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae" + ], + [ + 16, + "66e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a310" + ], + [ + 16, + "8201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f0747" + ] + ], + "capability": "wai.video.int_motion", + "operation": "media.encode" + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "jobs", + "quantity": 1, + "price": 300000, + "amount": 300000, + "cites": [ + [ + 14, + "7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc0" + ], + [ + 16, + "272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f31" + ] + ], + "capability": "wai.video.package", + "operation": "package.build" + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "work_units", + "quantity": 10, + "price": 1000, + "amount": 10000, + "cites": [ + [ + 5, + "22c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728" + ], + [ + 14, + "7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc0" + ], + [ + 16, + "272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f31" + ] + ], + "capability": "wai.video.package", + "operation": "package.build" + } + ], + "energy": [ + { + "scope": "room_hops", + "class": "OnChipCounter", + "figures": 2, + "joules": 60400000, + "max_ppm": 20000 + }, + { + "scope": "jobs", + "class": "OnChipCounter", + "figures": 4, + "joules": 76250000, + "max_ppm": 20000 + }, + { + "scope": "unbilled_hops", + "class": "OnChipCounter", + "figures": 4, + "joules": 35500000, + "max_ppm": 20000 + } + ], + "unmetered": { + "room_hops": 0, + "delivery_hops": 0, + "packaging": 0, + "ad_decisions": 0, + "jobs": 0, + "unbilled_hops": 1 + }, + "coverage": { + "room_hops": "whole", + "delivery_hops": "none", + "packaging": "none", + "ad_decisions": "none", + "jobs": "whole", + "unbilled_hops": "partial" + }, + "amount": 14913536, + "reports": { + "ads": [], + "stitched": [], + "delivery": { + "parties": [], + "overlaps": [] + } + } + } + }, + { + "name": "version_4_storage_held_through_a_period", + "about": "version 4: the next invoice of the chain bills the package the first invoice holds for the byte-days of its own period, and the same package made again by a new run, its work billed for that run and its receipt cited again, beside a second package listed", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc0684bf6539d7bc536d2420d3c1090271654f76e94a57caab621a916daf02fe41c600070ec75cd5e06000040e2b52b5f0600455552040000000522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728054441a653f101172ee9d4b76f788a10f23ab359e7bf3116fb09327699c2c83ef00e2d893fbf25d3bc10547dba9222379326b4b1a7815478fccd454296b6b6d946d310a8c4adb0ce1333f329b065edcf03c8c82355971f87d7e7bd8e1c63909fdea71a0300030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b003229008000000000080841e0000000000620400000000000001000000953cfab07058f45b391d8e2e0d92cdea272c861da868d3b51bd4cc25b1e5889a055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000002c1fdbadf4b61693c54280fcec5bd21ab98bbdf06bc759c9ce96f269096dad5c055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000008caf2b75fd9e7f7a602ac52843f1048f29f92a0f335679ee8ae7605bc69ac730010504010000006892460000000000204e000000000000000000000000000000000000000000000000000052bf040000000000d00994f116a72c2db61833726c2f9d195862347c91b50cafd0e5e82c29027f40e93777314cc5fc875e176997a70f3c61625afb46d35ce603f82b4194d9787808", + "previous": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000828d29ef07ea7d2f73a922fe4996a1b84e91e983dba827bec733089f095f4d822315f795ed1d5942a1d780cafb5f0ca247657e01fdd59a079b01c5e120091101", + "sources": [ + "package_base", + "package_staged", + "package_run_again" + ], + "outcome": { + "outcome": "accept", + "digest": "8cf24c2e00b71bc5ec08acb7f282c777a0b0a8a67fb32efdcd93c5f41266c97a", + "tariff": "86830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068", + "currency": "EUR", + "start": 1793086400000000, + "end": 1793491200000000, + "records": 4, + "lines": [ + { + "source_kind": "package", + "source": "0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0", + "unit": "byte_days", + "quantity": 561186, + "price": 2000000, + "amount": 1122, + "cites": [ + [ + 5, + "22c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728" + ] + ] + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "jobs", + "quantity": 1, + "price": 300000, + "amount": 300000, + "cites": [ + [ + 14, + "2d893fbf25d3bc10547dba9222379326b4b1a7815478fccd454296b6b6d946d3" + ], + [ + 16, + "a8c4adb0ce1333f329b065edcf03c8c82355971f87d7e7bd8e1c63909fdea71a" + ] + ], + "capability": "wai.video.package", + "operation": "package.build" + }, + { + "source_kind": "job", + "source": "5a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb", + "unit": "work_units", + "quantity": 10, + "price": 1000, + "amount": 10000, + "cites": [ + [ + 5, + "22c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728" + ], + [ + 14, + "2d893fbf25d3bc10547dba9222379326b4b1a7815478fccd454296b6b6d946d3" + ], + [ + 16, + "a8c4adb0ce1333f329b065edcf03c8c82355971f87d7e7bd8e1c63909fdea71a" + ] + ], + "capability": "wai.video.package", + "operation": "package.build" + } + ], + "energy": [ + { + "scope": "jobs", + "class": "OnChipCounter", + "figures": 1, + "joules": 4625000, + "max_ppm": 20000 + } + ], + "unmetered": { + "room_hops": 0, + "delivery_hops": 0, + "packaging": 0, + "ad_decisions": 0, + "jobs": 0, + "unbilled_hops": 0 + }, + "coverage": { + "room_hops": "none", + "delivery_hops": "none", + "packaging": "none", + "ad_decisions": "none", + "jobs": "whole", + "unbilled_hops": "none" + }, + "amount": 311122, + "reports": { + "ads": [], + "stitched": [], + "delivery": { + "parties": [], + "overlaps": [] + } + } + } + }, + { + "name": "version_4_bytes_at_another_price", + "about": "version 4: a tariff whose price of bytes out is not the room receipt's", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000001943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7227f6d157e267883f017511e593652537658b87f9295c80901cd6441570c63da77737118ab7f651274fe682fef6a9239abc8f337d33410dceee824fd091c00b38f5b731287a1f3b40510d5da3744169b533b306fcdcd4d6bb592fd8b392caae17f1ac7d3da5269341363c439ddeb23ad98dc0eb4ce8c6e9151b0c2765814008", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c03636bfbab0109b6e464c11938d9e77243c9d096e31260f5d02c34385d2d4e6f75000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000194357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000403b95574bc3c53aee0083ae2cd202d004205ac31eacf5fd27ecc01f1201e48689c3924db28b2b223c4894a7d6f337681111b8dbede2fb955b66ce544b257504", + "previous": null, + "sources": [ + "lesson_bytes", + "package_base", + "package_run", + "job_v2_encode", + "job_v2_failover", + "job_v2_decode", + "job_v2_late", + "job_v2_all_failed" + ], + "outcome": { + "outcome": "refuse", + "reason": "tariff_conflict", + "at": [ + "source", + 0 + ] + } + }, + { + "name": "version_4_a_receipt_that_prices_no_bytes", + "about": "version 4: a room receipt of version 1 under its tariff, which states no price of bytes, billed under a tariff that prices them", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555520300000001795b769781fc401a38250614edad12994c05aecaae7687849f25105ff029269d028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0800012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000008534d2eec3090faef669dd11affb99095324d47d1be6191bdbb2bd543028a16d0101040200000080a1990300000000204e0000000000000000000000000000000000000000000000000000d94e0900000000007099760f67497bfff84095f25d067d727862f5cc0548aa79ee8892b328f60cd7b7265df23c7a45c3cff7146e4dc59d99765b3d33155de99d44d7ccbc2c5da80e", + "previous": null, + "sources": [ + "lesson" + ], + "outcome": { + "outcome": "refuse", + "reason": "tariff_conflict", + "at": [ + "source", + 0 + ] + } + }, + { + "name": "version_4_bytes_out_above_the_receipt", + "about": "version 4: the room's bytes-out line one byte above what its receipt states", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e55366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000162cef45995133688d3d4640b2a83985c24346dfa9c4aceb2392a494035b91ce456fd72454f726c4851b973d78301a47769509fd761b3f95d017787771785506", + "previous": null, + "sources": [ + "lesson_bytes", + "package_base", + "package_run", + "job_v2_encode", + "job_v2_failover", + "job_v2_decode", + "job_v2_late", + "job_v2_all_failed" + ], + "outcome": { + "outcome": "refuse", + "reason": "quantity_not_recorded", + "at": [ + "invoice" + ] + } + }, + { + "name": "version_4_storage_of_a_package_first_billed", + "about": "version 4: the first invoice billing a day of storage for a package it bills for the first time, which no record shows was kept before the period ended", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad291000012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b003010000000000000080841e0000000000000000000000000001000000953cfab07058f45b391d8e2e0d92cdea272c861da868d3b51bd4cc25b1e5889a055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000a23173cfdd721070f4d95797c856a57910808ffb6d87104d2026d4018569e059e2b6004bf1503f1c1278772fee41064bd6e73496672172bd6b56590ef0794307", + "previous": null, + "sources": [ + "lesson_bytes", + "package_base", + "package_run", + "job_v2_encode", + "job_v2_failover", + "job_v2_decode", + "job_v2_late", + "job_v2_all_failed" + ], + "outcome": { + "outcome": "refuse", + "reason": "quantity_not_recorded", + "at": [ + "invoice" + ] + } + }, + { + "name": "version_4_a_package_run_replayed", + "about": "version 4: the next invoice bills the package made again under a new route record whose hop receipt is the first run's, which the first invoice billed", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc0684bf6539d7bc536d2420d3c1090271654f76e94a57caab621a916daf02fe41c600070ec75cd5e06000040e2b52b5f0600455552040000000522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728054441a653f101172ee9d4b76f788a10f23ab359e7bf3116fb09327699c2c83ef00e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc010a70bca438e0f5af039da23cb68a962df93c61e13127d4e687260dc344960098e0300030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b003229008000000000080841e0000000000620400000000000001000000953cfab07058f45b391d8e2e0d92cdea272c861da868d3b51bd4cc25b1e5889a055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e09304000000000002000000f8ce20b73dfeaf61159f2e219d6782c8a15b2d160b4cd6e5f5eb2a551cc179ec055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e803000000000000102700000000000003000000d1f89b3de445ebc5da1565a2151ec39c3108edad13d4387ec173ad7bdc61b8860105040100000020aa440000000000204e000000000000000000000000000000000000000000000000000052bf04000000000086da707507c37940484d8efed776973392da201cecf125121136f474357eeba7b31722fab7a9c18821fe2f2864f8fee92dc811c318dbb414d6f5451f28063c0a", + "previous": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000828d29ef07ea7d2f73a922fe4996a1b84e91e983dba827bec733089f095f4d822315f795ed1d5942a1d780cafb5f0ca247657e01fdd59a079b01c5e120091101", + "sources": [ + "package_base", + "package_staged", + "package_run_replayed" + ], + "outcome": { + "outcome": "refuse", + "reason": "record_rebilled", + "at": [ + "source", + 2 + ] + } + }, + { + "name": "version_4_one_package_run_under_two_jobs", + "about": "version 4: the package's first run and its replay in one invoice, one hop receipt under two route records", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000040e2b52b5f0600455552040000000522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc010272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f3110a70bca438e0f5af039da23cb68a962df93c61e13127d4e687260dc344960098e0200055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060200000000000000e093040000000000c02709000000000003000000a3c46991808751f1950c44f4e9629af57c19ca49b2865fa29d74ab53e33dbca5055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb071400000000000000e803000000000000204e0000000000000400000070c24f323f678c63967156d352c5fcebe2241b5927b6940eafc7599a93256f03010504020000004054890000000000204e0000000000000000000000000000000000000000000000000000e0750900000000009d97df4a1c0bf2492c80920a09f39850f9b250e76b1ec9dc0ad2b8e8338a264f586cf40fcd5bcf7bdacf94ec25258f3e1be80363fd74291194289b7f36d03401", + "previous": null, + "sources": [ + "package_run", + "package_run_replayed" + ], + "outcome": { + "outcome": "refuse", + "reason": "record_duplicate", + "at": [ + "source", + 1 + ] + } + }, + { + "name": "version_4_storage_over_the_tariffs_period", + "about": "version 4: the held package's storage billed over the tariff's whole period rather than the invoice's", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc0684bf6539d7bc536d2420d3c1090271654f76e94a57caab621a916daf02fe41c600070ec75cd5e06000040e2b52b5f0600455552040000000522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728054441a653f101172ee9d4b76f788a10f23ab359e7bf3116fb09327699c2c83ef00e2d893fbf25d3bc10547dba9222379326b4b1a7815478fccd454296b6b6d946d310a8c4adb0ce1333f329b065edcf03c8c82355971f87d7e7bd8e1c63909fdea71a0300030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0037da838000000000080841e0000000000021d00000000000001000000953cfab07058f45b391d8e2e0d92cdea272c861da868d3b51bd4cc25b1e5889a055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000002c1fdbadf4b61693c54280fcec5bd21ab98bbdf06bc759c9ce96f269096dad5c055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000008caf2b75fd9e7f7a602ac52843f1048f29f92a0f335679ee8ae7605bc69ac730010504010000006892460000000000204e0000000000000000000000000000000000000000000000000000f2d704000000000093e94d01fcdb21a525c1e51058880565ae91e8694c5ef7d73789a806a259c08f4bcf1c167fc28384852eecd0d1cb38dc1acfe4924581606bf9a297808a607906", + "previous": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000828d29ef07ea7d2f73a922fe4996a1b84e91e983dba827bec733089f095f4d822315f795ed1d5942a1d780cafb5f0ca247657e01fdd59a079b01c5e120091101", + "sources": [ + "package_base", + "package_staged", + "package_run_again" + ], + "outcome": { + "outcome": "refuse", + "reason": "quantity_not_recorded", + "at": [ + "invoice" + ] + } + }, + { + "name": "version_4_unbilled_hops_left_out", + "about": "version 4: the first invoice without the failed and late hops' energy", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930201040200000080a1990300000000204e0000050404000000907b8b0400000000204e00000000000000000000000000000000000000000000000000000090e30000000000b5cff1a4f102819c36107a0194ea96846377d7227aac4ec4c156a441128ccaa1993ad0a013a8e178d1d45ab815bd1bb1eb7a05af5dd831282e386b1c9e7ebe00", + "previous": null, + "sources": [ + "lesson_bytes", + "package_base", + "package_run", + "job_v2_encode", + "job_v2_failover", + "job_v2_decode", + "job_v2_late", + "job_v2_all_failed" + ], + "outcome": { + "outcome": "refuse", + "reason": "invoice_mismatch", + "at": [ + "invoice" + ] + } + }, + { + "name": "version_4_unbilled_hops_in_the_jobs_scope", + "about": "version 4: the failed and late hops' counter readings added to the billed hops' row", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930201040200000080a1990300000000204e0000050408000000702ba90600000000204e00000000000000000000000000000000000001000000000000000090e3000000000092daa59d0d72e401d3c633a65775e332e0b58a16aab2a0b8508adf958f10ea842a713d880b2872dd9cde659de702bc8fc3ef114b062890c845a5f311f1ed160c", + "previous": null, + "sources": [ + "lesson_bytes", + "package_base", + "package_run", + "job_v2_encode", + "job_v2_failover", + "job_v2_decode", + "job_v2_late", + "job_v2_all_failed" + ], + "outcome": { + "outcome": "refuse", + "reason": "invoice_mismatch", + "at": [ + "invoice" + ] + } + }, + { + "name": "version_4_a_failed_hop_billed_as_a_job", + "about": "version 4: the int_motion encode jobs line counting the failover's failed hop as a job, a routing figure billed", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04030000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000c232e6270a6ec69aabec98e56a28daa5a00985e532031de4ba7f27881609c1f10906fe44a6379297010c587d70b6f8099d4a21db6c5955089a22a6784b0c3d05", + "previous": null, + "sources": [ + "lesson_bytes", + "package_base", + "package_run", + "job_v2_encode", + "job_v2_failover", + "job_v2_decode", + "job_v2_late", + "job_v2_all_failed" + ], + "outcome": { + "outcome": "refuse", + "reason": "quantity_not_recorded", + "at": [ + "invoice" + ] + } + }, + { + "name": "version_4_a_job_line_at_the_routers_price", + "about": "version 4: the int_motion encode subpixels line priced at the router's price book's list price for its endpoint, not the tariff's", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e0100000000003075000000000000190800000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e0000000000000000000000000000000000000000000001000000b392e3000000000060fd86423eab21f6067b499551409f48a5ff6b553cd8099e01f9ab74c860fcbe29e960d1f9859ec7f11f33fae7cbd78c7fdfec3364f4b295d2086c7add3b590f", + "previous": null, + "sources": [ + "lesson_bytes", + "package_base", + "package_run", + "job_v2_encode", + "job_v2_failover", + "job_v2_decode", + "job_v2_late", + "job_v2_all_failed" + ], + "outcome": { + "outcome": "refuse", + "reason": "invoice_mismatch", + "at": [ + "invoice" + ] + } + }, + { + "name": "version_4_an_output_the_hop_did_not_deliver", + "about": "version 4: a job of version 2 whose output receipt is of a clip its served hop does not state it delivered", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000828d29ef07ea7d2f73a922fe4996a1b84e91e983dba827bec733089f095f4d822315f795ed1d5942a1d780cafb5f0ca247657e01fdd59a079b01c5e120091101", + "previous": null, + "sources": [ + "job_v2_another_output" + ], + "outcome": { + "outcome": "refuse", + "reason": "output_not_delivered", + "at": [ + "source", + 0, + "outputs", + 0 + ] + } + }, + { + "name": "version_4_an_output_of_a_version_1_record", + "about": "version 4: a job whose route record of version 1 states no output, given an output receipt", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000828d29ef07ea7d2f73a922fe4996a1b84e91e983dba827bec733089f095f4d822315f795ed1d5942a1d780cafb5f0ca247657e01fdd59a079b01c5e120091101", + "previous": null, + "sources": [ + "job_int_motion" + ], + "outcome": { + "outcome": "refuse", + "reason": "output_not_delivered", + "at": [ + "source", + 0, + "outputs", + 0 + ] + } + }, + { + "name": "version_4_unbilled_hop_with_no_class", + "about": "version 4: a failover whose failed hop's figure states no acquisition class, which no row can state", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290f00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0e54366100000000000094357700000000a86cc20000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930301040200000080a1990300000000204e0000050404000000907b8b0400000000204e0000060404000000e0af1d0200000000204e00000000000000000000000000000000000000000000010000000090e30000000000828d29ef07ea7d2f73a922fe4996a1b84e91e983dba827bec733089f095f4d822315f795ed1d5942a1d780cafb5f0ca247657e01fdd59a079b01c5e120091101", + "previous": null, + "sources": [ + "job_v2_unclassed_failure" + ], + "outcome": { + "outcome": "refuse", + "reason": "job_figure_invalid", + "at": [ + "source", + 0, + "receipts", + 0 + ] + } + }, + { + "name": "version_3_invoice_under_a_version_4_tariff", + "about": "an invoice of version 3 naming a tariff of version 4", + "tariff": "574c543104c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0300a0cd18bc5c06000040e2b52b5f0600455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577002d31010000000080f0fa020000000000b4c40400000000404b4c000000000080841e0000000000dc05000000000000e80300000000000007000d7761692e766964656f2e6176310c6d656469612e656e636f646501010000000000000080841e0000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f646501010000000000000090d0030000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e6465636f64650240420f00000000001027000000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f646501010000000000000020a1070000000000147761692e766964656f2e696e745f6d6f74696f6e0c6d656469612e656e636f64650240420f0000000000204e000000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64010100000000000000e093040000000000117761692e766964656f2e7061636b6167650d7061636b6167652e6275696c64030100000000000000e8030000000000000400012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa030d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b00329e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb7b1a5d3333a2bfa5186c2abd71ff77bca0f5ebe593775223ad02c34f92f9d493fe447b09ed6ecb4bdcda697bbe5497780537eb3d84f37d2cdf1b8e018718d10a3c4020051e2ba9c2b802c40c614a77b4628b92f661a02b1b9c42ad906a57d3bbfd854c9c64cb5570ba027fc12a16948440f3a1e9ab62604156be86848680d40a", + "invoice": "574c493103c45c21d62e3beb229eff8f9d1160ccbfd6fcc2ff7d3fdd5cffca4475da5619c6ec0936ac0661c45fba3229c511138d1cd93bcc9a55ca4cabdd0d6d748a754c0386830c9ec4359372876b747f59ef7bfc37b88f7b379716c578497bbc2f7dc068000000000000000000000000000000000000000000000000000000000000000000a0cd18bc5c06000070ec75cd5e06004555521700000001e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a2102c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0522c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad7280e003d5c4559ccb5d8be6bd8b5ff0c4936b929263231818e485cdbdb96af825eff0e03e08124af9a01b7edc8d3865280980409dd3008ba00942b846740f73aea37830e07166964c2d05e0c669cd3564a7deeaab1d712ee26c0a01aafdcea46388a2d390e27b09215b96b45caa2c9b95ff30e95c37f3adff35caa5e446e84aaf72171a62e0e422c13a6a4d326e153cf695c0bb56cb6e3d41b2f76beb0bf3de802202075c6a10e70bdd30b2ff7498e4256073a4c93db6cc1b71cceffaf86e8c525c5f7b4bb3a440e7d999048c8cc56f8e20ef6b7e61bacf78cfd0bcd4a315fdb25cd85618916bfc00e993e6cc3215ee481cc1805b89578dac7fcceefe8124c3a889aebc4da9e74a1830efea78251cded31b3273b94dfa596f3a921f7bc92a16319c10e8e8682310c1a400f632140bfc0ddad9b88fdce2f82d52b00d3cbef4159d257a2b3e42759585b83fe0f7c0a3af43dd67da679b46888cd67062783e6f4e2cbfd860dde76521b024d0ac80f9593ead44feed0d411c47c085d76c1ccaca1e06787475e1064284a3b55bbd1ae0fa517c88da610b4a8757ff5feecaabe15cd5f1c827b9402516cd92dc0171fe38710272fb4295ed981d5c17fec2c9c91c8aba596d925e5c765de88200f47d73e5f311043a4e5ac7a0ef978e6458beb2fff885fdd9d5a12706e57bc9d31c45adac5933b1066e5c9b99b8f5630e1d8ef217686b4d66bef83e186c9d84def8a2e234af2a31010727a443183cdf31d76ddc21e6ad9e6a3cbcfd6496cf7774d6b08fbf3cb7d3fbf108201699fe3bd486a8eb708803d781ec28870c43db660b67c6658a3e0150f074710efcd2b2fc49a9da4762d60a9b0b8a7d5ffc014ed7a37d525607f9055e151ad290e00012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa012055cc0400000000da0a0000000000008d69030000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa02c0f52204000000006d050000000000008c78010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa03801b680100000000da0a0000000000001800010000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa04801b680100000000b4150000000000003100020000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a185662020000000016010000000000006f2b000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0b4054890000000000b41500000000000054c3000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0c002d3101000000006d05000000000000846c000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0d2c0000000000000064000000000000003011000000000000010000003b9f2bd64ccffd316054144a2a6fa99f5a0cb587b5b7179c959db9af53746fbe055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb02010000000000000090d003000000000090d0030000000000020000007269d12d64419a6c9b5f1385e09added74fd36817d691cdb548542144284f7e1055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb030087000000000000102700000000000059010000000000000300000079bc379f0e9de685d0d9b048a7d9850b7a93972387b63cf712b2b09607175a80055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb04020000000000000020a107000000000040420f00000000000400000039796b2c4080cfcfe9a7dd700e1fc200771b4be7550c39159b24ebd96b1679fa055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb05000e010000000000204e000000000000660500000000000006000000f3027e0ddf61645472e238508977b443ddc6789137f97c159163681d8f5ef7ac055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb060100000000000000e093040000000000e093040000000000020000000a84a25a9004ec682652f9bf5e75e2aba73a2ff2eba2bf3e481ae449f67bd909055a0d5a5922e427f6d315d59e962f0de9227f62c36cec2fb19839fa8eab8632fb070a00000000000000e8030000000000001027000000000000030000005c3dd1f8c1e5eda4aac305efc1ccad932f7a3f987666d203af41e79b9d4867930201040200000080a1990300000000204e0000050404000000907b8b0400000000204e000000000000000000000000000000000000000000000090e3000000000021a5a029dc43212b280d153afc661bdd4005a7ea1c4afde5ec6995a550e252a0a173e6c9c2d2c5c537974b6d0e0ba283af058473bb3ca2b7497ccec44e70290a", + "previous": null, + "sources": [ + "lesson_bytes", + "package_base", + "package_run", + "job_v2_encode", + "job_v2_failover", + "job_v2_decode", + "job_v2_late", + "job_v2_all_failed" + ], + "outcome": { + "outcome": "refuse", + "reason": "tariff_mismatch", + "at": [ + "invoice" + ] + } } ] } diff --git a/wai/live-conformance/live_metering_verify.py b/wai/live-conformance/live_metering_verify.py index d333e17b8..46fb3df3a 100644 --- a/wai/live-conformance/live_metering_verify.py +++ b/wai/live-conformance/live_metering_verify.py @@ -12,7 +12,9 @@ live_compose_verify.py (live-compose §8.3). Everything else is here, from the t - the per-hop session record (§3): read in version 1 or 2 by its own layout, its class, its rules (version 2's DVR figures held to its entries), the size bound of its version, its ledger and the ledger's root; -- the room-session receipt (§4): read, its rules, who may sign it; +- the room-session receipt (§4): read in version 1 or 2 by its own layout (version 2 states the + bytes the hops sent the session's sessions, and prices them per 10^9 bytes), its rules, who + may sign it; - the room's replay (§5.3): who publishes, the grants in effect, the media tracks published; - the units (§4.4), the joules per hop and per class (§4.5), each grant's consumption and @@ -53,7 +55,7 @@ Refuse = LEV.Refuse HOP_MAGIC = b"WMH1" HOP_VERSIONS = (1, 2) SESSION_MAGIC = b"WMR1" -SESSION_VERSIONS = (1,) +SESSION_VERSIONS = (1, 2) DVR_FIELDS = ("dvr_objects_out", "dvr_bytes_out", "dvr_objects_stored", "dvr_bytes_stored", "dvr_byte_s", "dvr_dropped") HOP_DOMAIN = b"wai:metering-hop\x01" SESSION_DOMAIN = b"wai:metering-session\x01" @@ -310,9 +312,9 @@ def ledger_root(entries): def read_receipt(b, room): """§4.2: the receipt, `classes_summed` for a total of tag 0, its rules, its room, its signature.""" - read_head(b, SESSION_MAGIC, SESSION_VERSIONS) + version = read_head(b, SESSION_MAGIC, SESSION_VERSIONS) r = R(b, 5) - x = {"room": r.take(32), "signer": r.take(32), "start": r.u64(), "end": r.u64()} + x = {"version": version, "room": r.take(32), "signer": r.take(32), "start": r.u64(), "end": r.u64()} x["hops"], classes_ok = [], True for _ in range(r.u8()): h = {"record": r.take(32), "hop": r.take(32), "role": r.u8(), "joules": r.u64()} @@ -322,11 +324,12 @@ def read_receipt(b, room): x["takes"] = [r.take(32) for _ in range(r.u8())] x["compose_count"], x["compose_digest"] = r.u32(), r.take(32) x["qoe_count"], x["qoe_digest"] = r.u32(), r.take(32) - x["units"] = units_of([r.u64() for _ in range(15)]) + # §4.1: version 2 states a sixteenth unit, the bytes out (§4.4), and a fourteenth price. + x["units"] = units_of([r.u64() for _ in range(16 if version == 2 else 15)]) x["unmetered"] = r.u8() x["totals"] = [(r.u8(), r.u32(), r.u64()) for _ in range(r.u8())] x["currency"] = r.take(3) - x["prices"] = [r.u32() for _ in range(13)] + x["prices"] = [r.u32() for _ in range(14 if version == 2 else 13)] x["grants"], x["root"] = r.u32(), r.take(32) x["past"] = [(r.take(32), r.u8()) for _ in range(r.u32())] cell = [r.u8()] + [r.u32() for _ in range(3)] + [r.u64() for _ in range(3)] + [r.u32(), r.u64()] @@ -355,8 +358,11 @@ def read_receipt(b, room): def units_of(v): - return {"publisher_us": v[0], "subscriber_us": v[1:10], "sessions": v[10], "composition_us": v[11], - "events_sent": v[12], "events_delivered": v[13], "recorded_us": v[14]} + u = {"publisher_us": v[0], "subscriber_us": v[1:10], "sessions": v[10], "composition_us": v[11], + "events_sent": v[12], "events_delivered": v[13], "recorded_us": v[14]} + if len(v) == 16: + u["bytes_out"] = v[15] + return u def cell_dict(c): @@ -595,7 +601,7 @@ def u64s(*v): return b"".join(struct.pack(" 0 and c["funds"] is not None) return [ + mutate("bytes_out_priced: bytes out stated one less", [bp], lambda d: vec(d, bp)["units"].update(bytes_out=vec(d, bp)["units"]["bytes_out"] - 1)), + mutate("bytes_out_priced: bytes out left out of the units", [bp], lambda d: vec(d, bp)["units"].pop("bytes_out")), + mutate("bytes_out_priced: a grant's bytes out stated one more", [bp], lambda d: cons(d, bp, priced).update(bytes_out=cons(d, bp, priced)["bytes_out"] + 1)), + mutate("bytes_out_priced: a grant's funds without its bytes", [bp], lambda d: cons(d, bp, priced).update(funds=cons(d, bp, priced)["funds"] - 1)), + mutate("lesson: bytes out stated by a receipt of version 1", ["lesson"], lambda d: vec(d, "lesson")["units"].update(bytes_out=0)), + mutate("receipt_unknown_version: stated malformed", ["receipt_unknown_version"], lambda d: vec(d, "receipt_unknown_version").update(reason="malformed")), mutate("lesson: a bit of the receipt's signature", ["lesson"], lambda d: vec(d, "lesson").update(receipt=flip(vec(d, "lesson")["receipt"], len(vec(d, "lesson")["receipt"]) // 2 - 1))), mutate("lesson: publisher-seconds stated one more", ["lesson"], lambda d: vec(d, "lesson")["units"].update(publisher_us=vec(d, "lesson")["units"]["publisher_us"] + 1)), mutate("lesson: recorded-seconds stated one less", ["lesson"], lambda d: vec(d, "lesson")["units"].update(recorded_us=vec(d, "lesson")["units"]["recorded_us"] - 1)), diff --git a/wai/live-conformance/metering/README.md b/wai/live-conformance/metering/README.md index 28b3a6ff4..f5aa47345 100644 --- a/wai/live-conformance/metering/README.md +++ b/wai/live-conformance/metering/README.md @@ -1,7 +1,8 @@ # live-conformance/metering — live metering The corpus of [`extensions/live-metering.md`](../../extensions/live-metering.md) §10: rooms, -and vectors, each a room-session receipt (`WMR1`) with what it names (the per-hop session +and vectors, each a room-session receipt (`WMR1`, of version 1, or of version 2 stating and +pricing its hops' bytes out) with what it names (the per-hop session records, `WMH1`, of version 1 or of version 2 with a hop's DVR figures, each with its ledger; the composition descriptors and receipts, `WCD1` and `WCR1`; the take manifests, `WTM1`; and the logs document of QoE observations), and the outcome a verifier gives it. @@ -21,10 +22,11 @@ vector states (§5.4): session (`media_tracks`, the *M* of §3.7); each hop record's `digest`, `size`, size `bound` (B(*M*) for version 1, B₂(*M*) for version 2) and `version`, and for a version 2 record its six DVR figures by their §3.9 names (`dvr_objects_out`, `dvr_bytes_out`, - `dvr_objects_stored`, `dvr_bytes_stored`, `dvr_byte_s`, `dvr_dropped`); the `units`; the `unmetered` hop entries; the `totals`, one per class; the + `dvr_objects_stored`, `dvr_bytes_stored`, `dvr_byte_s`, `dvr_dropped`); the `units` (with + `bytes_out` for a receipt of version 2); the `unmetered` hop entries; the `totals`, one per class; the `coverage`, `whole` or `partial`; each grant's `consumption` entry (its ceilings, its units, its attributed joules by class, whether its share is `unmetered`, its `funds`, its two - verdicts and its `leaf`); the `consumption_root`; the grants `past` a ceiling with their + verdicts and its `leaf`, and for a receipt of version 2 its `bytes_out`); the `consumption_root`; the grants `past` a ceiling with their flags; and the `qoe_cell`. A verifier that reaches another outcome, reason, place or fact does not conform. @@ -88,9 +90,16 @@ The vectors: than the lesson relay's under a bound 48 bytes higher, stating the frames it stored, the byte-seconds it held them, one dropped for not verifying against its receipt, and the ten it filled a late viewer with; every other record of the corpus is version 1); + `bytes_out_priced` (the lesson's receipt of version 2: the bytes its hops sent the session's + sessions, summed from their ledgers, by grant too, and priced per 10^9 bytes in its tariff + and in each grant's funds; every other receipt of the corpus is version 1); - refused, one defect each: the receipt (`receipt_bad_signature`, `receipt_truncated`, `receipt_wrong_room`, `session_invalid`, `signer_not_authorised`, `signer_revoked`, - `total_of_no_class`); the hop records (`record_missing`, `record_too_large`, + `total_of_no_class`, and for version 2 `bytes_out_mismatch`, a byte more than the ledgers + (`unit_mismatch`), `bytes_out_left_out_of_the_consumption`, the grants' entries without + their bytes (`ceiling_mismatch`), `bytes_priced_with_no_tariff` (`session_invalid`), and + `receipt_unknown_version`, the lesson's receipt with its fifth byte 3 and signed again + (`unknown_version`)); the hop records (`record_missing`, `record_too_large`, `record_invalid`, `energy_invalid`, `record_wrong_room`, `record_bad_signature`, `entry_restated_wrong`, `hop_not_authorised`, `hop_class_not_authorised`, `hop_revoked`, `span_outside_session`, `track_unknown`, `ledger_invalid`, `ledger_ceiling_mismatch`, diff --git a/wai/live-conformance/metering/vectors.json b/wai/live-conformance/metering/vectors.json index 7ee79f372..7c5d5964f 100644 --- a/wai/live-conformance/metering/vectors.json +++ b/wai/live-conformance/metering/vectors.json @@ -2712,6 +2712,531 @@ "vst_ms": 0 } }, + { + "name": "bytes_out_priced", + "about": "the lesson's receipt of version 2: the bytes its hops sent the session's sessions, summed from their ledgers' bytes out, by grant too, and priced per 10^9 bytes in its tariff and in each grant's funds", + "room": "lesson", + "receipt": "574d5231022c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa8be2039bc5d06e7cf9d0188c3f22c659f1687b08b69b97f50b134552c46da783000000000000000000366e0100000000028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a21a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10280de8002000000000400003a9800000000016e360001c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720100c31801000000000400004e2000000000016e3600010265b94ec2ec2932104a7583c08050f61547332fe434464d598cad6464025b3040b598d58ceff895b484641dfdea9bf329f40b464895eb31b2271a83af17cce7fb0a000000d2e2268edd1bfc8a0dbebf1f2287b93e200bc8affd02c3e92ac872b3200731a103000000d290530d77935fe173d0d5dcbb2588170f730b423f93543b4f3ceaee06d4e78e2055cc0400000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000070000000000000040548900000000002c00000000000000f000000000000000002d31010000000054366100000000000001040200000080a1990300000000455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577080000006cc71f1f881b4962c2ff15d8a70c76f6539fa47221af8686664bcf683598018f0000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000694e666812a794f689b2f33591a4b1172f73786ab626a446e9445c10c0a5a00c1c7b78aa7a33ddde167b170dd8c3346a442b6979011879f70e9c6ff58a3d8003", + "hops": [ + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7201000000000000000000366e010000000000c31801000000000400004e2000000000016e360001110001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939023a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f011700000000000000e0040700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0242000000000000004024140000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b6030000000000007094000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366502d80e000000000000c05102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db013a0200000000000040ca22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db023a0200000000000040ca2200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c2c18a1d4c5f9a784336c16e2755ec99f12ba6990cacb81cb23f94aa048d6034013a02000000000000485904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000011600000000000000781e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000002cd000000000000003cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000001720000000000000098850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000002580000000000000020670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000f00000000000000008000000a6c37ecf5177e5e8d350fcc7c97ae32f9046bf15337e07d97453cd8dc79f4aa36d8d6332a0f2a20836f88a057863237aabd71abb0b5f41b8fed92fbbf04d851f567827e521b3ea570cdb126bc2c44e7940eb33690b8244e00abee459e82a8302", + "ledger": "0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000002000000000000000000000018600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018566202000000000c2a9846621d91f9309170b29b95e158e278002ce4cc03a2d097917836a391c0ffffffffffffffffffffffffffffffff000000010000000000000000000000d0870c0000000000a087630100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006dde44606fd8377d9fa0809b2b36b708de3e6119d8c1c3d1f0d675917c28c6198096980000000000ffffffffffffffff000000010000000000000000000000709d0b0000000000607a60010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000e004070000000000c8431200000000000000000000000000801b6801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf4a5892c8a1bef2afba730a4ec868d0830f9355d10f540b757205945c588cb5ffffffffffffffffffffffffffffffff000000010000002c720200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1ee853e5c092553edc99a0cc2468a7307afd83533a3a34f401b0695da343314ffffffffffffffffffffffffffffffff0000000100000020e53600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d436e9616073a533831cfbec646020b5d4dcc9d1df4b792ccaff6e7e23ee686affffffffffffffffffffffffffffffff0000000100000014b400000000000084e022000000000000000000000000000000000000000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e433cf0201e9b443d808e4406925b6a4a90e9963c6235c742a0ecec87a59e478ffffffffffffffff6400000000000000455552010000000000000000000000d0870c0000000000c0f35e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c1020000000000000000801b68010000000080de8002000000000400003a9800000000016e360001050001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f021700000000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b60300000000000070940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000b2083f6a8d3e1c901b93bfb87f5ffe83344214430e91d08f4e422c5ac7f0c0869f25a4e826f34f770f8f63bcea36ec697bbc398f81c06aa8ad11bb1f7a33323de1911cf31bd046195483ef8a8b22a5778adb66cfde02d9e8f8e46360a5577b06", + "ledger": "b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000c843120000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + "descriptors": [ + "57434431012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bd0000000000000000a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10005d00201101010010108000100086665617475726564056f72646572000000000000000000000280bb0000046761696e0370616e0c0c13afc5df1dffed9f80c566f13be392cc90ad1ceba5db69473a7993f8a7ff2e64cb5d094b2fdf651392e4a2d4f317cc6a436ab9b0cd5afe626493549677937002" + ], + "compositions": [ + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f000127a00000000008a826f7851f7a89f5ecf581141292c7f69e9d004ed08b01d25dd3c66e30f43f602540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f08000000000000000000000000000000c264cd78485650e03db23e16774c0566ac52d21be1b9edacaad39fa34dc3100c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593908000000000000000000000000000000e43f0568538eef406fb5ed7901b131c0b789d9c0fdb04d61d590af9bec169a1dd2ed35929ea1d408e2da06ee1c840bacab38929016f1a7ba820a80472485c9c6159b98672266a380458e260007c2baec97749e4941eb6ac370d1660fb0e5f900", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04054890000000000ee27588426463e6a765b4b8b5791670a7ad61be12ef1995102f9220928d6038d02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f090000000000000000000000000000005e05448cb224cb6aa2726e4c0fe448b127e032169bd2ffea55b4693d53ef487f01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593909000000000000000000000000000000f993d88a6b1a587e0980017103aa4fcdbdf1d7b1c948f95a8bfa36a26493bb1e89b7c717020a8a296d3688d7988d8f2e70e54228d60c58514564a12937b2bb9421199fdee27ccf49acb52a32fa0f698b3eb5b28c35c47a797ae5e7d531f7db0a", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f08096980000000000d8bb5ef530c1fe8d1a0478d5ae231aac802d9f99dff906a66aa111420948048a02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0a000000000000000000000000000000539e2bb145135d7de5b00ebf1b1178f83ef60d1b5ceedabf98bbb424a1d0a96301e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390a00000000000000000000000000000031a3cdcd31f70593af11aaf7bc4d22cc1ec5c18ee0d918fb2edd5a9c98b5a4758e74da34c2fb00e235278a3010c44dac99131fa49acc910e04f3929e7a6014833b553fad2cd31d127ad862b76999324556e76388192020c8022db9db6cafb803", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0d8a70000000000c65182e1c2868d42d9c1a244545f3c3416b14e481ade5c42b1979419f360b3e502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0b000000000000000000000000000000491fe4bc5c4bafa0066ec9c2baf4b4287fcd09a778e36d5996a97ab827b7eaae01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390b000000000000000000000000000000414a7eb6f2353358646d5b861979c533b344cc01fb9dafdb9d6518c4ad7e3f6f01a03c915891dac04736b7858fdf34c4137e10f593ab5cb3a64900914b360f6b242ee3ead8c5499f325411942dbe827bd51176f2b049c4453a654c49dc701b09", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0001bb70000000000381618c2dfecc2dea3881cb1d4ed69e43dec01f07ebda92e08cd08ff935ed44502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0c0000000000000000000000000000001915289342627f7f5a8bf4ccaf04c0418735ae65e41ca8692ebd3fca27ea764b01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390c000000000000000000000000000000194d05dbb7218051137b7537fcb320653e7f67071a19ae363969aee47cf08bede3b8b1012f1fc03a132f8793e0eae4389c23da524a7f6482a1d5cdf26ff04249cb81d4f19d8b164ec8eb381c66ba2704c57c7bb6f2389114f14bbfd632199302", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0405dc600000000007629d9fb8d6ac9e846d7ebdbe0a3a64b29ad51f7e4db40be5f96e447abcf6f0202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0d000000000000000000000000000000f98b3489983bd0476673dc05db4f09c092411512ed2da6578e9c254eee0d72f501e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390d000000000000000000000000000000bc87dab2315f8ea4f21a4b5adcb838b8d89f6d67f93bbdf5bf175069ad81fa5d123e5e3721d1b781cfcc4650a2d571df1142f2160b377be26b692636e885cd037553b9041ac8f13b1f2064568957993ff69556b8673f0ad6e6caafd8b4887c07", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0809fd50000000000d32fbadccdb9742ffff99344fe07069e2e89b1d7f2d99859ad48336fadacd7c202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0e00000000000000000000000000000053c09229456148744a940ba828e839eca0cf46d7c15e2c3533b4c65dcb0b4ff701e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390e000000000000000000000000000000b5702d26fbc4708196f576c1d46b7fc92471154fe81689707069bcb43173ecedc36859b37258c17a4294d56d36befaa9fbd975ce62e5deb542372aef4c9240b43ba584fc98e7c5a5066e1ba4060e96ca4e50daa116366c3aca9dfccef285f405", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0e1e40000000000fe93ba9f3d79ff2d3aeb01726ac4728adf60676494fbd0e596f5972be5f4639102540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0f000000000000000000000000000000341b9ec871ad41102a671b153ccd014f32cfe167bf5cca3989470a574196d0a401e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390f0000000000000000000000000000001eafd27ec73cf8676b02ebb4fa82a5bc67b2298a442322797db8cd996f8866d7bfdca1dadbfc723c27a3b6963a74c78570a41403a9cb454643631157e8bddbda8ccd54062aeec216b94406595aeb140b59afd5e697733f45980831357c0bc804", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f00024f4000000000092a195ef7c5e97512b5eed1dd778db0bd1f1c75cf8cf25b61ec800296e459e6302540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f10000000000000000000000000000000c693ed9bd4639c29ceb962b071e0531512929a139ebed7c5e12989d28b316ddc01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593910000000000000000000000000000000c5043e90fe94a06a8b47242bb084c7dc5f8e46aebbe9b2c5a8db30d44d1a8b55ab981922c453fc2c78b58f7ec56293bb26d02c335079fdd1e246e33607ef473f513bd939cfe20da8b94af0963156c7218be49ffd1efbc9c14429fddf91bf5006", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04066030100000000d00e25bb474153c30c4bf88f0fb890a0dd10342388c0be87aa93399d54bbaf5502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f110000000000000000000000000000005f50d92c07b2f57953a701633e9d59575664bfe9b13644d5db11c5d04629b08c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593911000000000000000000000000000000339aa736ed16c43427079481a1b58bb9d370f104bbcba7a9d915ba1528b1a75da2dabf39b4d5d2518a8bef4340b8c5e7b32250ac222cc3e8648a42730b81eeac78da15f7fa7f42f7bb131311eb22aa7f89ada8940b2dd41c18c113a694a50808" + ], + "takes": [ + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f559425465004500032d6893f980a7dad483af70b4e116a10b7caa4e2052593699b2c4d5251f98cf34d11f86821c2cd542f6bbf5152a07ad54b271f65b25309018a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da0f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba1307020a0000000000000000000000807f612a01000000c0c1702a01000000300000000000000037090d56c333ad6c4392ffbb8f80b7854c7ae3d562e182d6b76685f99db2ec1f0100000000000000c0c1702a010000000004802a0100000055000000000000003b9b3da8c3121692dbe9b75ff7b37a77773cf7d71d8b7c885253d5b3855c53b902000000000000000004802a0100000040468f2a010000003a0000000000000097f5ee9829746c16c29946a44489846e4a385eb6d62804ba22a18a99a92642ab030000000000000040468f2a0100000080889e2a010000005f000000000000004bb0df0483b6370199dc9196f695ec65b029d8ffb09dfd7ec24bf5d5c59a72f3040000000000000080889e2a01000000c0caad2a010000004400000000000000733b22d5d80b9a80443b60a14334000a8ab43f139364fa9cd3a547e8a7c523640500000000000000c0caad2a01000000000dbd2a0100000069000000000000009395a39fcaaab116f14a5e4f1e51abe694d712e0f912827045471c6283730a480600000000000000000dbd2a01000000404fcc2a010000004e000000000000002b869dfefc2fe0873e06d23c09f1629470a788c6b8f2aa8e6aafb1298cd73fe60700000000000000404fcc2a010000008091db2a0100000033000000000000009f10cb7a3feccf63f5c0c398375eaf998628d314dc8159d15845fe5a0f8a006b08000000000000008091db2a01000000c0d3ea2a0100000058000000000000008b03281ec96d96d0e76e48ef184b7a60d4856eddf77629af961fe54746404ef60900000000000000c0d3ea2a010000000016fa2a010000003d000000000000001fb42eb87b4ea4dc72d02c9e6ea82aab91be4bbef122892b8921e2f552a462678883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f2506000000d7b83f99f213619227fbccadf7069c3f6cffca8e86f2aba6ffb8d15212698fa51be10b08c6e09a1b9314f45c65bf3c9b6bd507cfa5df3f013d50657245ee48c5602f2236c9c17b8a1cca6bae144f8f162627d27095a7256e1c5b8bc199c84fb3d535c9375be68b107355dcfeaab2a78192ba09570642f09de57b7bab1438eadc703cab1c2158dee2277fea9a9b909df1f7926a3a56996b7db1bfbaaba40ffa2970412cc3dc8306ba8f88774f1a622d1bf21b9ef51fb85b990d279f66fed977340159425465004500032d6893f980a7dad483af70b4e116a10b7caa4e205259369900000000000000000000000000000000000000000000000000000000000000001f250bafd7daed705bd36f8138b7419700ffe4c20991a2a46993dfd25b592a3643977ddbb511d2b51471498d51135c1a724a069a507032f2a3ff93aaa9787f0d", + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee2b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c6b7091c801fbc133089d9612f76d94401ffd0199edd399f9db0beaf3e8a611d45859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf692810f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba130702080000000000000000000000405489000000000010679c000000000030000000000000008fae533ea900dd435a27c7ac6bbe43a78ca53f4ac8bf916accd92a8d374cba94010000000000000010679c0000000000e079af000000000055000000000000006cb63b81a4b11a270dfd91c37eaaed324b1b55999789174218e9990aa186455f0200000000000000e079af0000000000b08cc200000000003a00000000000000e515ec9e690d2bf9be7ce9bd8547b84406445c82682346f3cf84ccb305cf4ae50300000000000000b08cc20000000000809fd500000000005f000000000000008ab19bbbd6173bd1339419c327fadbf9337f7d77aff9e7082ee68da5132756c80400000000000000809fd5000000000050b2e80000000000440000000000000017fca124fd9c32581a3a6f032bc985481cef9852f5f07ba3120fd851511d20ba050000000000000050b2e8000000000020c5fb00000000006900000000000000be2b55d6011931c758ef4700f002f24a947e8e95428049653bc0fc44055b5563060000000000000020c5fb0000000000f0d70e01000000004e0000000000000083da93c67f107a2933b1befbdaaf558a44b2adf41cd3e085f1d48767e8dc3fde0700000000000000f0d70e0100000000c0ea2101000000003300000000000000989f78372ee677d01a1a45c0f4e33989e1e30935ef1f70e0426de38e2cb5ae8a5b8ad24298b11d4afe4acabf254c55d99e1badc4d20a3f293fef3c8e9870e6eb060000000571c24d887ed7ee13662e1b6b5916b05446674f04a48bb9657a88aa791aa4f78c7c1730862c2541afc6faf68f8f1a4b34c99f6c9ea331b8be3a60e97734ac814bcc3352c9690a6b19b9aaa4301286ce746571ec9a1dfd777ce3cdb1ab47ca1ea6e6c44a5d482193b91fac6a4b86aae708a8fe967079b4dc31dbe6e7da840cab0b041b0865ddff65ae4f592bac31b3e3627cb44ed3bfd4678f33dfcdd03c9e684fa04199a174e37753164a4ac950986de9a4abcc3c2cdce827249a9f063289b8012b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c600000000000000000000000000000000000000000000000000000000000000008fdd3b426a73d6a2e5ba04781aafc491c5950f29be46baca5bc57f7e54ba95b22dee29ffae444fb5eeee0e941d74e4e71f8dffbe4f45979a1e8c49aebc023c0c" + ], + "logs": "[[{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":0,\"ts_ms\":1792108800500,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":1,\"ts_ms\":1792108801100,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":2,\"ts_ms\":1792108822500,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":0,\"ts_ms\":1792108800510,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":1,\"ts_ms\":1792108801147,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":2,\"ts_ms\":1792108805510,\"event\":\"stall-start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":3,\"ts_ms\":1792108805910,\"event\":\"stall-end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":4,\"ts_ms\":1792108822510,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":0,\"ts_ms\":1792108800520,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":1,\"ts_ms\":1792108801194,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":2,\"ts_ms\":1792108822520,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}]]", + "outcome": "accept", + "digest": "e256da6efef6efbefcd49c8af9d166f06fdef3cfafc8e189314ec5ff46648d94", + "media_tracks": 7, + "records": [ + { + "digest": "8070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a21", + "size": 744, + "bound": 2172, + "version": 1 + }, + { + "digest": "c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d", + "size": 1824, + "bound": 2172, + "version": 1 + } + ], + "units": { + "publisher_us": 80500000, + "subscriber_us": [ + 69400000, + 23600000, + 23600000, + 0, + 0, + 0, + 0, + 0, + 39999000 + ], + "sessions": 7, + "composition_us": 9000000, + "events_sent": 44, + "events_delivered": 240, + "recorded_us": 20000000, + "bytes_out": 6370900 + }, + "unmetered": 0, + "totals": [ + { + "class": "OnChipCounter", + "figures": 2, + "joules": 60400000 + } + ], + "coverage": "whole", + "consumption": [ + { + "grant": "0000000000000000000000000000000000000000000000000000000000000000", + "joules_ceiling": null, + "funds_ceiling": null, + "currency": null, + "publisher_us": 0, + "subscriber_us": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 39999000 + ], + "composition_us": 0, + "recorded_us": 0, + "events_sent": 0, + "attributed": { + "ModelBased": 0, + "Estimator": 0, + "OnChipCounter": 44485, + "CalibratedInstrument": 0 + }, + "unmetered": false, + "funds": null, + "joules_verdict": "none", + "funds_verdict": "none", + "leaf": "091f689c679b284f349733d4b6cb73e18fa709e914855b5ec6e607e3aa81ae4d", + "bytes_out": 24600 + }, + { + "grant": "0c2a9846621d91f9309170b29b95e158e278002ce4cc03a2d097917836a391c0", + "joules_ceiling": null, + "funds_ceiling": null, + "currency": null, + "publisher_us": 0, + "subscriber_us": [ + 23300000, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "composition_us": 0, + "recorded_us": 0, + "events_sent": 1, + "attributed": { + "ModelBased": 0, + "Estimator": 0, + "OnChipCounter": 1485034, + "CalibratedInstrument": 0 + }, + "unmetered": false, + "funds": null, + "joules_verdict": "none", + "funds_verdict": "none", + "leaf": "9b7cf64b028f04a02dd78dfc0c45a7e47a5af63092d1e686ca56e2aa70c22415", + "bytes_out": 821200 + }, + { + "grant": "6dde44606fd8377d9fa0809b2b36b708de3e6119d8c1c3d1f0d675917c28c619", + "joules_ceiling": 10000000, + "funds_ceiling": null, + "currency": null, + "publisher_us": 0, + "subscriber_us": [ + 23100000, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "composition_us": 0, + "recorded_us": 0, + "events_sent": 1, + "attributed": { + "ModelBased": 0, + "Estimator": 0, + "OnChipCounter": 1376532, + "CalibratedInstrument": 0 + }, + "unmetered": false, + "funds": null, + "joules_verdict": "within", + "funds_verdict": "none", + "leaf": "18f6d4d40aea22895681d27fe8064979de00795b923c749b609e00a97c6b71ab", + "bytes_out": 761200 + }, + { + "grant": "b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0", + "joules_ceiling": null, + "funds_ceiling": null, + "currency": null, + "publisher_us": 23500000, + "subscriber_us": [ + 0, + 23600000, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "composition_us": 9000000, + "recorded_us": 0, + "events_sent": 0, + "attributed": { + "ModelBased": 0, + "Estimator": 0, + "OnChipCounter": 44996471, + "CalibratedInstrument": 0 + }, + "unmetered": false, + "funds": null, + "joules_verdict": "none", + "funds_verdict": "none", + "leaf": "5079123b7744cb7c4c5e651c9d309ee38855ad2965a0933073f0ebb117af82fd", + "bytes_out": 1657000 + }, + { + "grant": "cf4a5892c8a1bef2afba730a4ec868d0830f9355d10f540b757205945c588cb5", + "joules_ceiling": null, + "funds_ceiling": null, + "currency": null, + "publisher_us": 19000000, + "subscriber_us": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "composition_us": 0, + "recorded_us": 10000000, + "events_sent": 6, + "attributed": { + "ModelBased": 0, + "Estimator": 0, + "OnChipCounter": 289881, + "CalibratedInstrument": 0 + }, + "unmetered": false, + "funds": null, + "joules_verdict": "none", + "funds_verdict": "none", + "leaf": "5b54b79f411c0bda28b120f058a6d480217f13bd55a5a0c4c407d04e7c4e2a6e", + "bytes_out": 0 + }, + { + "grant": "d1ee853e5c092553edc99a0cc2468a7307afd83533a3a34f401b0695da343314", + "joules_ceiling": null, + "funds_ceiling": null, + "currency": null, + "publisher_us": 19000000, + "subscriber_us": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "composition_us": 0, + "recorded_us": 10000000, + "events_sent": 6, + "attributed": { + "ModelBased": 0, + "Estimator": 0, + "OnChipCounter": 6505797, + "CalibratedInstrument": 0 + }, + "unmetered": false, + "funds": null, + "joules_verdict": "none", + "funds_verdict": "none", + "leaf": "c77d7eb1315aa96a2ea74383e521bfb876c05243ffc4b130e50dd4d280f6bb13", + "bytes_out": 0 + }, + { + "grant": "d436e9616073a533831cfbec646020b5d4dcc9d1df4b792ccaff6e7e23ee686a", + "joules_ceiling": null, + "funds_ceiling": null, + "currency": null, + "publisher_us": 19000000, + "subscriber_us": [ + 0, + 0, + 23600000, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "composition_us": 0, + "recorded_us": 0, + "events_sent": 6, + "attributed": { + "ModelBased": 0, + "Estimator": 0, + "OnChipCounter": 4216760, + "CalibratedInstrument": 0 + }, + "unmetered": false, + "funds": null, + "joules_verdict": "none", + "funds_verdict": "none", + "leaf": "96d0e5507800b5b5f43b4082cde00dd2185be51d0f34847829b8b7a379b31eed", + "bytes_out": 2285700 + }, + { + "grant": "e433cf0201e9b443d808e4406925b6a4a90e9963c6235c742a0ecec87a59e478", + "joules_ceiling": null, + "funds_ceiling": 100, + "currency": "EUR", + "publisher_us": 0, + "subscriber_us": [ + 23000000, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "composition_us": 0, + "recorded_us": 0, + "events_sent": 0, + "attributed": { + "ModelBased": 0, + "Estimator": 0, + "OnChipCounter": 1485034, + "CalibratedInstrument": 0 + }, + "unmetered": false, + "funds": 2, + "joules_verdict": "none", + "funds_verdict": "within", + "leaf": "3c1f4c40d28861b136f967d011a7f1ce3748f4823bace690a9c2db12eb2e74ce", + "bytes_out": 821200 + } + ], + "consumption_root": "6cc71f1f881b4962c2ff15d8a70c76f6539fa47221af8686664bcf683598018f", + "past": [], + "qoe_cell": { + "suppressed": true, + "started": 0, + "start_failed": 0, + "exit_before_start": 0, + "stalls": 0, + "stall_ms": 0, + "engaged_ms": 0, + "vst_count": 0, + "vst_ms": 0 + } + }, + { + "name": "bytes_out_mismatch", + "about": "a receipt of version 2 stating one byte out more than its hops' ledgers", + "room": "lesson", + "receipt": "574d5231022c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa8be2039bc5d06e7cf9d0188c3f22c659f1687b08b69b97f50b134552c46da783000000000000000000366e0100000000028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a21a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10280de8002000000000400003a9800000000016e360001c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720100c31801000000000400004e2000000000016e3600010265b94ec2ec2932104a7583c08050f61547332fe434464d598cad6464025b3040b598d58ceff895b484641dfdea9bf329f40b464895eb31b2271a83af17cce7fb0a000000d2e2268edd1bfc8a0dbebf1f2287b93e200bc8affd02c3e92ac872b3200731a103000000d290530d77935fe173d0d5dcbb2588170f730b423f93543b4f3ceaee06d4e78e2055cc0400000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000070000000000000040548900000000002c00000000000000f000000000000000002d31010000000055366100000000000001040200000080a1990300000000455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577080000006cc71f1f881b4962c2ff15d8a70c76f6539fa47221af8686664bcf683598018f000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022aecc25a4d055345167ae6f9d39a4030cfb4a5c59129f40272ba994699201f1497efee74b554b0b91ea5c4fad4a72bd0fc70878f03152bfc51d3a581f92ae0f", + "hops": [ + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7201000000000000000000366e010000000000c31801000000000400004e2000000000016e360001110001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939023a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f011700000000000000e0040700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0242000000000000004024140000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b6030000000000007094000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366502d80e000000000000c05102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db013a0200000000000040ca22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db023a0200000000000040ca2200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c2c18a1d4c5f9a784336c16e2755ec99f12ba6990cacb81cb23f94aa048d6034013a02000000000000485904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000011600000000000000781e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000002cd000000000000003cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000001720000000000000098850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000002580000000000000020670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000f00000000000000008000000a6c37ecf5177e5e8d350fcc7c97ae32f9046bf15337e07d97453cd8dc79f4aa36d8d6332a0f2a20836f88a057863237aabd71abb0b5f41b8fed92fbbf04d851f567827e521b3ea570cdb126bc2c44e7940eb33690b8244e00abee459e82a8302", + "ledger": "0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000002000000000000000000000018600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018566202000000000c2a9846621d91f9309170b29b95e158e278002ce4cc03a2d097917836a391c0ffffffffffffffffffffffffffffffff000000010000000000000000000000d0870c0000000000a087630100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006dde44606fd8377d9fa0809b2b36b708de3e6119d8c1c3d1f0d675917c28c6198096980000000000ffffffffffffffff000000010000000000000000000000709d0b0000000000607a60010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000e004070000000000c8431200000000000000000000000000801b6801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf4a5892c8a1bef2afba730a4ec868d0830f9355d10f540b757205945c588cb5ffffffffffffffffffffffffffffffff000000010000002c720200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1ee853e5c092553edc99a0cc2468a7307afd83533a3a34f401b0695da343314ffffffffffffffffffffffffffffffff0000000100000020e53600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d436e9616073a533831cfbec646020b5d4dcc9d1df4b792ccaff6e7e23ee686affffffffffffffffffffffffffffffff0000000100000014b400000000000084e022000000000000000000000000000000000000000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e433cf0201e9b443d808e4406925b6a4a90e9963c6235c742a0ecec87a59e478ffffffffffffffff6400000000000000455552010000000000000000000000d0870c0000000000c0f35e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c1020000000000000000801b68010000000080de8002000000000400003a9800000000016e360001050001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f021700000000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b60300000000000070940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000b2083f6a8d3e1c901b93bfb87f5ffe83344214430e91d08f4e422c5ac7f0c0869f25a4e826f34f770f8f63bcea36ec697bbc398f81c06aa8ad11bb1f7a33323de1911cf31bd046195483ef8a8b22a5778adb66cfde02d9e8f8e46360a5577b06", + "ledger": "b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000c843120000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + "descriptors": [ + "57434431012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bd0000000000000000a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10005d00201101010010108000100086665617475726564056f72646572000000000000000000000280bb0000046761696e0370616e0c0c13afc5df1dffed9f80c566f13be392cc90ad1ceba5db69473a7993f8a7ff2e64cb5d094b2fdf651392e4a2d4f317cc6a436ab9b0cd5afe626493549677937002" + ], + "compositions": [ + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f000127a00000000008a826f7851f7a89f5ecf581141292c7f69e9d004ed08b01d25dd3c66e30f43f602540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f08000000000000000000000000000000c264cd78485650e03db23e16774c0566ac52d21be1b9edacaad39fa34dc3100c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593908000000000000000000000000000000e43f0568538eef406fb5ed7901b131c0b789d9c0fdb04d61d590af9bec169a1dd2ed35929ea1d408e2da06ee1c840bacab38929016f1a7ba820a80472485c9c6159b98672266a380458e260007c2baec97749e4941eb6ac370d1660fb0e5f900", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04054890000000000ee27588426463e6a765b4b8b5791670a7ad61be12ef1995102f9220928d6038d02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f090000000000000000000000000000005e05448cb224cb6aa2726e4c0fe448b127e032169bd2ffea55b4693d53ef487f01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593909000000000000000000000000000000f993d88a6b1a587e0980017103aa4fcdbdf1d7b1c948f95a8bfa36a26493bb1e89b7c717020a8a296d3688d7988d8f2e70e54228d60c58514564a12937b2bb9421199fdee27ccf49acb52a32fa0f698b3eb5b28c35c47a797ae5e7d531f7db0a", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f08096980000000000d8bb5ef530c1fe8d1a0478d5ae231aac802d9f99dff906a66aa111420948048a02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0a000000000000000000000000000000539e2bb145135d7de5b00ebf1b1178f83ef60d1b5ceedabf98bbb424a1d0a96301e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390a00000000000000000000000000000031a3cdcd31f70593af11aaf7bc4d22cc1ec5c18ee0d918fb2edd5a9c98b5a4758e74da34c2fb00e235278a3010c44dac99131fa49acc910e04f3929e7a6014833b553fad2cd31d127ad862b76999324556e76388192020c8022db9db6cafb803", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0d8a70000000000c65182e1c2868d42d9c1a244545f3c3416b14e481ade5c42b1979419f360b3e502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0b000000000000000000000000000000491fe4bc5c4bafa0066ec9c2baf4b4287fcd09a778e36d5996a97ab827b7eaae01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390b000000000000000000000000000000414a7eb6f2353358646d5b861979c533b344cc01fb9dafdb9d6518c4ad7e3f6f01a03c915891dac04736b7858fdf34c4137e10f593ab5cb3a64900914b360f6b242ee3ead8c5499f325411942dbe827bd51176f2b049c4453a654c49dc701b09", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0001bb70000000000381618c2dfecc2dea3881cb1d4ed69e43dec01f07ebda92e08cd08ff935ed44502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0c0000000000000000000000000000001915289342627f7f5a8bf4ccaf04c0418735ae65e41ca8692ebd3fca27ea764b01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390c000000000000000000000000000000194d05dbb7218051137b7537fcb320653e7f67071a19ae363969aee47cf08bede3b8b1012f1fc03a132f8793e0eae4389c23da524a7f6482a1d5cdf26ff04249cb81d4f19d8b164ec8eb381c66ba2704c57c7bb6f2389114f14bbfd632199302", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0405dc600000000007629d9fb8d6ac9e846d7ebdbe0a3a64b29ad51f7e4db40be5f96e447abcf6f0202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0d000000000000000000000000000000f98b3489983bd0476673dc05db4f09c092411512ed2da6578e9c254eee0d72f501e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390d000000000000000000000000000000bc87dab2315f8ea4f21a4b5adcb838b8d89f6d67f93bbdf5bf175069ad81fa5d123e5e3721d1b781cfcc4650a2d571df1142f2160b377be26b692636e885cd037553b9041ac8f13b1f2064568957993ff69556b8673f0ad6e6caafd8b4887c07", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0809fd50000000000d32fbadccdb9742ffff99344fe07069e2e89b1d7f2d99859ad48336fadacd7c202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0e00000000000000000000000000000053c09229456148744a940ba828e839eca0cf46d7c15e2c3533b4c65dcb0b4ff701e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390e000000000000000000000000000000b5702d26fbc4708196f576c1d46b7fc92471154fe81689707069bcb43173ecedc36859b37258c17a4294d56d36befaa9fbd975ce62e5deb542372aef4c9240b43ba584fc98e7c5a5066e1ba4060e96ca4e50daa116366c3aca9dfccef285f405", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0e1e40000000000fe93ba9f3d79ff2d3aeb01726ac4728adf60676494fbd0e596f5972be5f4639102540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0f000000000000000000000000000000341b9ec871ad41102a671b153ccd014f32cfe167bf5cca3989470a574196d0a401e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390f0000000000000000000000000000001eafd27ec73cf8676b02ebb4fa82a5bc67b2298a442322797db8cd996f8866d7bfdca1dadbfc723c27a3b6963a74c78570a41403a9cb454643631157e8bddbda8ccd54062aeec216b94406595aeb140b59afd5e697733f45980831357c0bc804", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f00024f4000000000092a195ef7c5e97512b5eed1dd778db0bd1f1c75cf8cf25b61ec800296e459e6302540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f10000000000000000000000000000000c693ed9bd4639c29ceb962b071e0531512929a139ebed7c5e12989d28b316ddc01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593910000000000000000000000000000000c5043e90fe94a06a8b47242bb084c7dc5f8e46aebbe9b2c5a8db30d44d1a8b55ab981922c453fc2c78b58f7ec56293bb26d02c335079fdd1e246e33607ef473f513bd939cfe20da8b94af0963156c7218be49ffd1efbc9c14429fddf91bf5006", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04066030100000000d00e25bb474153c30c4bf88f0fb890a0dd10342388c0be87aa93399d54bbaf5502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f110000000000000000000000000000005f50d92c07b2f57953a701633e9d59575664bfe9b13644d5db11c5d04629b08c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593911000000000000000000000000000000339aa736ed16c43427079481a1b58bb9d370f104bbcba7a9d915ba1528b1a75da2dabf39b4d5d2518a8bef4340b8c5e7b32250ac222cc3e8648a42730b81eeac78da15f7fa7f42f7bb131311eb22aa7f89ada8940b2dd41c18c113a694a50808" + ], + "takes": [ + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f559425465004500032d6893f980a7dad483af70b4e116a10b7caa4e2052593699b2c4d5251f98cf34d11f86821c2cd542f6bbf5152a07ad54b271f65b25309018a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da0f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba1307020a0000000000000000000000807f612a01000000c0c1702a01000000300000000000000037090d56c333ad6c4392ffbb8f80b7854c7ae3d562e182d6b76685f99db2ec1f0100000000000000c0c1702a010000000004802a0100000055000000000000003b9b3da8c3121692dbe9b75ff7b37a77773cf7d71d8b7c885253d5b3855c53b902000000000000000004802a0100000040468f2a010000003a0000000000000097f5ee9829746c16c29946a44489846e4a385eb6d62804ba22a18a99a92642ab030000000000000040468f2a0100000080889e2a010000005f000000000000004bb0df0483b6370199dc9196f695ec65b029d8ffb09dfd7ec24bf5d5c59a72f3040000000000000080889e2a01000000c0caad2a010000004400000000000000733b22d5d80b9a80443b60a14334000a8ab43f139364fa9cd3a547e8a7c523640500000000000000c0caad2a01000000000dbd2a0100000069000000000000009395a39fcaaab116f14a5e4f1e51abe694d712e0f912827045471c6283730a480600000000000000000dbd2a01000000404fcc2a010000004e000000000000002b869dfefc2fe0873e06d23c09f1629470a788c6b8f2aa8e6aafb1298cd73fe60700000000000000404fcc2a010000008091db2a0100000033000000000000009f10cb7a3feccf63f5c0c398375eaf998628d314dc8159d15845fe5a0f8a006b08000000000000008091db2a01000000c0d3ea2a0100000058000000000000008b03281ec96d96d0e76e48ef184b7a60d4856eddf77629af961fe54746404ef60900000000000000c0d3ea2a010000000016fa2a010000003d000000000000001fb42eb87b4ea4dc72d02c9e6ea82aab91be4bbef122892b8921e2f552a462678883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f2506000000d7b83f99f213619227fbccadf7069c3f6cffca8e86f2aba6ffb8d15212698fa51be10b08c6e09a1b9314f45c65bf3c9b6bd507cfa5df3f013d50657245ee48c5602f2236c9c17b8a1cca6bae144f8f162627d27095a7256e1c5b8bc199c84fb3d535c9375be68b107355dcfeaab2a78192ba09570642f09de57b7bab1438eadc703cab1c2158dee2277fea9a9b909df1f7926a3a56996b7db1bfbaaba40ffa2970412cc3dc8306ba8f88774f1a622d1bf21b9ef51fb85b990d279f66fed977340159425465004500032d6893f980a7dad483af70b4e116a10b7caa4e205259369900000000000000000000000000000000000000000000000000000000000000001f250bafd7daed705bd36f8138b7419700ffe4c20991a2a46993dfd25b592a3643977ddbb511d2b51471498d51135c1a724a069a507032f2a3ff93aaa9787f0d", + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee2b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c6b7091c801fbc133089d9612f76d94401ffd0199edd399f9db0beaf3e8a611d45859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf692810f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba130702080000000000000000000000405489000000000010679c000000000030000000000000008fae533ea900dd435a27c7ac6bbe43a78ca53f4ac8bf916accd92a8d374cba94010000000000000010679c0000000000e079af000000000055000000000000006cb63b81a4b11a270dfd91c37eaaed324b1b55999789174218e9990aa186455f0200000000000000e079af0000000000b08cc200000000003a00000000000000e515ec9e690d2bf9be7ce9bd8547b84406445c82682346f3cf84ccb305cf4ae50300000000000000b08cc20000000000809fd500000000005f000000000000008ab19bbbd6173bd1339419c327fadbf9337f7d77aff9e7082ee68da5132756c80400000000000000809fd5000000000050b2e80000000000440000000000000017fca124fd9c32581a3a6f032bc985481cef9852f5f07ba3120fd851511d20ba050000000000000050b2e8000000000020c5fb00000000006900000000000000be2b55d6011931c758ef4700f002f24a947e8e95428049653bc0fc44055b5563060000000000000020c5fb0000000000f0d70e01000000004e0000000000000083da93c67f107a2933b1befbdaaf558a44b2adf41cd3e085f1d48767e8dc3fde0700000000000000f0d70e0100000000c0ea2101000000003300000000000000989f78372ee677d01a1a45c0f4e33989e1e30935ef1f70e0426de38e2cb5ae8a5b8ad24298b11d4afe4acabf254c55d99e1badc4d20a3f293fef3c8e9870e6eb060000000571c24d887ed7ee13662e1b6b5916b05446674f04a48bb9657a88aa791aa4f78c7c1730862c2541afc6faf68f8f1a4b34c99f6c9ea331b8be3a60e97734ac814bcc3352c9690a6b19b9aaa4301286ce746571ec9a1dfd777ce3cdb1ab47ca1ea6e6c44a5d482193b91fac6a4b86aae708a8fe967079b4dc31dbe6e7da840cab0b041b0865ddff65ae4f592bac31b3e3627cb44ed3bfd4678f33dfcdd03c9e684fa04199a174e37753164a4ac950986de9a4abcc3c2cdce827249a9f063289b8012b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c600000000000000000000000000000000000000000000000000000000000000008fdd3b426a73d6a2e5ba04781aafc491c5950f29be46baca5bc57f7e54ba95b22dee29ffae444fb5eeee0e941d74e4e71f8dffbe4f45979a1e8c49aebc023c0c" + ], + "logs": "[[{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":0,\"ts_ms\":1792108800500,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":1,\"ts_ms\":1792108801100,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":2,\"ts_ms\":1792108822500,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":0,\"ts_ms\":1792108800510,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":1,\"ts_ms\":1792108801147,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":2,\"ts_ms\":1792108805510,\"event\":\"stall-start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":3,\"ts_ms\":1792108805910,\"event\":\"stall-end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":4,\"ts_ms\":1792108822510,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":0,\"ts_ms\":1792108800520,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":1,\"ts_ms\":1792108801194,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":2,\"ts_ms\":1792108822520,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}]]", + "outcome": "refuse", + "reason": "unit_mismatch", + "at": [ + "units" + ] + }, + { + "name": "bytes_out_left_out_of_the_consumption", + "about": "a receipt of version 2 whose grants' consumption entries leave out their bytes out and their price", + "room": "lesson", + "receipt": "574d5231022c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa8be2039bc5d06e7cf9d0188c3f22c659f1687b08b69b97f50b134552c46da783000000000000000000366e0100000000028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a21a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10280de8002000000000400003a9800000000016e360001c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720100c31801000000000400004e2000000000016e3600010265b94ec2ec2932104a7583c08050f61547332fe434464d598cad6464025b3040b598d58ceff895b484641dfdea9bf329f40b464895eb31b2271a83af17cce7fb0a000000d2e2268edd1bfc8a0dbebf1f2287b93e200bc8affd02c3e92ac872b3200731a103000000d290530d77935fe173d0d5dcbb2588170f730b423f93543b4f3ceaee06d4e78e2055cc0400000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000070000000000000040548900000000002c00000000000000f000000000000000002d31010000000054366100000000000001040200000080a1990300000000455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d0500006400000000943577080000000d3a5365cdd4a6acda275ad18cbec48f1fae9e6f3af5513449d166bffeee68950000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000717d7cc7ddf1ab1c2925b425aa85e608e3284e86607ba1b208f135217743bcb387050558fb7375933168b25cc4bdec2f9ffde43edf36639d6fa758ceea474705", + "hops": [ + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7201000000000000000000366e010000000000c31801000000000400004e2000000000016e360001110001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939023a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f011700000000000000e0040700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0242000000000000004024140000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b6030000000000007094000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366502d80e000000000000c05102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db013a0200000000000040ca22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db023a0200000000000040ca2200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c2c18a1d4c5f9a784336c16e2755ec99f12ba6990cacb81cb23f94aa048d6034013a02000000000000485904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000011600000000000000781e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000002cd000000000000003cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000001720000000000000098850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000002580000000000000020670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000f00000000000000008000000a6c37ecf5177e5e8d350fcc7c97ae32f9046bf15337e07d97453cd8dc79f4aa36d8d6332a0f2a20836f88a057863237aabd71abb0b5f41b8fed92fbbf04d851f567827e521b3ea570cdb126bc2c44e7940eb33690b8244e00abee459e82a8302", + "ledger": "0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000002000000000000000000000018600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018566202000000000c2a9846621d91f9309170b29b95e158e278002ce4cc03a2d097917836a391c0ffffffffffffffffffffffffffffffff000000010000000000000000000000d0870c0000000000a087630100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006dde44606fd8377d9fa0809b2b36b708de3e6119d8c1c3d1f0d675917c28c6198096980000000000ffffffffffffffff000000010000000000000000000000709d0b0000000000607a60010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000e004070000000000c8431200000000000000000000000000801b6801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf4a5892c8a1bef2afba730a4ec868d0830f9355d10f540b757205945c588cb5ffffffffffffffffffffffffffffffff000000010000002c720200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1ee853e5c092553edc99a0cc2468a7307afd83533a3a34f401b0695da343314ffffffffffffffffffffffffffffffff0000000100000020e53600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d436e9616073a533831cfbec646020b5d4dcc9d1df4b792ccaff6e7e23ee686affffffffffffffffffffffffffffffff0000000100000014b400000000000084e022000000000000000000000000000000000000000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e433cf0201e9b443d808e4406925b6a4a90e9963c6235c742a0ecec87a59e478ffffffffffffffff6400000000000000455552010000000000000000000000d0870c0000000000c0f35e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c1020000000000000000801b68010000000080de8002000000000400003a9800000000016e360001050001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f021700000000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b60300000000000070940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000b2083f6a8d3e1c901b93bfb87f5ffe83344214430e91d08f4e422c5ac7f0c0869f25a4e826f34f770f8f63bcea36ec697bbc398f81c06aa8ad11bb1f7a33323de1911cf31bd046195483ef8a8b22a5778adb66cfde02d9e8f8e46360a5577b06", + "ledger": "b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000c843120000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + "descriptors": [ + "57434431012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bd0000000000000000a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10005d00201101010010108000100086665617475726564056f72646572000000000000000000000280bb0000046761696e0370616e0c0c13afc5df1dffed9f80c566f13be392cc90ad1ceba5db69473a7993f8a7ff2e64cb5d094b2fdf651392e4a2d4f317cc6a436ab9b0cd5afe626493549677937002" + ], + "compositions": [ + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f000127a00000000008a826f7851f7a89f5ecf581141292c7f69e9d004ed08b01d25dd3c66e30f43f602540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f08000000000000000000000000000000c264cd78485650e03db23e16774c0566ac52d21be1b9edacaad39fa34dc3100c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593908000000000000000000000000000000e43f0568538eef406fb5ed7901b131c0b789d9c0fdb04d61d590af9bec169a1dd2ed35929ea1d408e2da06ee1c840bacab38929016f1a7ba820a80472485c9c6159b98672266a380458e260007c2baec97749e4941eb6ac370d1660fb0e5f900", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04054890000000000ee27588426463e6a765b4b8b5791670a7ad61be12ef1995102f9220928d6038d02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f090000000000000000000000000000005e05448cb224cb6aa2726e4c0fe448b127e032169bd2ffea55b4693d53ef487f01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593909000000000000000000000000000000f993d88a6b1a587e0980017103aa4fcdbdf1d7b1c948f95a8bfa36a26493bb1e89b7c717020a8a296d3688d7988d8f2e70e54228d60c58514564a12937b2bb9421199fdee27ccf49acb52a32fa0f698b3eb5b28c35c47a797ae5e7d531f7db0a", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f08096980000000000d8bb5ef530c1fe8d1a0478d5ae231aac802d9f99dff906a66aa111420948048a02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0a000000000000000000000000000000539e2bb145135d7de5b00ebf1b1178f83ef60d1b5ceedabf98bbb424a1d0a96301e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390a00000000000000000000000000000031a3cdcd31f70593af11aaf7bc4d22cc1ec5c18ee0d918fb2edd5a9c98b5a4758e74da34c2fb00e235278a3010c44dac99131fa49acc910e04f3929e7a6014833b553fad2cd31d127ad862b76999324556e76388192020c8022db9db6cafb803", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0d8a70000000000c65182e1c2868d42d9c1a244545f3c3416b14e481ade5c42b1979419f360b3e502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0b000000000000000000000000000000491fe4bc5c4bafa0066ec9c2baf4b4287fcd09a778e36d5996a97ab827b7eaae01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390b000000000000000000000000000000414a7eb6f2353358646d5b861979c533b344cc01fb9dafdb9d6518c4ad7e3f6f01a03c915891dac04736b7858fdf34c4137e10f593ab5cb3a64900914b360f6b242ee3ead8c5499f325411942dbe827bd51176f2b049c4453a654c49dc701b09", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0001bb70000000000381618c2dfecc2dea3881cb1d4ed69e43dec01f07ebda92e08cd08ff935ed44502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0c0000000000000000000000000000001915289342627f7f5a8bf4ccaf04c0418735ae65e41ca8692ebd3fca27ea764b01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390c000000000000000000000000000000194d05dbb7218051137b7537fcb320653e7f67071a19ae363969aee47cf08bede3b8b1012f1fc03a132f8793e0eae4389c23da524a7f6482a1d5cdf26ff04249cb81d4f19d8b164ec8eb381c66ba2704c57c7bb6f2389114f14bbfd632199302", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0405dc600000000007629d9fb8d6ac9e846d7ebdbe0a3a64b29ad51f7e4db40be5f96e447abcf6f0202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0d000000000000000000000000000000f98b3489983bd0476673dc05db4f09c092411512ed2da6578e9c254eee0d72f501e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390d000000000000000000000000000000bc87dab2315f8ea4f21a4b5adcb838b8d89f6d67f93bbdf5bf175069ad81fa5d123e5e3721d1b781cfcc4650a2d571df1142f2160b377be26b692636e885cd037553b9041ac8f13b1f2064568957993ff69556b8673f0ad6e6caafd8b4887c07", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0809fd50000000000d32fbadccdb9742ffff99344fe07069e2e89b1d7f2d99859ad48336fadacd7c202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0e00000000000000000000000000000053c09229456148744a940ba828e839eca0cf46d7c15e2c3533b4c65dcb0b4ff701e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390e000000000000000000000000000000b5702d26fbc4708196f576c1d46b7fc92471154fe81689707069bcb43173ecedc36859b37258c17a4294d56d36befaa9fbd975ce62e5deb542372aef4c9240b43ba584fc98e7c5a5066e1ba4060e96ca4e50daa116366c3aca9dfccef285f405", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0e1e40000000000fe93ba9f3d79ff2d3aeb01726ac4728adf60676494fbd0e596f5972be5f4639102540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0f000000000000000000000000000000341b9ec871ad41102a671b153ccd014f32cfe167bf5cca3989470a574196d0a401e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390f0000000000000000000000000000001eafd27ec73cf8676b02ebb4fa82a5bc67b2298a442322797db8cd996f8866d7bfdca1dadbfc723c27a3b6963a74c78570a41403a9cb454643631157e8bddbda8ccd54062aeec216b94406595aeb140b59afd5e697733f45980831357c0bc804", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f00024f4000000000092a195ef7c5e97512b5eed1dd778db0bd1f1c75cf8cf25b61ec800296e459e6302540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f10000000000000000000000000000000c693ed9bd4639c29ceb962b071e0531512929a139ebed7c5e12989d28b316ddc01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593910000000000000000000000000000000c5043e90fe94a06a8b47242bb084c7dc5f8e46aebbe9b2c5a8db30d44d1a8b55ab981922c453fc2c78b58f7ec56293bb26d02c335079fdd1e246e33607ef473f513bd939cfe20da8b94af0963156c7218be49ffd1efbc9c14429fddf91bf5006", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04066030100000000d00e25bb474153c30c4bf88f0fb890a0dd10342388c0be87aa93399d54bbaf5502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f110000000000000000000000000000005f50d92c07b2f57953a701633e9d59575664bfe9b13644d5db11c5d04629b08c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593911000000000000000000000000000000339aa736ed16c43427079481a1b58bb9d370f104bbcba7a9d915ba1528b1a75da2dabf39b4d5d2518a8bef4340b8c5e7b32250ac222cc3e8648a42730b81eeac78da15f7fa7f42f7bb131311eb22aa7f89ada8940b2dd41c18c113a694a50808" + ], + "takes": [ + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f559425465004500032d6893f980a7dad483af70b4e116a10b7caa4e2052593699b2c4d5251f98cf34d11f86821c2cd542f6bbf5152a07ad54b271f65b25309018a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da0f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba1307020a0000000000000000000000807f612a01000000c0c1702a01000000300000000000000037090d56c333ad6c4392ffbb8f80b7854c7ae3d562e182d6b76685f99db2ec1f0100000000000000c0c1702a010000000004802a0100000055000000000000003b9b3da8c3121692dbe9b75ff7b37a77773cf7d71d8b7c885253d5b3855c53b902000000000000000004802a0100000040468f2a010000003a0000000000000097f5ee9829746c16c29946a44489846e4a385eb6d62804ba22a18a99a92642ab030000000000000040468f2a0100000080889e2a010000005f000000000000004bb0df0483b6370199dc9196f695ec65b029d8ffb09dfd7ec24bf5d5c59a72f3040000000000000080889e2a01000000c0caad2a010000004400000000000000733b22d5d80b9a80443b60a14334000a8ab43f139364fa9cd3a547e8a7c523640500000000000000c0caad2a01000000000dbd2a0100000069000000000000009395a39fcaaab116f14a5e4f1e51abe694d712e0f912827045471c6283730a480600000000000000000dbd2a01000000404fcc2a010000004e000000000000002b869dfefc2fe0873e06d23c09f1629470a788c6b8f2aa8e6aafb1298cd73fe60700000000000000404fcc2a010000008091db2a0100000033000000000000009f10cb7a3feccf63f5c0c398375eaf998628d314dc8159d15845fe5a0f8a006b08000000000000008091db2a01000000c0d3ea2a0100000058000000000000008b03281ec96d96d0e76e48ef184b7a60d4856eddf77629af961fe54746404ef60900000000000000c0d3ea2a010000000016fa2a010000003d000000000000001fb42eb87b4ea4dc72d02c9e6ea82aab91be4bbef122892b8921e2f552a462678883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f2506000000d7b83f99f213619227fbccadf7069c3f6cffca8e86f2aba6ffb8d15212698fa51be10b08c6e09a1b9314f45c65bf3c9b6bd507cfa5df3f013d50657245ee48c5602f2236c9c17b8a1cca6bae144f8f162627d27095a7256e1c5b8bc199c84fb3d535c9375be68b107355dcfeaab2a78192ba09570642f09de57b7bab1438eadc703cab1c2158dee2277fea9a9b909df1f7926a3a56996b7db1bfbaaba40ffa2970412cc3dc8306ba8f88774f1a622d1bf21b9ef51fb85b990d279f66fed977340159425465004500032d6893f980a7dad483af70b4e116a10b7caa4e205259369900000000000000000000000000000000000000000000000000000000000000001f250bafd7daed705bd36f8138b7419700ffe4c20991a2a46993dfd25b592a3643977ddbb511d2b51471498d51135c1a724a069a507032f2a3ff93aaa9787f0d", + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee2b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c6b7091c801fbc133089d9612f76d94401ffd0199edd399f9db0beaf3e8a611d45859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf692810f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba130702080000000000000000000000405489000000000010679c000000000030000000000000008fae533ea900dd435a27c7ac6bbe43a78ca53f4ac8bf916accd92a8d374cba94010000000000000010679c0000000000e079af000000000055000000000000006cb63b81a4b11a270dfd91c37eaaed324b1b55999789174218e9990aa186455f0200000000000000e079af0000000000b08cc200000000003a00000000000000e515ec9e690d2bf9be7ce9bd8547b84406445c82682346f3cf84ccb305cf4ae50300000000000000b08cc20000000000809fd500000000005f000000000000008ab19bbbd6173bd1339419c327fadbf9337f7d77aff9e7082ee68da5132756c80400000000000000809fd5000000000050b2e80000000000440000000000000017fca124fd9c32581a3a6f032bc985481cef9852f5f07ba3120fd851511d20ba050000000000000050b2e8000000000020c5fb00000000006900000000000000be2b55d6011931c758ef4700f002f24a947e8e95428049653bc0fc44055b5563060000000000000020c5fb0000000000f0d70e01000000004e0000000000000083da93c67f107a2933b1befbdaaf558a44b2adf41cd3e085f1d48767e8dc3fde0700000000000000f0d70e0100000000c0ea2101000000003300000000000000989f78372ee677d01a1a45c0f4e33989e1e30935ef1f70e0426de38e2cb5ae8a5b8ad24298b11d4afe4acabf254c55d99e1badc4d20a3f293fef3c8e9870e6eb060000000571c24d887ed7ee13662e1b6b5916b05446674f04a48bb9657a88aa791aa4f78c7c1730862c2541afc6faf68f8f1a4b34c99f6c9ea331b8be3a60e97734ac814bcc3352c9690a6b19b9aaa4301286ce746571ec9a1dfd777ce3cdb1ab47ca1ea6e6c44a5d482193b91fac6a4b86aae708a8fe967079b4dc31dbe6e7da840cab0b041b0865ddff65ae4f592bac31b3e3627cb44ed3bfd4678f33dfcdd03c9e684fa04199a174e37753164a4ac950986de9a4abcc3c2cdce827249a9f063289b8012b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c600000000000000000000000000000000000000000000000000000000000000008fdd3b426a73d6a2e5ba04781aafc491c5950f29be46baca5bc57f7e54ba95b22dee29ffae444fb5eeee0e941d74e4e71f8dffbe4f45979a1e8c49aebc023c0c" + ], + "logs": "[[{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":0,\"ts_ms\":1792108800500,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":1,\"ts_ms\":1792108801100,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":2,\"ts_ms\":1792108822500,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":0,\"ts_ms\":1792108800510,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":1,\"ts_ms\":1792108801147,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":2,\"ts_ms\":1792108805510,\"event\":\"stall-start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":3,\"ts_ms\":1792108805910,\"event\":\"stall-end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":4,\"ts_ms\":1792108822510,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":0,\"ts_ms\":1792108800520,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":1,\"ts_ms\":1792108801194,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":2,\"ts_ms\":1792108822520,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}]]", + "outcome": "refuse", + "reason": "ceiling_mismatch", + "at": [ + "ceilings" + ] + }, + { + "name": "bytes_priced_with_no_tariff", + "about": "a receipt of version 2 with no tariff that prices bytes out", + "room": "lesson", + "receipt": "574d5231022c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa8be2039bc5d06e7cf9d0188c3f22c659f1687b08b69b97f50b134552c46da783000000000000000000366e0100000000028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a21a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10280de8002000000000400003a9800000000016e360001c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720100c31801000000000400004e2000000000016e3600010265b94ec2ec2932104a7583c08050f61547332fe434464d598cad6464025b3040b598d58ceff895b484641dfdea9bf329f40b464895eb31b2271a83af17cce7fb0a000000d2e2268edd1bfc8a0dbebf1f2287b93e200bc8affd02c3e92ac872b3200731a103000000d290530d77935fe173d0d5dcbb2588170f730b423f93543b4f3ceaee06d4e78e2055cc0400000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000070000000000000040548900000000002c00000000000000f000000000000000002d31010000000054366100000000000001040200000080a199030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000800000024414336db9dfed2a78649f5bd05555889f8f2d50a92d22e84b831fa1fd59f2c0000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0500cf7cc23f94451cba243242772595a107430f96727a4516d0e908944eeb38efdcf2b69dc3b2b457456dd01f60dbbcb5fa2e9987dd801f47094d70e542408", + "hops": [ + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7201000000000000000000366e010000000000c31801000000000400004e2000000000016e360001110001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939023a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f011700000000000000e0040700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0242000000000000004024140000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b6030000000000007094000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366502d80e000000000000c05102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db013a0200000000000040ca22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db023a0200000000000040ca2200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c2c18a1d4c5f9a784336c16e2755ec99f12ba6990cacb81cb23f94aa048d6034013a02000000000000485904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000011600000000000000781e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000002cd000000000000003cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000001720000000000000098850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000002580000000000000020670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000f00000000000000008000000a6c37ecf5177e5e8d350fcc7c97ae32f9046bf15337e07d97453cd8dc79f4aa36d8d6332a0f2a20836f88a057863237aabd71abb0b5f41b8fed92fbbf04d851f567827e521b3ea570cdb126bc2c44e7940eb33690b8244e00abee459e82a8302", + "ledger": "0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000002000000000000000000000018600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018566202000000000c2a9846621d91f9309170b29b95e158e278002ce4cc03a2d097917836a391c0ffffffffffffffffffffffffffffffff000000010000000000000000000000d0870c0000000000a087630100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006dde44606fd8377d9fa0809b2b36b708de3e6119d8c1c3d1f0d675917c28c6198096980000000000ffffffffffffffff000000010000000000000000000000709d0b0000000000607a60010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000e004070000000000c8431200000000000000000000000000801b6801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf4a5892c8a1bef2afba730a4ec868d0830f9355d10f540b757205945c588cb5ffffffffffffffffffffffffffffffff000000010000002c720200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1ee853e5c092553edc99a0cc2468a7307afd83533a3a34f401b0695da343314ffffffffffffffffffffffffffffffff0000000100000020e53600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d436e9616073a533831cfbec646020b5d4dcc9d1df4b792ccaff6e7e23ee686affffffffffffffffffffffffffffffff0000000100000014b400000000000084e022000000000000000000000000000000000000000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e433cf0201e9b443d808e4406925b6a4a90e9963c6235c742a0ecec87a59e478ffffffffffffffff6400000000000000455552010000000000000000000000d0870c0000000000c0f35e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c1020000000000000000801b68010000000080de8002000000000400003a9800000000016e360001050001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f021700000000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b60300000000000070940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000b2083f6a8d3e1c901b93bfb87f5ffe83344214430e91d08f4e422c5ac7f0c0869f25a4e826f34f770f8f63bcea36ec697bbc398f81c06aa8ad11bb1f7a33323de1911cf31bd046195483ef8a8b22a5778adb66cfde02d9e8f8e46360a5577b06", + "ledger": "b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000c843120000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + "descriptors": [ + "57434431012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bd0000000000000000a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10005d00201101010010108000100086665617475726564056f72646572000000000000000000000280bb0000046761696e0370616e0c0c13afc5df1dffed9f80c566f13be392cc90ad1ceba5db69473a7993f8a7ff2e64cb5d094b2fdf651392e4a2d4f317cc6a436ab9b0cd5afe626493549677937002" + ], + "compositions": [ + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f000127a00000000008a826f7851f7a89f5ecf581141292c7f69e9d004ed08b01d25dd3c66e30f43f602540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f08000000000000000000000000000000c264cd78485650e03db23e16774c0566ac52d21be1b9edacaad39fa34dc3100c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593908000000000000000000000000000000e43f0568538eef406fb5ed7901b131c0b789d9c0fdb04d61d590af9bec169a1dd2ed35929ea1d408e2da06ee1c840bacab38929016f1a7ba820a80472485c9c6159b98672266a380458e260007c2baec97749e4941eb6ac370d1660fb0e5f900", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04054890000000000ee27588426463e6a765b4b8b5791670a7ad61be12ef1995102f9220928d6038d02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f090000000000000000000000000000005e05448cb224cb6aa2726e4c0fe448b127e032169bd2ffea55b4693d53ef487f01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593909000000000000000000000000000000f993d88a6b1a587e0980017103aa4fcdbdf1d7b1c948f95a8bfa36a26493bb1e89b7c717020a8a296d3688d7988d8f2e70e54228d60c58514564a12937b2bb9421199fdee27ccf49acb52a32fa0f698b3eb5b28c35c47a797ae5e7d531f7db0a", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f08096980000000000d8bb5ef530c1fe8d1a0478d5ae231aac802d9f99dff906a66aa111420948048a02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0a000000000000000000000000000000539e2bb145135d7de5b00ebf1b1178f83ef60d1b5ceedabf98bbb424a1d0a96301e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390a00000000000000000000000000000031a3cdcd31f70593af11aaf7bc4d22cc1ec5c18ee0d918fb2edd5a9c98b5a4758e74da34c2fb00e235278a3010c44dac99131fa49acc910e04f3929e7a6014833b553fad2cd31d127ad862b76999324556e76388192020c8022db9db6cafb803", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0d8a70000000000c65182e1c2868d42d9c1a244545f3c3416b14e481ade5c42b1979419f360b3e502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0b000000000000000000000000000000491fe4bc5c4bafa0066ec9c2baf4b4287fcd09a778e36d5996a97ab827b7eaae01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390b000000000000000000000000000000414a7eb6f2353358646d5b861979c533b344cc01fb9dafdb9d6518c4ad7e3f6f01a03c915891dac04736b7858fdf34c4137e10f593ab5cb3a64900914b360f6b242ee3ead8c5499f325411942dbe827bd51176f2b049c4453a654c49dc701b09", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0001bb70000000000381618c2dfecc2dea3881cb1d4ed69e43dec01f07ebda92e08cd08ff935ed44502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0c0000000000000000000000000000001915289342627f7f5a8bf4ccaf04c0418735ae65e41ca8692ebd3fca27ea764b01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390c000000000000000000000000000000194d05dbb7218051137b7537fcb320653e7f67071a19ae363969aee47cf08bede3b8b1012f1fc03a132f8793e0eae4389c23da524a7f6482a1d5cdf26ff04249cb81d4f19d8b164ec8eb381c66ba2704c57c7bb6f2389114f14bbfd632199302", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0405dc600000000007629d9fb8d6ac9e846d7ebdbe0a3a64b29ad51f7e4db40be5f96e447abcf6f0202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0d000000000000000000000000000000f98b3489983bd0476673dc05db4f09c092411512ed2da6578e9c254eee0d72f501e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390d000000000000000000000000000000bc87dab2315f8ea4f21a4b5adcb838b8d89f6d67f93bbdf5bf175069ad81fa5d123e5e3721d1b781cfcc4650a2d571df1142f2160b377be26b692636e885cd037553b9041ac8f13b1f2064568957993ff69556b8673f0ad6e6caafd8b4887c07", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0809fd50000000000d32fbadccdb9742ffff99344fe07069e2e89b1d7f2d99859ad48336fadacd7c202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0e00000000000000000000000000000053c09229456148744a940ba828e839eca0cf46d7c15e2c3533b4c65dcb0b4ff701e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390e000000000000000000000000000000b5702d26fbc4708196f576c1d46b7fc92471154fe81689707069bcb43173ecedc36859b37258c17a4294d56d36befaa9fbd975ce62e5deb542372aef4c9240b43ba584fc98e7c5a5066e1ba4060e96ca4e50daa116366c3aca9dfccef285f405", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0e1e40000000000fe93ba9f3d79ff2d3aeb01726ac4728adf60676494fbd0e596f5972be5f4639102540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0f000000000000000000000000000000341b9ec871ad41102a671b153ccd014f32cfe167bf5cca3989470a574196d0a401e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390f0000000000000000000000000000001eafd27ec73cf8676b02ebb4fa82a5bc67b2298a442322797db8cd996f8866d7bfdca1dadbfc723c27a3b6963a74c78570a41403a9cb454643631157e8bddbda8ccd54062aeec216b94406595aeb140b59afd5e697733f45980831357c0bc804", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f00024f4000000000092a195ef7c5e97512b5eed1dd778db0bd1f1c75cf8cf25b61ec800296e459e6302540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f10000000000000000000000000000000c693ed9bd4639c29ceb962b071e0531512929a139ebed7c5e12989d28b316ddc01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593910000000000000000000000000000000c5043e90fe94a06a8b47242bb084c7dc5f8e46aebbe9b2c5a8db30d44d1a8b55ab981922c453fc2c78b58f7ec56293bb26d02c335079fdd1e246e33607ef473f513bd939cfe20da8b94af0963156c7218be49ffd1efbc9c14429fddf91bf5006", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04066030100000000d00e25bb474153c30c4bf88f0fb890a0dd10342388c0be87aa93399d54bbaf5502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f110000000000000000000000000000005f50d92c07b2f57953a701633e9d59575664bfe9b13644d5db11c5d04629b08c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593911000000000000000000000000000000339aa736ed16c43427079481a1b58bb9d370f104bbcba7a9d915ba1528b1a75da2dabf39b4d5d2518a8bef4340b8c5e7b32250ac222cc3e8648a42730b81eeac78da15f7fa7f42f7bb131311eb22aa7f89ada8940b2dd41c18c113a694a50808" + ], + "takes": [ + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f559425465004500032d6893f980a7dad483af70b4e116a10b7caa4e2052593699b2c4d5251f98cf34d11f86821c2cd542f6bbf5152a07ad54b271f65b25309018a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da0f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba1307020a0000000000000000000000807f612a01000000c0c1702a01000000300000000000000037090d56c333ad6c4392ffbb8f80b7854c7ae3d562e182d6b76685f99db2ec1f0100000000000000c0c1702a010000000004802a0100000055000000000000003b9b3da8c3121692dbe9b75ff7b37a77773cf7d71d8b7c885253d5b3855c53b902000000000000000004802a0100000040468f2a010000003a0000000000000097f5ee9829746c16c29946a44489846e4a385eb6d62804ba22a18a99a92642ab030000000000000040468f2a0100000080889e2a010000005f000000000000004bb0df0483b6370199dc9196f695ec65b029d8ffb09dfd7ec24bf5d5c59a72f3040000000000000080889e2a01000000c0caad2a010000004400000000000000733b22d5d80b9a80443b60a14334000a8ab43f139364fa9cd3a547e8a7c523640500000000000000c0caad2a01000000000dbd2a0100000069000000000000009395a39fcaaab116f14a5e4f1e51abe694d712e0f912827045471c6283730a480600000000000000000dbd2a01000000404fcc2a010000004e000000000000002b869dfefc2fe0873e06d23c09f1629470a788c6b8f2aa8e6aafb1298cd73fe60700000000000000404fcc2a010000008091db2a0100000033000000000000009f10cb7a3feccf63f5c0c398375eaf998628d314dc8159d15845fe5a0f8a006b08000000000000008091db2a01000000c0d3ea2a0100000058000000000000008b03281ec96d96d0e76e48ef184b7a60d4856eddf77629af961fe54746404ef60900000000000000c0d3ea2a010000000016fa2a010000003d000000000000001fb42eb87b4ea4dc72d02c9e6ea82aab91be4bbef122892b8921e2f552a462678883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f2506000000d7b83f99f213619227fbccadf7069c3f6cffca8e86f2aba6ffb8d15212698fa51be10b08c6e09a1b9314f45c65bf3c9b6bd507cfa5df3f013d50657245ee48c5602f2236c9c17b8a1cca6bae144f8f162627d27095a7256e1c5b8bc199c84fb3d535c9375be68b107355dcfeaab2a78192ba09570642f09de57b7bab1438eadc703cab1c2158dee2277fea9a9b909df1f7926a3a56996b7db1bfbaaba40ffa2970412cc3dc8306ba8f88774f1a622d1bf21b9ef51fb85b990d279f66fed977340159425465004500032d6893f980a7dad483af70b4e116a10b7caa4e205259369900000000000000000000000000000000000000000000000000000000000000001f250bafd7daed705bd36f8138b7419700ffe4c20991a2a46993dfd25b592a3643977ddbb511d2b51471498d51135c1a724a069a507032f2a3ff93aaa9787f0d", + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee2b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c6b7091c801fbc133089d9612f76d94401ffd0199edd399f9db0beaf3e8a611d45859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf692810f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba130702080000000000000000000000405489000000000010679c000000000030000000000000008fae533ea900dd435a27c7ac6bbe43a78ca53f4ac8bf916accd92a8d374cba94010000000000000010679c0000000000e079af000000000055000000000000006cb63b81a4b11a270dfd91c37eaaed324b1b55999789174218e9990aa186455f0200000000000000e079af0000000000b08cc200000000003a00000000000000e515ec9e690d2bf9be7ce9bd8547b84406445c82682346f3cf84ccb305cf4ae50300000000000000b08cc20000000000809fd500000000005f000000000000008ab19bbbd6173bd1339419c327fadbf9337f7d77aff9e7082ee68da5132756c80400000000000000809fd5000000000050b2e80000000000440000000000000017fca124fd9c32581a3a6f032bc985481cef9852f5f07ba3120fd851511d20ba050000000000000050b2e8000000000020c5fb00000000006900000000000000be2b55d6011931c758ef4700f002f24a947e8e95428049653bc0fc44055b5563060000000000000020c5fb0000000000f0d70e01000000004e0000000000000083da93c67f107a2933b1befbdaaf558a44b2adf41cd3e085f1d48767e8dc3fde0700000000000000f0d70e0100000000c0ea2101000000003300000000000000989f78372ee677d01a1a45c0f4e33989e1e30935ef1f70e0426de38e2cb5ae8a5b8ad24298b11d4afe4acabf254c55d99e1badc4d20a3f293fef3c8e9870e6eb060000000571c24d887ed7ee13662e1b6b5916b05446674f04a48bb9657a88aa791aa4f78c7c1730862c2541afc6faf68f8f1a4b34c99f6c9ea331b8be3a60e97734ac814bcc3352c9690a6b19b9aaa4301286ce746571ec9a1dfd777ce3cdb1ab47ca1ea6e6c44a5d482193b91fac6a4b86aae708a8fe967079b4dc31dbe6e7da840cab0b041b0865ddff65ae4f592bac31b3e3627cb44ed3bfd4678f33dfcdd03c9e684fa04199a174e37753164a4ac950986de9a4abcc3c2cdce827249a9f063289b8012b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c600000000000000000000000000000000000000000000000000000000000000008fdd3b426a73d6a2e5ba04781aafc491c5950f29be46baca5bc57f7e54ba95b22dee29ffae444fb5eeee0e941d74e4e71f8dffbe4f45979a1e8c49aebc023c0c" + ], + "logs": "[[{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":0,\"ts_ms\":1792108800500,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":1,\"ts_ms\":1792108801100,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":2,\"ts_ms\":1792108822500,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":0,\"ts_ms\":1792108800510,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":1,\"ts_ms\":1792108801147,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":2,\"ts_ms\":1792108805510,\"event\":\"stall-start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":3,\"ts_ms\":1792108805910,\"event\":\"stall-end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":4,\"ts_ms\":1792108822510,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":0,\"ts_ms\":1792108800520,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":1,\"ts_ms\":1792108801194,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":2,\"ts_ms\":1792108822520,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}]]", + "outcome": "refuse", + "reason": "session_invalid", + "at": [ + "receipt" + ] + }, + { + "name": "receipt_unknown_version", + "about": "a receipt of version 3: the lesson's with its fifth byte 3, signed again", + "room": "lesson", + "receipt": "574d5231032c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa8be2039bc5d06e7cf9d0188c3f22c659f1687b08b69b97f50b134552c46da783000000000000000000366e0100000000028070e1923387154875aacbeb894c20dc919c95dd4128758b5d47df86652c4a21a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10280de8002000000000400003a9800000000016e360001c3193ab4736af61acb0b4177aa6ec8fa8ee0924b3f727e9f21eb20b9dc72ef2d0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b720100c31801000000000400004e2000000000016e3600010265b94ec2ec2932104a7583c08050f61547332fe434464d598cad6464025b3040b598d58ceff895b484641dfdea9bf329f40b464895eb31b2271a83af17cce7fb0a000000d2e2268edd1bfc8a0dbebf1f2287b93e200bc8affd02c3e92ac872b3200731a103000000d290530d77935fe173d0d5dcbb2588170f730b423f93543b4f3ceaee06d4e78e2055cc0400000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000070000000000000040548900000000002c00000000000000f000000000000000002d3101000000000001040200000080a1990300000000455552da0a00006d050000da0a0000b41500008d2000000000000000000000000000000000000016010000b41500006d05000064000000080000000d3a5365cdd4a6acda275ad18cbec48f1fae9e6f3af5513449d166bffeee68950000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d91f7a28e842c4c6fd6df0f08bf5162be2cc80280aeaa9417fb671a36164352ccee121738ae1c115ebcc712dd5235451bcd57410226ee54b986ff33bcf2b3608", + "hops": [ + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7201000000000000000000366e010000000000c31801000000000400004e2000000000016e360001110001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939023a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d02d80e00000000000000470900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f011700000000000000e0040700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0242000000000000004024140000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b6030000000000007094000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366502d80e000000000000c05102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db013a0200000000000040ca22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d7a22d6b2f60ddeaf9f0b43a147004709d988a73527b65d08e0ea6372f910db023a0200000000000040ca2200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c2c18a1d4c5f9a784336c16e2755ec99f12ba6990cacb81cb23f94aa048d6034013a02000000000000485904000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000011600000000000000781e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000002cd000000000000003cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000001720000000000000098850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000002580000000000000020670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000c0f5220400000000801b680100000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001856620200000000f00000000000000008000000a6c37ecf5177e5e8d350fcc7c97ae32f9046bf15337e07d97453cd8dc79f4aa36d8d6332a0f2a20836f88a057863237aabd71abb0b5f41b8fed92fbbf04d851f567827e521b3ea570cdb126bc2c44e7940eb33690b8244e00abee459e82a8302", + "ledger": "0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000002000000000000000000000018600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018566202000000000c2a9846621d91f9309170b29b95e158e278002ce4cc03a2d097917836a391c0ffffffffffffffffffffffffffffffff000000010000000000000000000000d0870c0000000000a087630100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006dde44606fd8377d9fa0809b2b36b708de3e6119d8c1c3d1f0d675917c28c6198096980000000000ffffffffffffffff000000010000000000000000000000709d0b0000000000607a60010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000e004070000000000c8431200000000000000000000000000801b6801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf4a5892c8a1bef2afba730a4ec868d0830f9355d10f540b757205945c588cb5ffffffffffffffffffffffffffffffff000000010000002c720200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1ee853e5c092553edc99a0cc2468a7307afd83533a3a34f401b0695da343314ffffffffffffffffffffffffffffffff0000000100000020e53600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d436e9616073a533831cfbec646020b5d4dcc9d1df4b792ccaff6e7e23ee686affffffffffffffffffffffffffffffff0000000100000014b400000000000084e022000000000000000000000000000000000000000000801b680100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e433cf0201e9b443d808e4406925b6a4a90e9963c6235c742a0ecec87a59e478ffffffffffffffff6400000000000000455552010000000000000000000000d0870c0000000000c0f35e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "record": "574d4831012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c1020000000000000000801b68010000000080de8002000000000400003a9800000000016e360001050001025980e26a212cf4c098b0f8a1a36a15333c6975497e60c073b9cd8242943b4c01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f5939013a02000000000000d80b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001313ea2ca301a5e17a28cb2d4b11014eaed6c09c8bb27b777993c556d712aa84d01b603000000000000c0510200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f021700000000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195ab21fa90d692e9fe90bade8cd132b0d17d75f25efa1fab73239d188617366501b60300000000000070940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000b2083f6a8d3e1c901b93bfb87f5ffe83344214430e91d08f4e422c5ac7f0c0869f25a4e826f34f770f8f63bcea36ec697bbc398f81c06aa8ad11bb1f7a33323de1911cf31bd046195483ef8a8b22a5778adb66cfde02d9e8f8e46360a5577b06", + "ledger": "b9091845dcf9a7fc8e2a12e1e1b2f986888b33fb22f1b42b384cdf47ecfc33a0ffffffffffffffffffffffffffffffff00000001000000c843120000000000e004070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + "descriptors": [ + "57434431012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaad6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bd0000000000000000a693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c10005d00201101010010108000100086665617475726564056f72646572000000000000000000000280bb0000046761696e0370616e0c0c13afc5df1dffed9f80c566f13be392cc90ad1ceba5db69473a7993f8a7ff2e64cb5d094b2fdf651392e4a2d4f317cc6a436ab9b0cd5afe626493549677937002" + ], + "compositions": [ + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f000127a00000000008a826f7851f7a89f5ecf581141292c7f69e9d004ed08b01d25dd3c66e30f43f602540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f08000000000000000000000000000000c264cd78485650e03db23e16774c0566ac52d21be1b9edacaad39fa34dc3100c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593908000000000000000000000000000000e43f0568538eef406fb5ed7901b131c0b789d9c0fdb04d61d590af9bec169a1dd2ed35929ea1d408e2da06ee1c840bacab38929016f1a7ba820a80472485c9c6159b98672266a380458e260007c2baec97749e4941eb6ac370d1660fb0e5f900", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04054890000000000ee27588426463e6a765b4b8b5791670a7ad61be12ef1995102f9220928d6038d02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f090000000000000000000000000000005e05448cb224cb6aa2726e4c0fe448b127e032169bd2ffea55b4693d53ef487f01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593909000000000000000000000000000000f993d88a6b1a587e0980017103aa4fcdbdf1d7b1c948f95a8bfa36a26493bb1e89b7c717020a8a296d3688d7988d8f2e70e54228d60c58514564a12937b2bb9421199fdee27ccf49acb52a32fa0f698b3eb5b28c35c47a797ae5e7d531f7db0a", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f08096980000000000d8bb5ef530c1fe8d1a0478d5ae231aac802d9f99dff906a66aa111420948048a02540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0a000000000000000000000000000000539e2bb145135d7de5b00ebf1b1178f83ef60d1b5ceedabf98bbb424a1d0a96301e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390a00000000000000000000000000000031a3cdcd31f70593af11aaf7bc4d22cc1ec5c18ee0d918fb2edd5a9c98b5a4758e74da34c2fb00e235278a3010c44dac99131fa49acc910e04f3929e7a6014833b553fad2cd31d127ad862b76999324556e76388192020c8022db9db6cafb803", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0d8a70000000000c65182e1c2868d42d9c1a244545f3c3416b14e481ade5c42b1979419f360b3e502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0b000000000000000000000000000000491fe4bc5c4bafa0066ec9c2baf4b4287fcd09a778e36d5996a97ab827b7eaae01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390b000000000000000000000000000000414a7eb6f2353358646d5b861979c533b344cc01fb9dafdb9d6518c4ad7e3f6f01a03c915891dac04736b7858fdf34c4137e10f593ab5cb3a64900914b360f6b242ee3ead8c5499f325411942dbe827bd51176f2b049c4453a654c49dc701b09", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0001bb70000000000381618c2dfecc2dea3881cb1d4ed69e43dec01f07ebda92e08cd08ff935ed44502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0c0000000000000000000000000000001915289342627f7f5a8bf4ccaf04c0418735ae65e41ca8692ebd3fca27ea764b01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390c000000000000000000000000000000194d05dbb7218051137b7537fcb320653e7f67071a19ae363969aee47cf08bede3b8b1012f1fc03a132f8793e0eae4389c23da524a7f6482a1d5cdf26ff04249cb81d4f19d8b164ec8eb381c66ba2704c57c7bb6f2389114f14bbfd632199302", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0405dc600000000007629d9fb8d6ac9e846d7ebdbe0a3a64b29ad51f7e4db40be5f96e447abcf6f0202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0d000000000000000000000000000000f98b3489983bd0476673dc05db4f09c092411512ed2da6578e9c254eee0d72f501e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390d000000000000000000000000000000bc87dab2315f8ea4f21a4b5adcb838b8d89f6d67f93bbdf5bf175069ad81fa5d123e5e3721d1b781cfcc4650a2d571df1142f2160b377be26b692636e885cd037553b9041ac8f13b1f2064568957993ff69556b8673f0ad6e6caafd8b4887c07", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0809fd50000000000d32fbadccdb9742ffff99344fe07069e2e89b1d7f2d99859ad48336fadacd7c202540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0e00000000000000000000000000000053c09229456148744a940ba828e839eca0cf46d7c15e2c3533b4c65dcb0b4ff701e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390e000000000000000000000000000000b5702d26fbc4708196f576c1d46b7fc92471154fe81689707069bcb43173ecedc36859b37258c17a4294d56d36befaa9fbd975ce62e5deb542372aef4c9240b43ba584fc98e7c5a5066e1ba4060e96ca4e50daa116366c3aca9dfccef285f405", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f0c0e1e40000000000fe93ba9f3d79ff2d3aeb01726ac4728adf60676494fbd0e596f5972be5f4639102540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f0f000000000000000000000000000000341b9ec871ad41102a671b153ccd014f32cfe167bf5cca3989470a574196d0a401e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f59390f0000000000000000000000000000001eafd27ec73cf8676b02ebb4fa82a5bc67b2298a442322797db8cd996f8866d7bfdca1dadbfc723c27a3b6963a74c78570a41403a9cb454643631157e8bddbda8ccd54062aeec216b94406595aeb140b59afd5e697733f45980831357c0bc804", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f00024f4000000000092a195ef7c5e97512b5eed1dd778db0bd1f1c75cf8cf25b61ec800296e459e6302540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f10000000000000000000000000000000c693ed9bd4639c29ceb962b071e0531512929a139ebed7c5e12989d28b316ddc01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593910000000000000000000000000000000c5043e90fe94a06a8b47242bb084c7dc5f8e46aebbe9b2c5a8db30d44d1a8b55ab981922c453fc2c78b58f7ec56293bb26d02c335079fdd1e246e33607ef473f513bd939cfe20da8b94af0963156c7218be49ffd1efbc9c14429fddf91bf5006", + "57435231012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaaa693d88d083f28b47f2645ed8b2cff1c4c564f4dbef3f273acf037d6375060c185eb41cedc9e3c326c0cc6087de900fb1cd1f72636e2f81db1070f1675c148f04066030100000000d00e25bb474153c30c4bf88f0fb890a0dd10342388c0be87aa93399d54bbaf5502540adcb6a36dc21f91576d7d44c1a247caa4f09cd659376e20820bd77215fc1f110000000000000000000000000000005f50d92c07b2f57953a701633e9d59575664bfe9b13644d5db11c5d04629b08c01e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5159614c2c42bc1b1258aee7faf878dcc0ae9505962d2efde8ce5b156a44f593911000000000000000000000000000000339aa736ed16c43427079481a1b58bb9d370f104bbcba7a9d915ba1528b1a75da2dabf39b4d5d2518a8bef4340b8c5e7b32250ac222cc3e8648a42730b81eeac78da15f7fa7f42f7bb131311eb22aa7f89ada8940b2dd41c18c113a694a50808" + ], + "takes": [ + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f559425465004500032d6893f980a7dad483af70b4e116a10b7caa4e2052593699b2c4d5251f98cf34d11f86821c2cd542f6bbf5152a07ad54b271f65b25309018a0bf0e356fbe70268d3166f7ac16582f4cde87f1ce46d109e4bd0562c3d436da0f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba1307020a0000000000000000000000807f612a01000000c0c1702a01000000300000000000000037090d56c333ad6c4392ffbb8f80b7854c7ae3d562e182d6b76685f99db2ec1f0100000000000000c0c1702a010000000004802a0100000055000000000000003b9b3da8c3121692dbe9b75ff7b37a77773cf7d71d8b7c885253d5b3855c53b902000000000000000004802a0100000040468f2a010000003a0000000000000097f5ee9829746c16c29946a44489846e4a385eb6d62804ba22a18a99a92642ab030000000000000040468f2a0100000080889e2a010000005f000000000000004bb0df0483b6370199dc9196f695ec65b029d8ffb09dfd7ec24bf5d5c59a72f3040000000000000080889e2a01000000c0caad2a010000004400000000000000733b22d5d80b9a80443b60a14334000a8ab43f139364fa9cd3a547e8a7c523640500000000000000c0caad2a01000000000dbd2a0100000069000000000000009395a39fcaaab116f14a5e4f1e51abe694d712e0f912827045471c6283730a480600000000000000000dbd2a01000000404fcc2a010000004e000000000000002b869dfefc2fe0873e06d23c09f1629470a788c6b8f2aa8e6aafb1298cd73fe60700000000000000404fcc2a010000008091db2a0100000033000000000000009f10cb7a3feccf63f5c0c398375eaf998628d314dc8159d15845fe5a0f8a006b08000000000000008091db2a01000000c0d3ea2a0100000058000000000000008b03281ec96d96d0e76e48ef184b7a60d4856eddf77629af961fe54746404ef60900000000000000c0d3ea2a010000000016fa2a010000003d000000000000001fb42eb87b4ea4dc72d02c9e6ea82aab91be4bbef122892b8921e2f552a462678883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f2506000000d7b83f99f213619227fbccadf7069c3f6cffca8e86f2aba6ffb8d15212698fa51be10b08c6e09a1b9314f45c65bf3c9b6bd507cfa5df3f013d50657245ee48c5602f2236c9c17b8a1cca6bae144f8f162627d27095a7256e1c5b8bc199c84fb3d535c9375be68b107355dcfeaab2a78192ba09570642f09de57b7bab1438eadc703cab1c2158dee2277fea9a9b909df1f7926a3a56996b7db1bfbaaba40ffa2970412cc3dc8306ba8f88774f1a622d1bf21b9ef51fb85b990d279f66fed977340159425465004500032d6893f980a7dad483af70b4e116a10b7caa4e205259369900000000000000000000000000000000000000000000000000000000000000001f250bafd7daed705bd36f8138b7419700ffe4c20991a2a46993dfd25b592a3643977ddbb511d2b51471498d51135c1a724a069a507032f2a3ff93aaa9787f0d", + "57544d31012c3f0f62be557631417a492ef4abb5499bf32c6c980dbc9c0539769ecc2bcaaa7d3b3098d82fddc8585faa3e84b8f2c13cb7fc723a01bfb8bbacfba4ed388eee2b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c6b7091c801fbc133089d9612f76d94401ffd0199edd399f9db0beaf3e8a611d45859f57a4fec068477f3a45544119f5202eaf32ee3796401d6319ec7b1bf692810f222415114ff3e773663df797c88d6e11b094c4ffc6694581d843dbfbe8ba130702080000000000000000000000405489000000000010679c000000000030000000000000008fae533ea900dd435a27c7ac6bbe43a78ca53f4ac8bf916accd92a8d374cba94010000000000000010679c0000000000e079af000000000055000000000000006cb63b81a4b11a270dfd91c37eaaed324b1b55999789174218e9990aa186455f0200000000000000e079af0000000000b08cc200000000003a00000000000000e515ec9e690d2bf9be7ce9bd8547b84406445c82682346f3cf84ccb305cf4ae50300000000000000b08cc20000000000809fd500000000005f000000000000008ab19bbbd6173bd1339419c327fadbf9337f7d77aff9e7082ee68da5132756c80400000000000000809fd5000000000050b2e80000000000440000000000000017fca124fd9c32581a3a6f032bc985481cef9852f5f07ba3120fd851511d20ba050000000000000050b2e8000000000020c5fb00000000006900000000000000be2b55d6011931c758ef4700f002f24a947e8e95428049653bc0fc44055b5563060000000000000020c5fb0000000000f0d70e01000000004e0000000000000083da93c67f107a2933b1befbdaaf558a44b2adf41cd3e085f1d48767e8dc3fde0700000000000000f0d70e0100000000c0ea2101000000003300000000000000989f78372ee677d01a1a45c0f4e33989e1e30935ef1f70e0426de38e2cb5ae8a5b8ad24298b11d4afe4acabf254c55d99e1badc4d20a3f293fef3c8e9870e6eb060000000571c24d887ed7ee13662e1b6b5916b05446674f04a48bb9657a88aa791aa4f78c7c1730862c2541afc6faf68f8f1a4b34c99f6c9ea331b8be3a60e97734ac814bcc3352c9690a6b19b9aaa4301286ce746571ec9a1dfd777ce3cdb1ab47ca1ea6e6c44a5d482193b91fac6a4b86aae708a8fe967079b4dc31dbe6e7da840cab0b041b0865ddff65ae4f592bac31b3e3627cb44ed3bfd4678f33dfcdd03c9e684fa04199a174e37753164a4ac950986de9a4abcc3c2cdce827249a9f063289b8012b956ba992dbd2d36d81fc4a4a771b7048b732a2e36ceea2f57448216ef566c600000000000000000000000000000000000000000000000000000000000000008fdd3b426a73d6a2e5ba04781aafc491c5950f29be46baca5bc57f7e54ba95b22dee29ffae444fb5eeee0e941d74e4e71f8dffbe4f45979a1e8c49aebc023c0c" + ], + "logs": "[[{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":0,\"ts_ms\":1792108800500,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":1,\"ts_ms\":1792108801100,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"aecd92c612a3b9704723441772d4704e\",\"sn\":2,\"ts_ms\":1792108822500,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":0,\"ts_ms\":1792108800510,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":1,\"ts_ms\":1792108801147,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":2,\"ts_ms\":1792108805510,\"event\":\"stall-start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":3,\"ts_ms\":1792108805910,\"event\":\"stall-end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"b5b91401f0762725dedbee0f0e447680\",\"sn\":4,\"ts_ms\":1792108822510,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}],[{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":0,\"ts_ms\":1792108800520,\"event\":\"start\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":1,\"ts_ms\":1792108801194,\"event\":\"present\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":{\"unit\":0,\"layers\":1,\"first\":true,\"late_ms\":0,\"decode_us\":900},\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null},{\"v\":1,\"sid\":\"59b8375b353f73cd469c9ecaf790f7bb\",\"sn\":2,\"ts_ms\":1792108822520,\"event\":\"end\",\"cid\":null,\"st\":\"ll\",\"sf\":\"o\",\"object\":null,\"present\":null,\"switch\":null,\"layer_change\":null,\"capable\":null,\"cohort\":null,\"metrics\":null,\"claim\":null}]]", + "outcome": "refuse", + "reason": "unknown_version", + "at": [ + "receipt" + ] + }, { "name": "receipt_bad_signature", "about": "the receipt's signature with one bit flipped", diff --git a/wai/live-conformance/receipt_ledger_verify.py b/wai/live-conformance/receipt_ledger_verify.py index e5dcad6e2..aa7aab1db 100644 --- a/wai/live-conformance/receipt_ledger_verify.py +++ b/wai/live-conformance/receipt_ledger_verify.py @@ -15,9 +15,15 @@ it is; and, under a tariff of version 2 or 3, a media job by route_record_verify _int_motion_receipt.py (integer-payloads §15). Everything else is here: - the tariff (§4): reading, rules, both signatures, its scope, its job prices per capability - (version 2) or per capability and operation (version 3); + (version 2) or per capability and operation (versions 3 and 4), and in version 4 its price of + a room's bytes out, of the work units of a package a run made, and of a package's storage by + byte-days (§4.7); - the invoice (§6): reading, rules, signature, chain, and what a chain bills once (§6.9): in - version 3 a job's work, its route record and hop receipts, and never its output's receipt; + versions 3 and 4 a job's work, its route record and hop receipts, and never its output's + receipt; in version 4 a package's work once per run that made it, its receipt cited by each, + and its storage for each period it is held; +- a job's outputs held to the objects its served hop states it delivered (§5.1), by their + content hashes, computed with ../claim-conformance/_blake3.py; - what each source contributes (§5.2), its placement in time (§5.3), and the checks across sources (§7.2 step 6); - every line, citation, energy row and amount recomputed (§6.2 to §6.6), compared in §7.2 step @@ -60,6 +66,7 @@ import stitched_presentation_verify as STV # noqa: E402 import route_record_verify as RRV # noqa: E402 (it puts ../oer-conformance on the path) import oer2_verify as OER # noqa: E402 import _int_motion_receipt as IMR # noqa: E402 +from _blake3 import blake3 # noqa: E402 from decimal import Decimal, ROUND_HALF_EVEN, localcontext, MAX_PREC, MAX_EMAX, MIN_EMIN # noqa: E402 EXTENSION = os.path.join(HERE, "..", "extensions", "receipt-ledger.md") @@ -77,9 +84,13 @@ OER_RECEIPT, VIDEO_RECEIPT, ROUTE_RECORD = 14, 15, 16 # §5.2, version PRIVATE = 128 # §5.2: 128 to 255, private and provisional use KIND_NAMES = {ROOM: "room", DELIVERY: "delivery", PACKAGE: "package", ADS: "ads", JOB: "job"} STITCHED = "stitched" # §5.1: a source kind billed as ads -SCOPES = {1: "room_hops", 2: "delivery_hops", 3: "packaging", 4: "ad_decisions", 5: "jobs"} # §6.6 -JOB_UNITS = ["jobs", "subpixels"] # §4.5 -JOB_VERSIONS = (2, 3) # §4.5, §4.6: the versions that price jobs +SCOPES = {1: "room_hops", 2: "delivery_hops", 3: "packaging", 4: "ad_decisions", 5: "jobs", 6: "unbilled_hops"} # §6.6 +CONTENT_DOMAIN = b"moq-jwp:object\x01" # route-record §2, jwp-receipts §2.1 +DAY_US = 86400 * 10 ** 6 # §4.7: a byte-day's day +JOB_UNITS = ["jobs", "subpixels", "work_units"] # §4.5; the third in version 4 (§4.7) +JOB_VERSIONS = (2, 3, 4) # §4.5, §4.6, §4.7: the versions that price jobs +WORK_VERSIONS = (3, 4) # §4.6, §6.9: priced per operation, billed by the work +V4 = 4 # §4.7: bytes out, work units, storage by byte-days CAPABILITY = re.compile(r"\Awai\.[a-z0-9_.]{0,124}\Z") OPERATION = re.compile(r"\A[a-z][a-z0-9]*\.[a-z][a-z0-9]*\Z") # §4.6, route-record §2 LABELS = {2: "ModelBased", 3: "Estimator", 4: "OnChipCounter", 5: "CalibratedInstrument"} @@ -92,6 +103,18 @@ UNITS = { # §6.3: name, PACKAGE: [("packages", 1), ("entries", 1), ("stored_bytes", 10 ** 9)], ADS: [("presented_impressions", 1), ("billable_impressions", 1)], } +UNITS_4 = dict(UNITS) # §4.7, §6.3: version 4's +UNITS_4[ROOM] = UNITS[ROOM] + [("bytes_out", 10 ** 9)] +UNITS_4[PACKAGE] = [None, None, ("byte_days", 10 ** 9)] # a package source bills its storage alone + + +def units(version): + return UNITS_4 if version == V4 else UNITS + + +def scopes(version): + """§6.1: the scopes an invoice of `version` states.""" + return 6 if version == V4 else 5 if version in JOB_VERSIONS else 4 SKIP = set() @@ -134,7 +157,7 @@ def head(b, magic): return "malformed" if len(b) < 5: return "truncated" - if b[4] not in (1, 2, 3): + if b[4] not in (1, 2, 3, 4): return "unknown_version" return None @@ -160,16 +183,18 @@ def read_tariff(b): r = R(b, 5) try: t = {"seller": r.take(32), "buyer": r.take(32), "start": r.u(8), "end": r.u(8), "currency": r.take(3)} - t["room"] = [r.u(4) for _ in range(13)] + # §4.1: version 4 states a fourteenth room price, of bytes out; versions 1 to 3 read it as 0. + t["room"] = [r.u(4) for _ in range(14 if b[4] == V4 else 13)] + ([] if b[4] == V4 else [0]) t["delivery"] = [r.u(8) for _ in range(4)] - t["package"] = [r.u(8) for _ in range(3)] + # §4.1: version 4 states one package price, per 10^9 byte-days held; the others read as 0. + t["package"] = [0, 0, r.u(8)] if b[4] == V4 else [r.u(8) for _ in range(3)] t["ads"] = [r.u(8) for _ in range(2)] t["version"] = b[4] t["job"] = [] # (capability, operation, unit, divisor, price) if t["version"] in JOB_VERSIONS: # §4.5, §4.6 for _ in range(r.u(2)): cap = r.take(r.u(1)) - op = r.take(r.u(1)) if t["version"] == 3 else b"" + op = r.take(r.u(1)) if t["version"] in WORK_VERSIONS else b"" t["job"].append((cap, op, r.u(1), r.u(8), r.u(8))) t["scope"] = [(r.u(1), r.take(32)) for _ in range(r.u(2))] body_end = r.p @@ -183,8 +208,9 @@ def read_tariff(b): cap, op = j[0].decode("utf-8"), j[1].decode("utf-8") except UnicodeDecodeError: return False - named = OPERATION.match(op) is not None and len(j[1]) <= 128 if t["version"] == 3 else op == "" - return CAPABILITY.match(cap) is not None and named and 1 <= j[2] <= len(JOB_UNITS) and j[3] >= 1 + named = OPERATION.match(op) is not None and len(j[1]) <= 128 if t["version"] in WORK_VERSIONS else op == "" + units_priced = 3 if t["version"] == V4 else 2 + return CAPABILITY.match(cap) is not None and named and 1 <= j[2] <= units_priced and j[3] >= 1 top = 5 if t["version"] in JOB_VERSIONS else 4 rules = (t["start"] < t["end"] and capitals(t["currency"]) and t["seller"] != ZERO and t["buyer"] != ZERO and t["seller"] != t["buyer"] and t["scope"] and ascending(t["scope"]) @@ -210,7 +236,7 @@ def price(t, kind, unit): def divisor(t, kind, unit): - return t["job"][unit - 1][3] if kind == JOB else UNITS[kind][unit - 1][1] + return t["job"][unit - 1][3] if kind == JOB else units(t["version"])[kind][unit - 1][1] # ---------------------------------------------------------------- §6 the invoice @@ -231,7 +257,8 @@ def read_invoice(b, at): i["energy"] = [(r.u(1), r.u(1), r.u(4), r.u(8), r.u(4)) for _ in range(r.u(1))] i["version"] = b[4] v2 = i["version"] in JOB_VERSIONS - i["unmetered"] = [r.u(4) for _ in range(5 if v2 else 4)] + ([] if v2 else [0]) + n = scopes(i["version"]) + i["unmetered"] = [r.u(4) for _ in range(n)] + [0] * (6 - n) i["amount"] = r.u(8) sig = r.take(64) except ValueError: @@ -246,12 +273,13 @@ def read_invoice(b, at): def unit_ok(x): if x["kind"] == JOB: return v2 and x["unit"] >= 1 - return x["kind"] in UNITS and 1 <= x["unit"] <= len(UNITS[x["kind"]]) + u = units(i["version"]) + return x["kind"] in u and 1 <= x["unit"] <= len(u[x["kind"]]) and u[x["kind"]][x["unit"] - 1] is not None rules = (i["start"] < i["end"] and capitals(i["currency"]) and ascending(i["records"]) and all(1 <= k <= 9 or (v2 and OER_RECEIPT <= k <= ROUTE_RECORD) for k, _ in i["records"]) and ascending(keys) and all(unit_ok(x) and x["quantity"] > 0 and x["cited"] > 0 for x in i["lines"]) and ascending([(e[0], e[1]) for e in i["energy"]]) - and all(1 <= e[0] <= (5 if v2 else 4) and 2 <= e[1] <= 5 and e[2] > 0 for e in i["energy"])) + and all(1 <= e[0] <= scopes(i["version"]) and 2 <= e[1] <= 5 and e[2] > 0 for e in i["energy"])) if not rules and "invoice-rules" not in SKIP: raise Refuse("invoice_invalid", at) bad = verify_sig(i["seller"], INVOICE_DOMAIN, b[:-64], sig) @@ -283,9 +311,13 @@ def room_source(s): d = LRV.read_descriptor(bytes.fromhex(s["room"]["descriptor"])) rc = LMV.read_receipt(bytes.fromhex(s["receipt"]), d["room"]) u = rc["units"] - units = [u["publisher_us"]] + list(u["subscriber_us"]) + [u["composition_us"], u["recorded_us"], u["events_sent"]] + # A receipt of version 2 states its bytes out and their price (live-metering §4.4, §4.6); + # version 1 states neither, read as 0. + figures = [u["publisher_us"]] + list(u["subscriber_us"]) + [u["composition_us"], u["recorded_us"], u["events_sent"], + u.get("bytes_out", 0)] + prices = list(rc["prices"]) + [0] * (14 - len(rc["prices"])) return {"kind": ROOM, "digest": rc["digest"], "room": d["room"], "t0": d["t0"], "start": rc["start"], "end": rc["end"], - "units": units, "currency": rc["currency"], "prices": rc["prices"], + "units": figures, "currency": rc["currency"], "prices": prices, "hops": [(h["record"], figure(h["joules"], h["class"])) for h in rc["hops"]]} @@ -336,7 +368,8 @@ def package_source(s): tag = TAGS[j["energy_provenance"]] cls = (tag, j["energy_uncertainty"]["relative_ppm"] if tag in (4, 5) else 0) return {"kind": PACKAGE, "digest": bytes.fromhex(j["receipt_hash"]), "signer": bytes.fromhex(j["signer_pubkey"]), - "entries": j["total_entries"], "stored": j["stored_bytes"], "figure": figure(j["joules_micro"], cls)} + "entries": j["total_entries"], "stored": j["stored_bytes"], + "figure": figure(j["joules_micro"], cls), "held": None} def ads_source(s): @@ -445,7 +478,12 @@ def job_figure(r): return (tag, j, c["relative_ppm"] if tag in (4, 5) else 0) -def job_source(s): +def content_hash(b): + """route-record §2: an object's content hash (jwp-receipts §2.1).""" + return blake3(CONTENT_DOMAIN + b) + + +def job_source(s, version): if set(s) != {"kind", "request", "pricebook", "policy", "record", "receipts", "keys", "outputs"} \ or s["receipts"] is None or s["keys"] is None or not isinstance(s["outputs"], list): raise Refuse("malformed", []) @@ -465,21 +503,62 @@ def job_source(s): raise Refuse("job_figure_invalid", ["receipts", j]) billed = (cap.encode("utf-8"), oer_identity(a["receipt"])) break - outputs = [] + unbilled = [] # §6.6, version 4: every hop's figure + if version == V4 and "unbilled-hops" not in SKIP: + for a in rec["attempts"]: + if a["billed"] is True: + continue + j = next(i for i, t in enumerate(texts) if isinstance(t, dict) and t.get("receipt_id") == a["receipt"]) + f = job_figure(texts[j]) + if f is None: + raise Refuse("job_figure_invalid", ["receipts", j]) + unbilled.append(f) + # §5.1: the objects the served hop states it delivered, when its record states them (version + # 2); under version 4 a record that states none holds every output to none. + if rec["version"] == 2: + delivered = {bytes.fromhex(h) for a in rec["attempts"] if a["outcome"] == "served" for h in a["outputs"]} + elif version == V4: + delivered = set() + else: + delivered = None + if "output-delivered" in SKIP: + delivered = None + seen = set() + outputs, packages = [], [] + hexs = re.compile(r"(?:[0-9a-f]{2})*") for i, x in enumerate(s["outputs"]): - if not isinstance(x, dict) or set(x) != {"receipt", "codestream"} or not isinstance(x["receipt"], str) \ - or not isinstance(x["codestream"], str) or not re.fullmatch(r"(?:[0-9a-f]{2})*", x["codestream"]): - raise Refuse("malformed", []) - try: - r = IMR.read(x["receipt"]) - except IMR.Bad: - raise Refuse("output_invalid", ["outputs", i]) - if "output" not in SKIP and IMR.rederived(r, bytes.fromhex(x["codestream"])) is not None: - raise Refuse("output_invalid", ["outputs", i]) - outputs.append((IMR.receipt_hash(r), r["work"])) + if version == V4 and isinstance(x, dict) and set(x) == {"package", "indexes"}: + # §4.7: a package a run of `package.build` made, its object its receipt's text. + if not isinstance(x["package"], str) or not isinstance(x["indexes"], list) \ + or not all(isinstance(h, str) and hexs.fullmatch(h) for h in x["indexes"]): + raise Refuse("malformed", []) + try: + pr = PV.read_receipt(x["package"].encode("utf-8")) + PV.verify_receipt_v2(pr, [bytes.fromhex(h) for h in x["indexes"]]) + except PV.Refused: + raise Refuse("output_invalid", ["outputs", i]) + obj = x["package"].encode("utf-8") + packages.append((bytes.fromhex(pr["json"]["receipt_hash"]), pr["json"]["work_units"] if "run-work" not in SKIP else 0)) + else: + if not isinstance(x, dict) or set(x) != {"receipt", "codestream"} or not isinstance(x["receipt"], str) \ + or not isinstance(x["codestream"], str) or not hexs.fullmatch(x["codestream"]): + raise Refuse("malformed", []) + try: + r = IMR.read(x["receipt"]) + except IMR.Bad: + raise Refuse("output_invalid", ["outputs", i]) + if "output" not in SKIP and IMR.rederived(r, bytes.fromhex(x["codestream"])) is not None: + raise Refuse("output_invalid", ["outputs", i]) + obj = bytes.fromhex(x["codestream"]) + outputs.append((IMR.receipt_hash(r), r["work"])) + if delivered is not None: + h = content_hash(obj) + if h not in delivered or h in seen: + raise Refuse("output_not_delivered", ["outputs", i]) + seen.add(h) return {"kind": JOB, "digest": bytes.fromhex(RRV.digest(rec)), "router": bytes.fromhex(rec["signer"]), "job": rec["job"], "operation": rec["operation"].encode("utf-8"), "accepted": rec["accepted"], "hops": [oer_identity(a["receipt"]) for a in rec["attempts"]], "billed": billed, - "figure": fig, "outputs": outputs} + "figure": fig, "outputs": outputs, "packages": packages, "unbilled": unbilled} _SOURCES = {} @@ -488,7 +567,8 @@ _SOURCES = {} def verify_source(s, signers, version=1): """§5.1: the source verified by its own extension, a stitched source with `signers`, a job source under a tariff of version 2 or 3, or Refuse with that extension's place.""" - key = json.dumps([s, sorted(k.hex() for k in signers), version in JOB_VERSIONS, sorted(SKIP & {"job-figure", "output"})], sort_keys=True) + key = json.dumps([s, sorted(k.hex() for k in signers), version if isinstance(s, dict) and s.get("kind") == "job" else version in JOB_VERSIONS, + sorted(SKIP & {"job-figure", "output", "output-delivered", "unbilled-hops", "run-work"})], sort_keys=True) if key not in _SOURCES: try: _SOURCES[key] = read_source(s, signers, version) @@ -506,7 +586,7 @@ def read_source(s, signers, version): if s.get("kind") == "stitched": return stitched_source(s, signers) if s.get("kind") == "job" and version in JOB_VERSIONS: - return job_source(s) + return job_source(s, version) readers = {"room": room_source, "delivery": delivery_source, "package": package_source, "ads": ads_source} if s.get("kind") not in readers: raise Refuse("malformed", []) @@ -541,6 +621,7 @@ def contributed(f): out |= {(STITCHED_CLAIM, c) for c in f["claims"]} elif f["kind"] == JOB: out |= {(OER_RECEIPT, h) for h in f["hops"]} | {(VIDEO_RECEIPT, h) for h, _ in f["outputs"]} + out |= {(PACK, h) for h, _ in f["packages"]} return out @@ -555,7 +636,9 @@ def check_source(t, start, end, f): if f["kind"] == ROOM: if not in_scope(t, 1, f["room"]): return "outside_scope" - if f["currency"] != bytes(3) and (f["currency"] != t["currency"] or f["prices"] != t["room"]) and "conflict" not in SKIP: + # §3: the thirteen prices, and the price of bytes out (§4.7), 0 where either states none. + prices = f["prices"] if "conflict-bytes" not in SKIP else f["prices"][:13] + t["room"][13:] + if f["currency"] != bytes(3) and (f["currency"] != t["currency"] or prices != t["room"]) and "conflict" not in SKIP: return "tariff_conflict" if not within(f["t0"] + f["start"], f["t0"] + f["end"]): return "outside_period" @@ -607,10 +690,23 @@ def bills_again(f, g, version): def billed_once(version, kind): - """§6.9: whether a chain bills a record of `kind` once. In version 3 a job's output receipt is - the evidence of what it delivered, which a re-run delivers again; its work, the route record and - the hop receipts, is billed once.""" - return not (kind == VIDEO_RECEIPT and (version == 3 or "output-once" in SKIP)) + """§6.9: whether a chain bills a record of `kind` once. In versions 3 and 4 a job's output + receipt is the evidence of what it delivered, which a re-run delivers again; its work, the route + record and the hop receipts, is billed once. In version 4 a package receipt is listed again by + each invoice that bills its storage (§4.7).""" + if kind == PACK and version == V4 and "package-again" not in SKIP: + return False + return not (kind == VIDEO_RECEIPT and (version in WORK_VERSIONS or "output-once" in SKIP)) + + +def hold(t, facts, previous, start, end): + """§4.7: under version 4, a package the previous invoice lists is held through [start, end).""" + if t["version"] != V4: + return + held = {i for k, i in (previous["records"] if previous else []) if k == PACK} + for k, f in enumerate(facts): + if f["kind"] == PACKAGE: # a copy: a source's facts are shared by every vector that gives it + facts[k] = dict(f, held=end - start if f["digest"] in held and "storage-held" not in SKIP else None) def check_across(facts, previous, version=1): @@ -660,7 +756,7 @@ def compute(t, facts): e[1] |= set(cites) for f in facts: if f["kind"] == ROOM: - for unit in range(1, 14): + for unit in range(1, 15 if t["version"] == V4 and "bytes-out" not in SKIP else 14): add(ROOM, f["room"], unit, f["units"][unit - 1], [(SESSION, f["digest"])]) elif f["kind"] == DELIVERY: st = f["statement"] @@ -672,6 +768,9 @@ def compute(t, facts): cites += [(ACK, a["digest"]) for a in f["acks"] if a["mode"] == 1 and any(e["class"] == c and not free(c, e["grant"]) for e in a["entries"])] add(DELIVERY, st["party"], c, n, cites) + elif f["kind"] == PACKAGE and t["version"] == V4: # §4.7: the product held, its storage alone + if f["held"] is not None: + add(PACKAGE, f["signer"], 3, f["stored"] * f["held"], [(PACK, f["digest"])]) # byte-microseconds elif f["kind"] == PACKAGE: cite = [(PACK, f["digest"])] add(PACKAGE, f["signer"], 1, 1, cite) @@ -686,14 +785,17 @@ def compute(t, facts): continue cap, hop = f["billed"] for k, (pcap, pop, unit, _, _) in enumerate(t["job"]): - if pcap != cap or (t["version"] == 3 and pop != f["operation"] and "operation" not in SKIP): + if pcap != cap or (t["version"] in WORK_VERSIONS and pop != f["operation"] and "operation" not in SKIP): continue cites = [(ROUTE_RECORD, f["digest"]), (OER_RECEIPT, hop)] if unit == 1: n = 1 - else: + elif unit == 2: cites += [(VIDEO_RECEIPT, h) for h, w in f["outputs"] if w > 0] n = sum(w for _, w in f["outputs"]) + else: # §4.7: the work units of its packages + cites += [(PACK, h) for h, w in f["packages"] if w > 0] + n = sum(w for _, w in f["packages"]) add(JOB, f["router"], k + 1, n, cites) else: unit = 1 if f["claims_required"] else 2 @@ -704,6 +806,10 @@ def compute(t, facts): lines, total = [], 0 for (kind, source, unit) in sorted(q): n, cited = q[(kind, source, unit)] + if t["version"] == V4 and kind == PACKAGE and unit == 3: + n //= DAY_US # §4.7: byte-days, rounded down once per line + if n == 0: + continue p = price(t, kind, unit) a = n * p // divisor(t, kind, unit) if n > U64 or a > U64: @@ -725,12 +831,14 @@ def compute(t, facts): seen.add(d) figs.append((2, fig)) for f in facts: - if f["kind"] == PACKAGE: + if f["kind"] == PACKAGE and t["version"] != V4: # §6.6: in version 4, its run's hop states it figs.append((3, f["figure"])) elif f["kind"] == ADS: figs += [(4, r["figure"]) for r in f["receipts"]] - elif f["kind"] == JOB and f["figure"] is not None: - figs.append((5, f["figure"])) + elif f["kind"] == JOB: + if f["figure"] is not None: + figs.append((5, f["figure"])) + figs += [(6, x) for x in f["unbilled"]] rows, unmetered, sums = rows_of(figs) if rows is None or total > U64: return None @@ -738,7 +846,7 @@ def compute(t, facts): def rows_of(figs): - unmetered = [0, 0, 0, 0, 0] + unmetered = [0, 0, 0, 0, 0, 0] acc = {} for s, (tag, joules, ppm) in figs: if tag is None: @@ -925,6 +1033,7 @@ def verify(doc): across = check_across(facts, prev, t["version"]) # step 6 if across: raise Refuse(across[1], ["source", across[0]]) + hold(t, facts, prev, inv["start"], inv["end"]) c = compute(t, facts) # step 7 if c is None: raise Refuse("invoice_mismatch", ["invoice"]) @@ -939,19 +1048,19 @@ def verify(doc): def line_json(x, t): """§7.3: a line, a job line naming its job price's unit and capability.""" out = {"source_kind": KIND_NAMES[x["kind"]], "source": x["source"].hex(), - "unit": JOB_UNITS[t["job"][x["unit"] - 1][2] - 1] if x["kind"] == JOB else UNITS[x["kind"]][x["unit"] - 1][0], + "unit": JOB_UNITS[t["job"][x["unit"] - 1][2] - 1] if x["kind"] == JOB else units(t["version"])[x["kind"]][x["unit"] - 1][0], "quantity": x["quantity"], "price": x["price"], "amount": x["amount"], "cites": [[k, i.hex()] for k, i in x["cited_records"]]} if x["kind"] == JOB: out["capability"] = t["job"][x["unit"] - 1][0].decode("utf-8") - if t["version"] == 3: + if t["version"] in WORK_VERSIONS: out["operation"] = t["job"][x["unit"] - 1][1].decode("utf-8") return out def accepted(inv, facts, c, t): unmetered, coverage = {}, {} - for s in range(1, 6 if inv["version"] in JOB_VERSIONS else 5): + for s in range(1, scopes(inv["version"]) + 1): n = inv["unmetered"][s - 1] unmetered[SCOPES[s]] = n coverage[SCOPES[s]] = "partial" if n > 0 else "whole" if any(r[0] == s for r in inv["energy"]) else "none" @@ -1070,6 +1179,35 @@ def mutations(doc): m = copy.deepcopy(doc) m["vectors"][k]["sources"] = ["job_rerun_replays_its_hop"] out.append(("a_rerun_billed: its re-run replaced by one replaying the billed hop", m)) + if "version_4_by_the_byte_and_the_work" in names: # version 4, §4.7, §6.6 + k = names["version_4_by_the_byte_and_the_work"] + lines = doc["vectors"][k]["outcome"]["lines"] + bo = next(i for i, x in enumerate(lines) if x["unit"] == "bytes_out") + m = copy.deepcopy(doc) + m["vectors"][k]["outcome"]["lines"][bo]["quantity"] -= 1 + out.append(("version_4_by_the_byte_and_the_work: its bytes out stated one less", m)) + m = copy.deepcopy(doc) + m["vectors"][k]["outcome"]["energy"] = [e for e in doc["vectors"][k]["outcome"]["energy"] if e["scope"] != "unbilled_hops"] + out.append(("version_4_by_the_byte_and_the_work: the unbilled hops' rows dropped", m)) + m = copy.deepcopy(doc) + m["vectors"][k]["outcome"]["coverage"]["unbilled_hops"] = "whole" + out.append(("version_4_by_the_byte_and_the_work: the unbilled hops' coverage stated whole", m)) + wu = next(i for i, x in enumerate(lines) if x["unit"] == "work_units") + m = copy.deepcopy(doc) + m["vectors"][k]["outcome"]["lines"][wu]["unit"] = "entries" + out.append(("version_4_by_the_byte_and_the_work: its work units named entries", m)) + k = names["version_4_storage_held_through_a_period"] + lines = doc["vectors"][k]["outcome"]["lines"] + bd = next(i for i, x in enumerate(lines) if x["unit"] == "byte_days") + m = copy.deepcopy(doc) + m["vectors"][k]["outcome"]["lines"][bd]["quantity"] += 1 + out.append(("version_4_storage_held_through_a_period: a byte-day more", m)) + m = copy.deepcopy(doc) + m["vectors"][k]["previous"] = None + out.append(("version_4_storage_held_through_a_period: the invoice before it not given", m)) + m = copy.deepcopy(doc) + m["sources"]["job_v2_encode"]["outputs"] = doc["sources"]["job_v2_another_output"]["outputs"] + out.append(("job_v2_encode: its output replaced by another clip's receipt", m)) for k, v in enumerate(doc["vectors"]): if v["outcome"]["outcome"] == "refuse": m = copy.deepcopy(doc) @@ -1081,7 +1219,8 @@ def mutations(doc): CHECKS = ["signatures", "buyer-signature", "tariff-rules", "invoice-rules", "row-of-no-class", "binding", "outside-tariff", "previous-given", "previous-overlap", "scope", "conflict", "period", "duplicate", "overlap", "rebilled", "quantity", - "summed", "citations", "mismatch", "job-figure", "output", "job-duplicate", "private-kind", "operation", "output-once"] + "summed", "citations", "mismatch", "job-figure", "output", "job-duplicate", "private-kind", "operation", "output-once", + "output-delivered", "unbilled-hops", "storage-held", "package-again", "run-work", "bytes-out", "conflict-bytes"] def main(corpus_dir): diff --git a/wai/wai-ledger/src/ledger.rs b/wai/wai-ledger/src/ledger.rs index a8dda700e..24aeeaefc 100644 --- a/wai/wai-ledger/src/ledger.rs +++ b/wai/wai-ledger/src/ledger.rs @@ -66,6 +66,15 @@ impl Chain { fn billed(&self, h: &Held) -> bool { h.facts.heads().iter().all(|r| self.billed.contains(r)) } + + /// Whether the next invoice bills `h`: a source the chain has not billed, or, under a tariff + /// of version 4, a package the last invoice holds, whose storage each period bills (§4.7). + fn bills(&self, h: &Held) -> bool { + let held = || { + matches!(h.facts, Facts::Package(_)) && self.tariff.version == rl::VERSION_4 && self.invoices.last().is_some_and(|(i, _, _)| h.facts.heads().iter().all(|r| i.records.contains(r))) + }; + !self.billed(h) || held() + } } pub struct Ledger { @@ -100,7 +109,7 @@ impl Ledger { for (_, p) in numbered(&d.join("sources"), "json")? { let text = std::fs::read_to_string(&p).map_err(|e| format!("{}: {e}", p.display()))?; let doc: Value = serde_json::from_str(&text).map_err(|e| format!("{}: {e}", p.display()))?; - let facts = rl::verify_source(&doc, &rl::signers(&chain.tariff)).map_err(|(r, w)| format!("{}: refused {r} at {w}", p.display()))?; + let facts = rl::verify_source_of(&doc, &rl::signers(&chain.tariff), chain.tariff.version).map_err(|(r, w)| format!("{}: refused {r} at {w}", p.display()))?; chain.sources.push(Held { doc, facts }); } let mut prev = [0u8; 32]; @@ -148,7 +157,7 @@ impl Ledger { /// and checked against everything held under the tariff (step 6), then kept. pub fn add_source(&mut self, tariff: &[u8; 32], doc: Value) -> Result, Error> { let c = self.chain(tariff)?; - let facts = rl::verify_source(&doc, &rl::signers(&c.tariff)).map_err(|(r, at)| { + let facts = rl::verify_source_of(&doc, &rl::signers(&c.tariff), c.tariff.version).map_err(|(r, at)| { let mut a = vec![json!("source")]; a.extend(at.as_array().cloned().unwrap_or_default()); Error::Refused((r, Value::Array(a))) @@ -157,9 +166,12 @@ impl Ledger { let mut all: Vec = c.sources.iter().map(|h| h.facts.clone()).collect(); all.push(facts.clone()); rl::check_across(c.tariff.version, &all, None).map_err(|(_, r)| refuse(r.code(), json!(["source"])))?; - // A record the chain billed is billed never again; under a tariff of version 3, a job's - // output receipt is cited again by a re-run, whose hop and route record are new (§6.9). - if facts.records().iter().any(|r| rl::billed_once(c.tariff.version, r.0) && c.billed.contains(r)) { + // A record the chain billed is billed never again; under a tariff of version 3 or 4, a + // job's output receipt is cited again by a re-run, whose hop and route record are new + // (§6.9). A package source is brought once: the ledger holds it, and under version 4 bills + // its storage each period from what it holds (§4.7). + let package_again = matches!(facts, Facts::Package(_)) && facts.heads().iter().all(|h| c.billed.contains(h)); + if package_again || facts.records().iter().any(|r| rl::billed_once(c.tariff.version, r.0) && c.billed.contains(r)) { return Err(refuse(Reason::RecordRebilled.code(), json!(["source"]))); } let n = c.sources.len() as u64; @@ -176,7 +188,7 @@ impl Ledger { pub fn invoice(&mut self, tariff: &[u8; 32], start: u64, end: u64) -> Result { let c = self.chain(tariff)?; let t = &c.tariff; - let selected: Vec = c.sources.iter().filter(|h| !c.billed(h) && rl::check_source(t, start, end, &h.facts).is_ok()).map(|h| h.doc.clone()).collect(); + let selected: Vec = c.sources.iter().filter(|h| c.bills(h) && rl::check_source(t, start, end, &h.facts).is_ok()).map(|h| h.doc.clone()).collect(); let prev = c.invoices.last().map(|(i, _, _)| i); let inv = rl::make_invoice(&self.key, t, prev, start, end, &selected)?; let bytes = inv.to_bytes(); diff --git a/wai/wai-ledger/src/tests.rs b/wai/wai-ledger/src/tests.rs index aca1d387e..b7283ddbd 100644 --- a/wai/wai-ledger/src/tests.rs +++ b/wai/wai-ledger/src/tests.rs @@ -1,7 +1,8 @@ //! The service's ledger against the committed corpus (`live-conformance/ledger/`): given the //! corpus's tariff and sources in the corpus's order, it issues the corpus's invoices byte for //! byte, with the outcomes the corpus states; it recovers its chain from its directory after a -//! restart; it bills each source once, and under a tariff of version 3 a job's work once; and +//! restart; it bills each source once, under a tariff of version 3 a job's work once, and under +//! one of version 4 a package's work once per run and its storage each period it holds it; and //! one process holds its directory. use std::path::PathBuf; @@ -134,6 +135,33 @@ fn a_rerun_is_billed_and_a_replayed_hop_is_not() { let _ = std::fs::remove_dir_all(&dir); } +/// Under a tariff of version 4 the ledger bills a package's work once per run and its storage for +/// each period it holds it (receipt-ledger §4.7): it issues the corpus's chain of version 4 byte +/// for byte, the package the first invoice listed held into the next and billed its byte-days +/// there beside the run that made it again; it refuses that package brought again as a source, +/// and the replay of its first run. +#[test] +fn a_package_is_billed_its_work_once_and_its_storage_each_period() { + let doc = corpus(); + let (a, b) = (vector(&doc, "version_4_by_the_byte_and_the_work"), vector(&doc, "version_4_storage_held_through_a_period")); + let dir = scratch("storage"); + let t = tariff_of(a); + let mut l = Ledger::open(&dir, seller()).unwrap(); + l.add_tariff(&unhex(a["tariff"].as_str().unwrap()).unwrap()).unwrap(); + add_sources(&mut l, &doc, a); + let (start, end) = (a["outcome"]["start"].as_u64().unwrap(), a["outcome"]["end"].as_u64().unwrap()); + let i = l.invoice(&t, start, end).unwrap(); + assert_eq!(Value::String(crate::ledger::hex(&i.invoice)), a["invoice"], "the corpus's first invoice of version 4, byte for byte"); + assert_eq!(reason(l.add_source(&t, doc["sources"]["package_base"].clone()).unwrap_err()), "record_duplicate", "a package the ledger holds already"); + assert_eq!(reason(l.add_source(&t, doc["sources"]["package_run_replayed"].clone()).unwrap_err()), "record_duplicate", "the first run's hop receipt, held already"); + l.add_source(&t, doc["sources"]["package_staged"].clone()).unwrap(); + l.add_source(&t, doc["sources"]["package_run_again"].clone()).unwrap(); + let j = l.invoice(&t, end, b["outcome"]["end"].as_u64().unwrap()).unwrap(); + assert_eq!(Value::String(crate::ledger::hex(&j.invoice)), b["invoice"], "the held package's storage, billed in the next invoice"); + assert_eq!(j.outcome, b["outcome"]); + let _ = std::fs::remove_dir_all(&dir); +} + #[test] fn one_process_holds_the_directory_and_tariffs_are_its_sellers() { let doc = corpus(); diff --git a/wai/wai-rs/src/c2pa_emit.rs b/wai/wai-rs/src/c2pa_emit.rs index dd3116587..096804d9c 100644 --- a/wai/wai-rs/src/c2pa_emit.rs +++ b/wai/wai-rs/src/c2pa_emit.rs @@ -940,6 +940,7 @@ mod tests { fn session_receipt(totals: Vec, unmetered: u8) -> crate::live_metering::SessionReceipt { use crate::live_metering::*; SessionReceipt { + version: RECORD_VERSION, room: [7; 32], signer: [8; 32], start: 0, diff --git a/wai/wai-rs/src/live_metering.rs b/wai/wai-rs/src/live_metering.rs index ad7b7fe58..70fd1d073 100644 --- a/wai/wai-rs/src/live_metering.rs +++ b/wai/wai-rs/src/live_metering.rs @@ -14,7 +14,9 @@ //! //! - §3: the per-hop record in versions 1 and 2, its track entries, its ledger, version 2's //! DVR figures and the size bound of each version; -//! - §4: the receipt, its units, its totals, its ceilings and its QoE cell; +//! - §4: the receipt in versions 1 and 2, its units, its totals, its ceilings and its QoE +//! cell; version 2 adds the bytes the hops sent the session's sessions, priced per 10^9 +//! bytes; //! - §5: verification, over the room ([`crate::live_room`]), the takes //! ([`crate::capture_take`]) and the composition receipts ([`crate::live_compose`]); //! - §6: the QoE observations' CMCD event-timeline record and `application/cmcd` batch. @@ -55,6 +57,9 @@ pub const SESSION_MAGIC: [u8; 4] = *b"WMR1"; pub const RECORD_VERSION: u8 = 1; /// The version of a per-hop record with DVR figures (§3.1, §3.9). pub const HOP_VERSION_DVR: u8 = 2; +/// The version of a receipt that states the bytes its hops sent and prices them (§4.1, +/// §4.4, §4.6). +pub const SESSION_VERSION_BYTES: u8 = 2; /// The domain a per-hop record's signature is made over (§3.5). pub const HOP_DOMAIN: &[u8] = b"wai:metering-hop\x01"; /// The domain a receipt's signature is made over (§4.2). @@ -79,8 +84,12 @@ pub const QOE_MIN_SESSIONS: usize = 50; pub const ENTRY_LEN: usize = 90; /// A ledger entry's length (§3.4). pub const LEDGER_ENTRY_LEN: usize = 143; -/// A consumption entry's length (§4.6). +/// A consumption entry's length (§4.6), in a receipt of version 1. pub const CONSUMPTION_LEN: usize = 198; +/// A consumption entry's length in a receipt of version 2, which adds its `bytes_out` (§4.6). +pub const CONSUMPTION_LEN_2: usize = 206; +/// The divisor of the price of bytes out (§4.6): per 10^9 bytes. +pub const BYTES_DIVISOR: u128 = 1_000_000_000; /// The longest calibration reference a record carries (§3.6). pub const MAX_CALIBRATION_REF: usize = 255; /// The fixed fields of a version 1 record (§3.7), and its longest class evidence. @@ -813,7 +822,7 @@ pub struct Total { } /// A tariff (§4.6): prices in millionths of a minor unit, per second of each time unit -/// and per event sent. A zero `currency` is no tariff. +/// and per event sent, and in version 2 per 10^9 bytes out. A zero `currency` is no tariff. #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] pub struct Tariff { pub currency: [u8; 3], @@ -822,6 +831,20 @@ pub struct Tariff { pub composition: u32, pub recorded: u32, pub event: u32, + /// Version 2: per 10^9 bytes the hops sent the session's sessions (§4.6); 0 in version 1, + /// which states no such price. + pub bytes: u32, +} + +impl Tariff { + /// Its prices in §4.1's order: thirteen, and in version 2 the price of bytes out. + pub fn prices(&self, version: u8) -> Vec { + let mut p: Vec = std::iter::once(self.publisher).chain(self.subscriber).chain([self.composition, self.recorded, self.event]).collect(); + if version == SESSION_VERSION_BYTES { + p.push(self.bytes); + } + p + } } /// The session's units (§4.4). @@ -834,20 +857,27 @@ pub struct Units { pub events_sent: u64, pub events_delivered: u64, pub recorded_us: u64, + /// Version 2: the payload bytes the hops sent the session's sessions, their ledger + /// entries' `bytes_out` (§4.4); 0 in version 1, which states none. + pub bytes_out: u64, } impl Units { - fn encode(&self, o: &mut Vec) { + fn encode(&self, o: &mut Vec, version: u8) { o.extend_from_slice(&self.publisher_us.to_le_bytes()); put_u64s(o, &self.subscriber_us); put_u64s(o, &[self.sessions, self.composition_us, self.events_sent, self.events_delivered, self.recorded_us]); + if version == SESSION_VERSION_BYTES { + o.extend_from_slice(&self.bytes_out.to_le_bytes()); + } } - fn read(r: &mut Rd) -> Result { + fn read(r: &mut Rd, version: u8) -> Result { let publisher_us = r.u64()?; let subscriber_us = r.u64s()?; let [sessions, composition_us, events_sent, events_delivered, recorded_us] = r.u64s()?; - Ok(Units { publisher_us, subscriber_us, sessions, composition_us, events_sent, events_delivered, recorded_us }) + let bytes_out = if version == SESSION_VERSION_BYTES { r.u64()? } else { 0 }; + Ok(Units { publisher_us, subscriber_us, sessions, composition_us, events_sent, events_delivered, recorded_us, bytes_out }) } } @@ -897,6 +927,8 @@ impl QoeCell { /// A room-session receipt (§4.1). #[derive(Clone, Debug, PartialEq, Eq)] pub struct SessionReceipt { + /// 1; 2 for a receipt that states the bytes its hops sent and prices them (§4.1). + pub version: u8, pub room: [u8; 32], pub signer: [u8; 32], pub start: u64, @@ -924,7 +956,7 @@ impl SessionReceipt { pub fn body(&self) -> Vec { let mut o = Vec::new(); o.extend_from_slice(&SESSION_MAGIC); - o.push(RECORD_VERSION); + o.push(self.version); o.extend_from_slice(&self.room); o.extend_from_slice(&self.signer); o.extend_from_slice(&self.start.to_le_bytes()); @@ -945,7 +977,7 @@ impl SessionReceipt { o.extend_from_slice(&self.compose_digest); o.extend_from_slice(&self.qoe_count.to_le_bytes()); o.extend_from_slice(&self.qoe_digest); - self.units.encode(&mut o); + self.units.encode(&mut o, self.version); o.push(self.unmetered); o.push(u8::try_from(self.totals.len()).expect("at most 255 totals")); for t in &self.totals { @@ -954,8 +986,7 @@ impl SessionReceipt { o.extend_from_slice(&t.joules.to_le_bytes()); } o.extend_from_slice(&self.tariff.currency); - let t = &self.tariff; - for p in [t.publisher].iter().chain(&t.subscriber).chain(&[t.composition, t.recorded, t.event]) { + for p in self.tariff.prices(self.version) { o.extend_from_slice(&p.to_le_bytes()); } o.extend_from_slice(&self.grants.to_le_bytes()); @@ -989,7 +1020,7 @@ impl SessionReceipt { /// Read a receipt (§4.2) of the room `room_id`: the record, `classes_summed` for a /// total of tag 0, its rules, its room, its signature. pub fn parse(b: &[u8], room_id: &[u8; 32]) -> Result { - read_head(b, &SESSION_MAGIC, &[RECORD_VERSION])?; + let version = read_head(b, &SESSION_MAGIC, &[RECORD_VERSION, SESSION_VERSION_BYTES])?; let mut r = Rd { b, p: 5 }; let (room, signer, start, end) = (r.arr()?, r.arr()?, r.u64()?, r.u64()?); let n = r.u8()? as usize; @@ -1005,7 +1036,7 @@ impl SessionReceipt { let takes = (0..k).map(|_| r.arr()).collect::, _>>()?; let (compose_count, compose_digest) = (r.u32()?, r.arr()?); let (qoe_count, qoe_digest) = (r.u32()?, r.arr()?); - let units = Units::read(&mut r)?; + let units = Units::read(&mut r, version)?; let unmetered = r.u8()?; let m = r.u8()? as usize; let mut totals = Vec::with_capacity(m); @@ -1014,6 +1045,7 @@ impl SessionReceipt { } let currency = r.arr()?; let prices: [u32; 13] = r.u32s()?; + let bytes = if version == SESSION_VERSION_BYTES { r.u32()? } else { 0 }; let tariff = Tariff { currency, publisher: prices[0], @@ -1021,6 +1053,7 @@ impl SessionReceipt { composition: prices[10], recorded: prices[11], event: prices[12], + bytes, }; let (grants, consumption_root) = (r.u32()?, r.arr()?); let p = r.u32()? as usize; @@ -1036,7 +1069,7 @@ impl SessionReceipt { if totals.iter().any(|t| t.tag == 0) { return Err(Reason::ClassesSummed); } - let tariff_ok = if currency == [0; 3] { prices.iter().all(|&p| p == 0) } else { currency.iter().all(u8::is_ascii_uppercase) }; + let tariff_ok = if currency == [0; 3] { prices.iter().all(|&p| p == 0) && bytes == 0 } else { currency.iter().all(u8::is_ascii_uppercase) }; let rules = start < end && hops.windows(2).all(|w| w[0].record < w[1].record) && hops.iter().all(|h| (1..=3).contains(&h.role)) @@ -1058,6 +1091,7 @@ impl SessionReceipt { } verify_sig(&signer, SESSION_DOMAIN, &b[..b.len() - 64], &sig)?; Ok(SessionReceipt { + version, room, signer, start, @@ -1084,6 +1118,8 @@ impl SessionReceipt { /// A grant's consumption entry (§4.6). #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct Consumption { + /// Its receipt's version: an entry of version 2 states `bytes_out`. + pub version: u8, pub grant: [u8; 32], pub joules_ceiling: u64, pub funds_ceiling: u64, @@ -1093,6 +1129,8 @@ pub struct Consumption { pub composition_us: u64, pub recorded_us: u64, pub events_sent: u64, + /// Version 2: the bytes its ledger entries state the hops sent its sessions (§4.6). + pub bytes_out: u64, /// The attributed joules of tags 2, 3, 4 and 5. pub attributed: [u64; 4], /// Its share is unmetered at some hop. @@ -1104,8 +1142,9 @@ pub struct Consumption { } impl Consumption { - pub fn encode(&self) -> [u8; CONSUMPTION_LEN] { - let mut o = Vec::with_capacity(CONSUMPTION_LEN); + /// Its bytes: [`CONSUMPTION_LEN`] of them in version 1, [`CONSUMPTION_LEN_2`] in version 2. + pub fn encode(&self) -> Vec { + let mut o = Vec::with_capacity(CONSUMPTION_LEN_2); o.extend_from_slice(&self.grant); o.extend_from_slice(&self.joules_ceiling.to_le_bytes()); o.extend_from_slice(&self.funds_ceiling.to_le_bytes()); @@ -1113,12 +1152,15 @@ impl Consumption { o.extend_from_slice(&self.publisher_us.to_le_bytes()); put_u64s(&mut o, &self.subscriber_us); put_u64s(&mut o, &[self.composition_us, self.recorded_us, self.events_sent]); + if self.version == SESSION_VERSION_BYTES { + o.extend_from_slice(&self.bytes_out.to_le_bytes()); + } put_u64s(&mut o, &self.attributed); o.push(self.unmetered as u8); o.extend_from_slice(&self.funds.to_le_bytes()); o.push(self.joules_verdict); o.push(self.funds_verdict); - o.try_into().expect("198 bytes") + o } /// The entry's leaf (§4.6). @@ -1280,6 +1322,8 @@ pub struct SessionInputs<'a> { /// What a session gives, computed from its records (§4.4–§4.7). #[derive(Clone, Debug, PartialEq, Eq)] pub struct Computed { + /// The version of the receipt it was computed for: version 2 counts bytes out. + pub version: u8, pub hops: Vec, pub media_tracks: u64, pub units: Units, @@ -1365,7 +1409,7 @@ fn lookup<'a>(given: &'a [Vec], digest: &[u8; 32]) -> Option<&'a [u8]> { /// §5.1 steps 4 to 7 and the computations of §4: every refusal those steps make, and what /// the session gives. -fn evaluate(ctx: &Ctx, start: u64, end: u64, named: &Named, tariff: &Tariff) -> Result { +fn evaluate(ctx: &Ctx, start: u64, end: u64, named: &Named, tariff: &Tariff, version: u8) -> Result { let room_id = ctx.vr.id; // The media tracks the room published in the session (§5.3). let published: BTreeSet<[u8; 32]> = ctx.over(start, end).iter().flat_map(|(st, _, _)| ctx.published(st)).collect(); @@ -1446,6 +1490,7 @@ fn evaluate(ctx: &Ctx, start: u64, end: u64, named: &Named, tariff: &Tariff) -> let entry = |g: [u8; 32]| -> Consumption { let (jc, fc, cur) = ctx.ceilings(&g).unwrap_or((NO_CEILING, NO_CEILING, [0; 3])); Consumption { + version, grant: g, joules_ceiling: jc, funds_ceiling: fc, @@ -1455,6 +1500,7 @@ fn evaluate(ctx: &Ctx, start: u64, end: u64, named: &Named, tariff: &Tariff) -> composition_us: 0, recorded_us: 0, events_sent: 0, + bytes_out: 0, attributed: [0; 4], unmetered: false, funds: NO_FUNDS, @@ -1462,6 +1508,8 @@ fn evaluate(ctx: &Ctx, start: u64, end: u64, named: &Named, tariff: &Tariff) -> funds_verdict: 0, } }; + // Version 2 counts the bytes the hops sent the session's sessions, by grant (§4.4). + let bytes = version == SESSION_VERSION_BYTES; for (st, a, b) in ctx.over(start, end) { for p in st.publishers() { units.publisher_us += b - a; @@ -1487,6 +1535,10 @@ fn evaluate(ctx: &Ctx, start: u64, end: u64, named: &Named, tariff: &Tariff) -> for k in 0..CLASSES { c.subscriber_us[k] += e.subscriber_us[k]; } + if bytes { + units.bytes_out += e.bytes_out; + c.bytes_out += e.bytes_out; + } if e.moved() == 0 { continue; } @@ -1568,6 +1620,7 @@ fn evaluate(ctx: &Ctx, start: u64, end: u64, named: &Named, tariff: &Tariff) -> }; } Ok(Computed { + version, hops, media_tracks: m, units, @@ -1635,7 +1688,9 @@ fn committed_capture(m: &take::Manifest, f: &take::FoundTake, start: u64, end: u .sum() } -/// §4.6: a grant's funds, in minor units. +/// §4.6: a grant's funds, in minor units. *N* is in 10^-12 of a minor unit; in version 2 the +/// bytes out add ⌈(1000 × *N* + `bytes_out` × the price of bytes) / 10^15⌉, the price being +/// per 10^9 bytes, so one rounding up covers both. fn funds_of(c: &Consumption, t: &Tariff) -> u64 { let mut n: u128 = c.publisher_us as u128 * t.publisher as u128; for k in 0..CLASSES { @@ -1643,7 +1698,11 @@ fn funds_of(c: &Consumption, t: &Tariff) -> u64 { } n += c.composition_us as u128 * t.composition as u128 + c.recorded_us as u128 * t.recorded as u128; n += c.events_sent as u128 * t.event as u128 * 1_000_000; - let f = n.div_ceil(1_000_000_000_000); + let f = if c.version == SESSION_VERSION_BYTES { + (n * 1_000 + c.bytes_out as u128 * t.bytes as u128).div_ceil(1_000 * 1_000_000_000_000) + } else { + n.div_ceil(1_000_000_000_000) + }; u64::try_from(f).map_or(NO_FUNDS - 1, |f| f.min(NO_FUNDS - 1)) } @@ -1732,7 +1791,7 @@ pub fn verify_session(i: &SessionInputs) -> SessionOutcome { if digests.len() as u64 != r.compose_count as u64 || list_digest(&digests) != r.compose_digest { // The hop entries and the takes come first (steps 4 and 5). let named = Named { hops, takes, compositions: vec![], descriptors: i.descriptors, logs: None }; - if let Err((at, reason)) = evaluate(&ctx, r.start, r.end, &named, &r.tariff) { + if let Err((at, reason)) = evaluate(&ctx, r.start, r.end, &named, &r.tariff, r.version) { return refuse(at, reason); } return refuse(Place::Compose(None), Reason::RecordMissing); @@ -1744,7 +1803,7 @@ pub fn verify_session(i: &SessionInputs) -> SessionOutcome { Some(b) => Some(b), None => { let named = Named { hops, takes, compositions, descriptors: i.descriptors, logs: None }; - if let Err((at, reason)) = evaluate(&ctx, r.start, r.end, &named, &r.tariff) { + if let Err((at, reason)) = evaluate(&ctx, r.start, r.end, &named, &r.tariff, r.version) { return refuse(at, reason); } return refuse(Place::Qoe, Reason::RecordMissing); @@ -1752,7 +1811,7 @@ pub fn verify_session(i: &SessionInputs) -> SessionOutcome { } }; let named = Named { hops, takes, compositions, descriptors: i.descriptors, logs }; - let c = match evaluate(&ctx, r.start, r.end, &named, &r.tariff) { + let c = match evaluate(&ctx, r.start, r.end, &named, &r.tariff, r.version) { Ok(c) => c, Err((at, reason)) => return refuse(at, reason), }; @@ -1797,6 +1856,8 @@ pub struct SessionPlan<'a> { pub takes: &'a [Vec], pub logs: Option<&'a [u8]>, pub tariff: Tariff, + /// The receipt's version: 2 states and prices the bytes out (§4.1). + pub version: u8, } /// Aggregate a session into an unsigned receipt with `signer`, refusing what §5 refuses. @@ -1815,8 +1876,9 @@ pub fn aggregate(p: &SessionPlan, signer: [u8; 32]) -> Result<(SessionReceipt, C descriptors: p.descriptors, logs: p.logs, }; - let c = evaluate(&ctx, p.start, p.end, &named, &p.tariff)?; + let c = evaluate(&ctx, p.start, p.end, &named, &p.tariff, p.version)?; let r = SessionReceipt { + version: p.version, room: ctx.vr.id, signer, start: p.start, @@ -2058,6 +2120,7 @@ mod tests { #[test] fn classes_summed_is_told_from_a_wrong_total() { let mut c = Computed { + version: RECORD_VERSION, hops: vec![], media_tracks: 0, units: Units::default(), @@ -2072,6 +2135,7 @@ mod tests { consumption: vec![], }; let r = |totals: Vec| SessionReceipt { + version: RECORD_VERSION, room: [0; 32], signer: [0; 32], start: 0, @@ -2105,6 +2169,7 @@ mod tests { #[test] fn funds_round_up() { let mut c = Consumption { + version: RECORD_VERSION, grant: [1; 32], joules_ceiling: NO_CEILING, funds_ceiling: 10, @@ -2114,6 +2179,7 @@ mod tests { composition_us: 0, recorded_us: 0, events_sent: 0, + bytes_out: 0, attributed: [0; 4], unmetered: false, funds: NO_FUNDS, @@ -2129,6 +2195,24 @@ mod tests { c.events_sent = u64::MAX; let t = Tariff { currency: *b"EUR", event: u32::MAX, ..Tariff::default() }; assert_eq!(funds_of(&c, &t), NO_FUNDS - 1, "funds past 64 bits saturate below the marker"); + // Version 2: the bytes out at their price per 10^9 bytes, rounded up once with the rest. + c.version = SESSION_VERSION_BYTES; + c.events_sent = 0; + c.publisher_us = 0; + c.bytes_out = 1_500_000_000; + let t = Tariff { currency: *b"EUR", bytes: 2_000_000, ..Tariff::default() }; + assert_eq!(funds_of(&c, &t), 3, "1.5 GB at two minor units per GB"); + c.bytes_out = 1; + assert_eq!(funds_of(&c, &t), 1, "one byte still costs one minor unit, rounded up"); + c.publisher_us = 500_000; + c.bytes_out = 500_000_000; + let t = Tariff { currency: *b"EUR", publisher: 1_000_000, bytes: 1_000_000, ..Tariff::default() }; + assert_eq!(funds_of(&c, &t), 1, "half a minor unit of time and half of bytes round up once, to one"); + c.version = RECORD_VERSION; + assert_eq!(funds_of(&c, &t), 1, "version 1 prices no bytes"); + assert_eq!(c.encode().len(), CONSUMPTION_LEN); + c.version = SESSION_VERSION_BYTES; + assert_eq!(c.encode().len(), CONSUMPTION_LEN_2); } fn obs(v: serde_json::Value) -> Observation { diff --git a/wai/wai-rs/src/live_metering/corpus.rs b/wai/wai-rs/src/live_metering/corpus.rs index 1fcb3c147..9c8359fe2 100644 --- a/wai/wai-rs/src/live_metering/corpus.rs +++ b/wai/wai-rs/src/live_metering/corpus.rs @@ -960,7 +960,7 @@ fn logs(n: usize) -> Vec { // ---- the receipts ---- fn tariff() -> Tariff { - Tariff { currency: *b"EUR", publisher: 2_778, subscriber: [1_389, 2_778, 5_556, 8_333, 0, 0, 0, 0, 278], composition: 5_556, recorded: 1_389, event: 100 } + Tariff { currency: *b"EUR", publisher: 2_778, subscriber: [1_389, 2_778, 5_556, 8_333, 0, 0, 0, 0, 278], composition: 5_556, recorded: 1_389, event: 100, bytes: 0 } } /// Everything a vector gives a verifier but the room. @@ -995,11 +995,35 @@ fn receipt(room: &WrittenRoom, g: &Given, span: (u64, u64), signer: u8) -> Sessi takes: &g.takes, logs: g.logs.as_deref(), tariff: tariff(), + version: RECORD_VERSION, }; let (r, _) = aggregate(&plan, pk(signer)).unwrap_or_else(|e| panic!("the corpus's session aggregates: {e:?}")); r.sign(&key(signer)) } +/// Version 2's tariff: the lesson's prices, and 2,000 cents per 10^9 bytes out (§4.6). +fn tariff_bytes() -> Tariff { + Tariff { bytes: 2_000_000_000, ..tariff() } +} + +/// A receipt of version 2 over `g` under `t`, unsigned: the bytes its hops sent its sessions +/// stated and priced (§4.4, §4.6). +fn receipt_2(room: &WrittenRoom, g: &Given, span: (u64, u64), t: Tariff) -> SessionReceipt { + let plan = SessionPlan { + room: room.input(), + start: span.0, + end: span.1, + hops: &g.hops, + descriptors: &g.descriptors, + compositions: &g.compositions, + takes: &g.takes, + logs: g.logs.as_deref(), + tariff: t, + version: SESSION_VERSION_BYTES, + }; + aggregate(&plan, pk(METER)).unwrap_or_else(|e| panic!("the corpus's session aggregates in version 2: {e:?}")).0 +} + // ---- the vectors ---- /// What a vector is written to reach. @@ -1088,6 +1112,39 @@ fn vectors(rooms: &[(&'static str, WrittenRoom)]) -> Vec { dvr_given.clone(), Intent::Accept, )); + // Version 2: the bytes the hops sent the session's sessions, priced per 10^9 bytes. + let bytes_r = receipt_2(l, &given, span, tariff_bytes()).sign(&key(METER)); + v.push(vector( + "bytes_out_priced", + "the lesson's receipt of version 2: the bytes its hops sent the session's sessions, summed from their ledgers' bytes out, by grant too, and priced per 10^9 bytes in its tariff and in each grant's funds", + "lesson", + &bytes_r, + given.clone(), + Intent::Accept, + )); + let mut more = bytes_r.clone(); + more.units.bytes_out += 1; + v.push(raw("bytes_out_mismatch", "a receipt of version 2 stating one byte out more than its hops' ledgers", "lesson", resign(more, METER), given.clone(), Intent::Refuse("unit_mismatch"))); + let unpriced = { + // The consumption of version 2 computed without the bytes: the root of version 1's + // entries, stated in a receipt of version 2. + let v1 = receipt_2(l, &given, span, tariff_bytes()); + let mut plan_1 = v1.clone(); + plan_1.consumption_root = receipt(l, &given, span, METER).consumption_root; + plan_1 + }; + v.push(raw("bytes_out_left_out_of_the_consumption", "a receipt of version 2 whose grants' consumption entries leave out their bytes out and their price", "lesson", resign(unpriced, METER), given.clone(), Intent::Refuse("ceiling_mismatch"))); + let free_bytes = SessionReceipt { tariff: Tariff { bytes: 1, ..Tariff::default() }, ..receipt_2(l, &given, span, Tariff::default()) }; + v.push(raw("bytes_priced_with_no_tariff", "a receipt of version 2 with no tariff that prices bytes out", "lesson", resign(free_bytes, METER), given.clone(), Intent::Refuse("session_invalid"))); + { + // The lesson's receipt with its fifth byte 3, signed again: only its version is wrong. + let mut b = base.to_bytes(); + b[4] = 3; + let n = b.len() - 64; + let sig = sign(&key(METER), SESSION_DOMAIN, &b[..n]); + b[n..].copy_from_slice(&sig); + v.push(raw("receipt_unknown_version", "a receipt of version 3: the lesson's with its fifth byte 3, signed again", "lesson", b, given.clone(), Intent::Refuse("unknown_version"))); + } // ---- refused: the receipt ---- let mut flipped = base.to_bytes(); @@ -1275,6 +1332,7 @@ fn vectors(rooms: &[(&'static str, WrittenRoom)]) -> Vec { takes: &dvr_given.takes, logs: dvr_given.logs.as_deref(), tariff: tariff(), + version: RECORD_VERSION, }; let m = aggregate(&plan, pk(METER)).expect("the DVR relay's session aggregates").1.media_tracks; let big = dvr_with(&|r| { @@ -1433,12 +1491,17 @@ fn funds_verdict(v: u8) -> &'static str { ["none", "within", "past", "no_tariff"][v as usize] } -fn units_json(u: &Units) -> Value { - json!({ +/// The units (§4.4): a receipt of version 2 states its bytes out too. +fn units_json(u: &Units, version: u8) -> Value { + let mut v = json!({ "publisher_us": u.publisher_us, "subscriber_us": u.subscriber_us, "sessions": u.sessions, "composition_us": u.composition_us, "events_sent": u.events_sent, "events_delivered": u.events_delivered, "recorded_us": u.recorded_us, - }) + }); + if version == SESSION_VERSION_BYTES { + v["bytes_out"] = u.bytes_out.into(); + } + v } fn cell_json(c: &QoeCell) -> Value { @@ -1451,7 +1514,7 @@ fn cell_json(c: &QoeCell) -> Value { fn consumption_json(c: &Consumption) -> Value { let attributed: Map = (2..=5u8).map(|t| (tag_label(t).to_string(), Value::from(c.attributed[(t - 2) as usize]))).collect(); - json!({ + let mut v = json!({ "grant": hex(&c.grant), "joules_ceiling": ceiling_json(c.joules_ceiling), "funds_ceiling": ceiling_json(c.funds_ceiling), "currency": if c.currency == [0; 3] { Value::Null } else { String::from_utf8_lossy(&c.currency).into() }, "publisher_us": c.publisher_us, "subscriber_us": c.subscriber_us, "composition_us": c.composition_us, @@ -1459,7 +1522,11 @@ fn consumption_json(c: &Consumption) -> Value { "funds": if c.funds == NO_FUNDS { Value::Null } else { c.funds.into() }, "joules_verdict": joules_verdict(c.joules_verdict), "funds_verdict": funds_verdict(c.funds_verdict), "leaf": hex(&c.leaf()), - }) + }); + if c.version == SESSION_VERSION_BYTES { + v["bytes_out"] = c.bytes_out.into(); + } + v } /// The names of version 2's DVR figures, in §3.9's order. @@ -1494,7 +1561,7 @@ fn outcome_json(o: &SessionOutcome) -> Map { m.insert("digest".into(), hex(digest).into()); m.insert("media_tracks".into(), c.media_tracks.into()); m.insert("records".into(), c.hops.iter().map(record_json).collect()); - m.insert("units".into(), units_json(&c.units)); + m.insert("units".into(), units_json(&c.units, c.version)); m.insert("unmetered".into(), c.unmetered.into()); m.insert("totals".into(), c.totals.iter().map(|(t, (f, j))| json!({"class": tag_label(*t), "figures": f, "joules": *j as u64})).collect()); m.insert("coverage".into(), if c.whole() { "whole" } else { "partial" }.into()); diff --git a/wai/wai-rs/src/receipt_ledger.rs b/wai/wai-rs/src/receipt_ledger.rs index 3e2bc2a54..d3446cad2 100644 --- a/wai/wai-rs/src/receipt_ledger.rs +++ b/wai/wai-rs/src/receipt_ledger.rs @@ -16,11 +16,14 @@ //! What this module implements, by section of the extension: //! //! - §4: the tariff ([`Tariff`]), its two signatures and its scope, and its job prices: per -//! serving capability in version 2, per serving capability and operation in version 3; +//! serving capability in version 2, per serving capability and operation in versions 3 and +//! 4; version 4 prices a room's bytes out, the work units of a package each run that made it +//! states, and a package's storage by byte-time (§4.7); //! - §5: the sources ([`verify_source`]) and what each contributes ([`Facts`]); //! - §6: the invoice ([`Invoice`]), its lines, citations, energy and chain ([`compute`]), and -//! what a chain bills once ([`billed_once`]): in version 3, a job's work, never its output's -//! receipt; +//! what a chain bills once ([`billed_once`]): in versions 3 and 4, a job's work, never its +//! output's receipt; in version 4, a package's work once per run and its storage for each +//! period it is held, and every hop's energy, the unbilled ones in a scope of their own; //! - §7: verification ([`verify`]); §8: the reports. //! //! The corpus `live-conformance/ledger/` is written by [`corpus::generate`] and checked by @@ -57,6 +60,9 @@ pub const VERSION_2: u8 = 2; /// The version of a tariff that prices jobs per operation and bills a job's work, and of its /// invoices (§4.6, §6.9). pub const VERSION_3: u8 = 3; +/// The version of a tariff that prices delivery by the byte, a package's work and its storage +/// by byte-time, and of its invoices, which state every hop's energy (§4.7, §6.6). +pub const VERSION_4: u8 = 4; pub const TARIFF_DOMAIN: &[u8] = b"wai:ledger-tariff\x01"; pub const ACCEPT_DOMAIN: &[u8] = b"wai:ledger-accept\x01"; pub const INVOICE_DOMAIN: &[u8] = b"wai:ledger-invoice\x01"; @@ -65,8 +71,13 @@ pub const CITES_DOMAIN: &[u8] = b"wai:ledger-cites\x01"; pub const LINE_LEN: usize = 94; /// An energy row's length (§6.1). pub const ROW_LEN: usize = 18; -/// The room prices of a tariff, as live-metering §4.1 orders them. -pub const ROOM_PRICES: usize = 13; +/// The room prices of a tariff, as live-metering §4.1 orders them in a receipt of version 2: +/// thirteen, and in version 4 a fourteenth, per 10^9 bytes out. +pub const ROOM_PRICES: usize = 14; +/// The room prices of a tariff of versions 1 to 3, which price no bytes out. +pub const ROOM_PRICES_1: usize = 13; +/// A day, in microseconds: the time of version 4's storage price (§4.7). +pub const DAY_US: u128 = 86_400_000_000; /// The kinds of a source and of a line (§6.3). pub mod source_kind { @@ -116,21 +127,42 @@ pub mod scope { pub const AD_DECISIONS: u8 = 4; /// Version 2 (§6.6). pub const JOBS: u8 = 5; + /// Version 4 (§6.6): the hops of a job that are not billed, a failed one and one that + /// served past the deadline. + pub const UNBILLED_HOPS: u8 = 6; pub fn name(s: u8) -> &'static str { - ["", "room_hops", "delivery_hops", "packaging", "ad_decisions", "jobs"].get(s as usize).copied().unwrap_or("") + ["", "room_hops", "delivery_hops", "packaging", "ad_decisions", "jobs", "unbilled_hops"].get(s as usize).copied().unwrap_or("") + } + + /// The scopes an invoice of `version` states (§6.1): 4, 5 in versions 2 and 3, 6 in 4. + pub fn count(version: u8) -> u8 { + match version { + super::VERSION_2 | super::VERSION_3 => JOBS, + super::VERSION_4 => UNBILLED_HOPS, + _ => AD_DECISIONS, + } } } -/// The unit names of each source kind, in unit order (§6.3). +/// The unit names of each source kind, in unit order (§6.3), in a tariff of versions 1 to 3. pub fn unit_name(kind: u8, unit: u8) -> Option<&'static str> { - const ROOM: [&str; 13] = [ + unit_name_in(VERSION_3, kind, unit) +} + +/// The unit names of each source kind in an invoice of `version` (§6.3): version 4 adds a +/// room's `bytes_out`, and bills a package source by its `byte_days` alone (§4.7), unit 3. +pub fn unit_name_in(version: u8, kind: u8, unit: u8) -> Option<&'static str> { + const ROOM: [&str; 14] = [ "publisher_us", "subscriber_us_0", "subscriber_us_1", "subscriber_us_2", "subscriber_us_3", "subscriber_us_4", "subscriber_us_5", "subscriber_us_6", "subscriber_us_7", - "subscriber_us_8", "composition_us", "recorded_us", "events_sent", + "subscriber_us_8", "composition_us", "recorded_us", "events_sent", "bytes_out", ]; + let v4 = version == VERSION_4; let names: &[&str] = match kind { - source_kind::ROOM => &ROOM, + source_kind::ROOM if v4 => &ROOM, + source_kind::ROOM => &ROOM[..ROOM_PRICES_1], source_kind::DELIVERY => &["live", "fetch", "fill", "ancillary"], + source_kind::PACKAGE if v4 => return (unit == 3).then_some("byte_days"), source_kind::PACKAGE => &["packages", "entries", "stored_bytes"], source_kind::ADS => &["presented_impressions", "billable_impressions"], _ => &[], @@ -142,6 +174,7 @@ pub fn unit_name(kind: u8, unit: u8) -> Option<&'static str> { pub fn divisor(kind: u8, unit: u8) -> u128 { match (kind, unit) { (source_kind::ROOM, 13) => 1, + (source_kind::ROOM, 14) => 1_000_000_000, (source_kind::ROOM, _) => 1_000_000, (source_kind::DELIVERY, _) => 1_000_000_000, (source_kind::PACKAGE, 3) => 1_000_000_000, @@ -174,11 +207,12 @@ pub enum Reason { PrivateKind, OutputInvalid, JobFigureInvalid, + OutputNotDelivered, } impl Reason { /// §10's order. - pub const ALL: [Reason; 18] = [ + pub const ALL: [Reason; 19] = [ Reason::TariffInvalid, Reason::InvoiceInvalid, Reason::TariffMismatch, @@ -197,6 +231,7 @@ impl Reason { Reason::PrivateKind, Reason::OutputInvalid, Reason::JobFigureInvalid, + Reason::OutputNotDelivered, ]; /// The codes of other extensions this one raises itself, besides those of its sources. @@ -222,6 +257,7 @@ impl Reason { Reason::PrivateKind => "private_kind", Reason::OutputInvalid => "output_invalid", Reason::JobFigureInvalid => "job_figure_invalid", + Reason::OutputNotDelivered => "output_not_delivered", } } } @@ -316,7 +352,7 @@ impl<'a> Rd<'a> { } } -/// The first steps of reading (§4.3, §6.8): the magic and the version, 1, 2 or 3. +/// The first steps of reading (§4.3, §6.8): the magic and the version, 1 to 4. fn read_head(b: &[u8], magic: &[u8; 4]) -> Result { if b.len() < 4 { return Err(TRUNCATED); @@ -326,14 +362,25 @@ fn read_head(b: &[u8], magic: &[u8; 4]) -> Result { } match b.get(4) { None => Err(TRUNCATED), - Some(&v) if v == VERSION || v == VERSION_2 || v == VERSION_3 => Ok(v), + Some(&v) if (VERSION..=VERSION_4).contains(&v) => Ok(v), Some(_) => Err(UNKNOWN_VERSION), } } -/// Whether a tariff or an invoice of `version` prices jobs (§4.5, §4.6): versions 2 and 3. +/// Whether a tariff or an invoice of `version` prices jobs (§4.5, §4.6): versions 2 to 4. pub fn prices_jobs(version: u8) -> bool { - version == VERSION_2 || version == VERSION_3 + (VERSION_2..=VERSION_4).contains(&version) +} + +/// Whether a tariff of `version` prices a job by its operation and bills its work (§4.6, §6.9): +/// versions 3 and 4. +pub fn bills_work(version: u8) -> bool { + version == VERSION_3 || version == VERSION_4 +} + +/// The room prices a tariff of `version` states (§4.1): fourteen in version 4, else thirteen. +pub fn room_prices(version: u8) -> usize { + if version == VERSION_4 { ROOM_PRICES } else { ROOM_PRICES_1 } } /// A job price (§4.5, §4.6): a capability, in version 3 an operation, a unit (1 `jobs`, 2 @@ -349,8 +396,14 @@ pub struct JobPrice { pub price: u64, } -/// The job units, in unit order (§4.5). -pub const JOB_UNITS: [&str; 2] = ["jobs", "subpixels"]; +/// The job units, in unit order (§4.5): `work_units`, the work its output packages state, in +/// version 4 only (§4.7). +pub const JOB_UNITS: [&str; 3] = ["jobs", "subpixels", "work_units"]; + +/// The job units a tariff of `version` prices (§4.5, §4.7): two, and three in version 4. +pub fn job_units(version: u8) -> u8 { + if version == VERSION_4 { 3 } else { 2 } +} fn job_capability(c: &str) -> bool { (1..=128).contains(&c.len()) && c.starts_with("wai.") && c.bytes().all(|b| b.is_ascii_lowercase() || b.is_ascii_digit() || b == b'_' || b == b'.') @@ -375,18 +428,21 @@ fn ascending(v: &[T]) -> bool { #[derive(Clone, Debug, PartialEq, Eq)] pub struct Tariff { /// 1; 2 for a tariff that prices jobs (§4.5); 3 for one that prices them per operation and - /// bills their work (§4.6, §6.9). + /// bills their work (§4.6, §6.9); 4 for one that also prices bytes out, a package's work and + /// its storage by byte-time (§4.7). pub version: u8, pub seller: [u8; 32], pub buyer: [u8; 32], pub start: u64, pub end: u64, pub currency: [u8; 3], - /// Live-metering §4.1's thirteen prices, in its order. + /// Live-metering §4.1's thirteen prices, in its order, and in version 4 a fourteenth, per + /// 10^9 bytes out; versions 1 to 3 state no fourteenth, read as 0. pub room: [u32; ROOM_PRICES], /// Settlement §7.1's four prices, in class order. pub delivery: [u64; 4], - /// Per package receipt, per entry, per 10^9 stored bytes. + /// Per package receipt, per entry, per 10^9 stored bytes; in version 4 only the third, per + /// 10^9 byte-days held, the first two neither written nor read, 0 (§4.7). pub package: [u64; 3], /// Per presented impression, per billable impression. pub ads: [u64; 2], @@ -410,10 +466,11 @@ impl Tariff { o.extend_from_slice(&self.start.to_le_bytes()); o.extend_from_slice(&self.end.to_le_bytes()); o.extend_from_slice(&self.currency); - for p in self.room { + for p in &self.room[..room_prices(self.version)] { o.extend_from_slice(&p.to_le_bytes()); } - for p in self.delivery.iter().chain(&self.package).chain(&self.ads) { + let package = if self.version == VERSION_4 { &self.package[2..] } else { &self.package[..] }; + for p in self.delivery.iter().chain(package).chain(&self.ads) { o.extend_from_slice(&p.to_le_bytes()); } if prices_jobs(self.version) { @@ -421,7 +478,7 @@ impl Tariff { for j in &self.job { o.push(u8::try_from(j.capability.len()).expect("a capability of at most 255 bytes")); o.extend_from_slice(j.capability.as_bytes()); - if self.version == VERSION_3 { + if bills_work(self.version) { o.push(u8::try_from(j.operation.len()).expect("an operation of at most 255 bytes")); o.extend_from_slice(j.operation.as_bytes()); } @@ -469,7 +526,7 @@ impl Tariff { let (start, end) = (r.u64()?, r.u64()?); let currency = r.arr()?; let mut room = [0u32; ROOM_PRICES]; - for p in &mut room { + for p in &mut room[..room_prices(version)] { *p = r.u32()?; } let mut delivery = [0u64; 4]; @@ -477,7 +534,7 @@ impl Tariff { *p = r.u64()?; } let mut package = [0u64; 3]; - for p in &mut package { + for p in &mut package[if version == VERSION_4 { 2 } else { 0 }..] { *p = r.u64()?; } let ads = [r.u64()?, r.u64()?]; @@ -490,7 +547,7 @@ impl Tariff { for _ in 0..n { let len = r.u8()? as usize; let capability = text(r.take(len)?); - let operation = if version == VERSION_3 { + let operation = if bills_work(version) { let len = r.u8()? as usize; text(r.take(len)?) } else { @@ -522,8 +579,8 @@ impl Tariff { && t.job.len() <= 255 && t.job.windows(2).all(|w| (w[0].capability.as_bytes(), w[0].operation.as_bytes(), w[0].unit) < (w[1].capability.as_bytes(), w[1].operation.as_bytes(), w[1].unit)) && t.job.iter().all(|j| { - let operation = if t.version == VERSION_3 { job_operation(&j.operation) } else { j.operation.is_empty() }; - job_capability(&j.capability) && operation && (1..=JOB_UNITS.len() as u8).contains(&j.unit) && j.divisor >= 1 + let operation = if bills_work(t.version) { job_operation(&j.operation) } else { j.operation.is_empty() }; + job_capability(&j.capability) && operation && (1..=job_units(t.version)).contains(&j.unit) && j.divisor >= 1 }); if !rules { return Err((Reason::TariffInvalid.code(), at())); @@ -593,7 +650,7 @@ pub struct Row { /// An invoice (§6.1). #[derive(Clone, Debug, PartialEq, Eq)] pub struct Invoice { - /// Its tariff's version, 1, 2 or 3. + /// Its tariff's version, 1 to 4. pub version: u8, pub seller: [u8; 32], pub buyer: [u8; 32], @@ -605,8 +662,9 @@ pub struct Invoice { pub records: Vec<(u8, [u8; 32])>, pub lines: Vec, pub energy: Vec, - /// Scopes 1 to 4, and in versions 2 and 3 scope 5; a version-1 invoice states no fifth. - pub unmetered: [u32; 5], + /// Scopes 1 to 4, in versions 2 and 3 scope 5, and in version 4 scope 6 (§6.1); an invoice + /// states only its version's. + pub unmetered: [u32; 6], pub amount: u64, pub sig: [u8; 64], } @@ -647,8 +705,7 @@ impl Invoice { o.extend_from_slice(&e.joules.to_le_bytes()); o.extend_from_slice(&e.max_ppm.to_le_bytes()); } - let scopes = if prices_jobs(self.version) { 5 } else { 4 }; - for u in &self.unmetered[..scopes] { + for u in &self.unmetered[..scope::count(self.version) as usize] { o.extend_from_slice(&u.to_le_bytes()); } o.extend_from_slice(&self.amount.to_le_bytes()); @@ -704,7 +761,10 @@ impl Invoice { for _ in 0..n { energy.push(Row { scope: r.u8()?, tag: r.u8()?, figures: r.u32()?, joules: r.u64()?, max_ppm: r.u32()? }); } - let unmetered = [r.u32()?, r.u32()?, r.u32()?, r.u32()?, if v2 { r.u32()? } else { 0 }]; + let mut unmetered = [0u32; 6]; + for u in &mut unmetered[..scope::count(version) as usize] { + *u = r.u32()?; + } let amount = r.u64()?; let sig = r.arr()?; if !r.done() { @@ -725,11 +785,11 @@ impl Invoice { && i.records.iter().all(|(k, _)| (1..=9).contains(k) || (v2 && (record_kind::OER_RECEIPT..=record_kind::ROUTE_RECORD).contains(k))) && ascending(&keys) && i.lines.iter().all(|l| { - let unit_ok = if l.source_kind == source_kind::JOB { v2 && l.unit >= 1 } else { unit_name(l.source_kind, l.unit).is_some() }; + let unit_ok = if l.source_kind == source_kind::JOB { v2 && l.unit >= 1 } else { unit_name_in(version, l.source_kind, l.unit).is_some() }; unit_ok && l.quantity > 0 && l.cited > 0 }) && ascending(&rows) - && i.energy.iter().all(|e| (1..=if v2 { 5 } else { 4 }).contains(&e.scope) && (2..=5).contains(&e.tag) && e.figures > 0); + && i.energy.iter().all(|e| (1..=scope::count(version)).contains(&e.scope) && (2..=5).contains(&e.tag) && e.figures > 0); if !rules { return Err(Reason::InvoiceInvalid.code()); } @@ -801,7 +861,9 @@ impl RoomFacts { 2..=10 => u.subscriber_us[unit as usize - 2], 11 => u.composition_us, 12 => u.recorded_us, - _ => u.events_sent, + 13 => u.events_sent, + // A receipt of version 2's bytes out (live-metering §4.4); version 1 states none. + _ => u.bytes_out, } } } @@ -825,6 +887,11 @@ pub struct PackageFacts { pub total_entries: u64, pub stored_bytes: u64, pub figure: Figure, + /// Under a tariff of version 4, the microseconds of the invoice's period the package was + /// held through: its receipt is in the previous invoice's records, so it was written by the + /// end of that invoice's period, at most this one's start (§4.7). `None` for a package the + /// invoice bills for the first time, and under versions 1 to 3. + pub held_us: Option, } /// One impression of an ad receipt, as the report states it (§8.1). @@ -905,6 +972,13 @@ pub struct JobFacts { pub figure: Option
, /// Each output receipt: its receipt hash and its `work_pixel_ops`. pub outputs: Vec<([u8; 32], u64)>, + /// Under a tariff of version 4, each output package (§4.7): its receipt hash and the work + /// units it states. + pub packages: Vec<([u8; 32], u64)>, + /// Under a tariff of version 4, the figure of each attempt that is not billed, a failed hop + /// or one that served past the deadline, in attempt order (§6.6); empty under versions 2 + /// and 3, which state no such figure. + pub unbilled: Vec
, } /// What a verified source gives (§5.2). @@ -946,6 +1020,7 @@ impl Facts { Facts::Job(j) => { s.extend(j.hops.iter().map(|h| (record_kind::OER_RECEIPT, *h))); s.extend(j.outputs.iter().map(|(h, _)| (record_kind::VIDEO_RECEIPT, *h))); + s.extend(j.packages.iter().map(|(h, _)| (record_kind::PACKAGE, *h))); } } s @@ -1142,6 +1217,7 @@ fn package_source(o: &Map) -> Result { total_entries: r.total_entries, stored_bytes: r.stored_bytes, figure: Figure { joules: r.joules_micro, class: r.energy_provenance.clone() }, + held_us: None, })) } @@ -1339,7 +1415,7 @@ fn job_figure(r: &Value) -> Option
{ Some(Figure { joules, class: Some(class) }) } -fn job_source(o: &Map) -> Result { +fn job_source(o: &Map, version: u8) -> Result { use crate::route_record as rr; if !has_exactly(o, &["kind", "request", "pricebook", "policy", "record", "receipts", "keys", "outputs"]) { return Err(bad_source()); @@ -1356,25 +1432,73 @@ fn job_source(o: &Map) -> Result { let texts: Vec = doc["receipts"].as_array().expect("a list").iter().map(|t| crate::oer::load(t.as_str().expect("a text").as_bytes()).expect("read")).collect(); let attempts = record["attempts"].as_array().expect("a list"); let hops: Vec<[u8; 32]> = attempts.iter().map(|a| oer_identity(a["receipt"].as_str().expect("an id")).expect("an id")).collect(); + let receipt_of = |a: &Value| texts.iter().position(|r| r.get("receipt_id") == Some(&a["receipt"])).expect("a checked receipt"); let (mut billed, mut figure) = (None, None); if let Some(a) = attempts.iter().find(|a| a["billed"] == true) { let endpoint = a["endpoint"].as_str().expect("a token"); let cap = record["candidates"].as_array().expect("a list").iter().find(|c| c["endpoint"] == endpoint).and_then(|c| c["capability"].as_str()).expect("a survivor"); let id = a["receipt"].as_str().expect("an id"); - let j = texts.iter().position(|r| r.get("receipt_id").and_then(Value::as_str) == Some(id)).expect("a checked receipt"); + let j = receipt_of(a); figure = Some(job_figure(&texts[j]).ok_or((Reason::JobFigureInvalid.code(), json!(["receipts", j])))?); billed = Some((cap.to_string(), oer_identity(id).expect("an id"))); } - let mut outs = Vec::with_capacity(outputs.len()); + // Version 4 states every hop's energy: each attempt that is not billed, in a scope of its + // own (§6.6), so its figure must be one a row can state, as the billed hop's must. + let mut unbilled = Vec::new(); + if version == VERSION_4 { + for a in attempts.iter().filter(|a| a["billed"] != true) { + let j = receipt_of(a); + unbilled.push(job_figure(&texts[j]).ok_or((Reason::JobFigureInvalid.code(), json!(["receipts", j])))?); + } + } + // What the hop that served states it delivered (route-record §5.2, version 2), by content + // hash; a record of version 1 states nothing, and under a tariff of version 4 holds its + // outputs to nothing (§5.1). Under version 3 a record of version 1's outputs are read as + // before. + let delivered: Option> = if record["version"] == 2 { + Some( + attempts + .iter() + .filter(|a| a["outcome"] == "served") + .flat_map(|a| a["outputs"].as_array().expect("a list").iter().map(|h| unhex(h.as_str().expect("a hash")).expect("hex").try_into().expect("32 bytes"))) + .collect(), + ) + } else if version == VERSION_4 { + Some(Vec::new()) + } else { + None + }; + let mut seen: BTreeSet<[u8; 32]> = BTreeSet::new(); + let (mut outs, mut packages) = (Vec::with_capacity(outputs.len()), Vec::new()); for (i, x) in outputs.iter().enumerate() { let bad = || (Reason::OutputInvalid.code(), json!(["outputs", i])); - let x = x.as_object().filter(|x| has_exactly(x, &["receipt", "codestream"])).ok_or_else(bad_source)?; - let (Some(text), Some(code)) = (x["receipt"].as_str(), bytes_of(&x["codestream"])) else { return Err(bad_source()) }; - let r = crate::video_receipt::VideoReceipt::from_json(text).map_err(|_| bad())?; - if !r.verify_reconstruction_wiv1(&code) { - return Err(bad()); + let x = x.as_object().ok_or_else(bad_source)?; + // Each output's object: an int_motion codestream, or in version 4 a package's receipt, + // the package a run of `package.build` made (§4.7), verified against its indexes. + let object = if version == VERSION_4 && has_exactly(x, &["package", "indexes"]) { + let (Some(text), Some(indexes)) = (x["package"].as_str(), hexes(&x["indexes"])) else { return Err(bad_source()) }; + let r = PackageReceiptV2::from_json(text).map_err(|_| bad())?; + let ix: Vec<&[u8]> = indexes.iter().map(Vec::as_slice).collect(); + r.verify_detailed(&ix).map_err(|_| bad())?; + packages.push((r.receipt_hash(), r.work_units)); + text.as_bytes().to_vec() + } else { + let x = Some(x).filter(|x| has_exactly(x, &["receipt", "codestream"])).ok_or_else(bad_source)?; + let (Some(text), Some(code)) = (x["receipt"].as_str(), bytes_of(&x["codestream"])) else { return Err(bad_source()) }; + let r = crate::video_receipt::VideoReceipt::from_json(text).map_err(|_| bad())?; + if !r.verify_reconstruction_wiv1(&code) { + return Err(bad()); + } + outs.push((r.receipt_hash(), r.work_pixel_ops)); + code + }; + // The output is its object: one the served hop delivered, once. + if let Some(d) = &delivered { + let h = rr::content_hash(&object); + if !d.contains(&h) || !seen.insert(h) { + return Err((Reason::OutputNotDelivered.code(), json!(["outputs", i]))); + } } - outs.push((r.receipt_hash(), r.work_pixel_ops)); } Ok(Facts::Job(JobFacts { record: rr::digest(&record), @@ -1386,17 +1510,20 @@ fn job_source(o: &Map) -> Result { billed, figure, outputs: outs, + packages, + unbilled, })) } /// §5.1: verify one source by its extension, a stitched source with `signers` (§4.4); a job -/// source is read here whatever the tariff, and only a tariff of version 2 or 3 bills it. A -/// refusal's place is the extension's own, relative to the source. +/// source is read here as a tariff of version 3 reads it, and only a tariff of version 2 to 4 +/// bills it. A refusal's place is the extension's own, relative to the source. pub fn verify_source(v: &Value, signers: &[[u8; 32]]) -> Result { verify_source_of(v, signers, VERSION_3) } -fn verify_source_of(v: &Value, signers: &[[u8; 32]], version: u8) -> Result { +/// §5.1 under a tariff of `version`: a job source is read by that version's rules (§5.1, §6.6). +pub fn verify_source_of(v: &Value, signers: &[[u8; 32]], version: u8) -> Result { let o = v.as_object().ok_or_else(bad_source)?; match o.get("kind").and_then(Value::as_str) { Some("room") => room_source(o), @@ -1404,7 +1531,7 @@ fn verify_source_of(v: &Value, signers: &[[u8; 32]], version: u8) -> Result package_source(o), Some("ads") => ads_source(o), Some("stitched") => stitched_source(o, signers), - Some("job") if prices_jobs(version) => job_source(o), + Some("job") if prices_jobs(version) => job_source(o, version), _ => Err(bad_source()), } } @@ -1421,12 +1548,11 @@ pub fn check_source(t: &Tariff, start: u64, end: u64, f: &Facts) -> Result<(), R if !t.in_scope(source_kind::ROOM, &r.room) { return Err(Reason::OutsideScope); } + // A receipt of version 1 states no price of bytes, nor a tariff of versions 1 to 3: + // each reads as 0, so a receipt's funds computed at another price of bytes conflict. let rt = &r.tariff; - if rt.currency != [0; 3] { - let prices: Vec = std::iter::once(rt.publisher).chain(rt.subscriber).chain([rt.composition, rt.recorded, rt.event]).collect(); - if rt.currency != t.currency || prices != t.room { - return Err(Reason::TariffConflict); - } + if rt.currency != [0; 3] && (rt.currency != t.currency || rt.prices(metering::SESSION_VERSION_BYTES) != t.room) { + return Err(Reason::TariffConflict); } if !within(r.t0 as u128 + r.start as u128, r.t0 as u128 + r.end as u128) { return Err(Reason::OutsidePeriod); @@ -1495,11 +1621,27 @@ fn overlap(version: u8, f: &Facts, g: &Facts) -> bool { } /// Whether a chain under a tariff of `version` bills a record of `kind` once (§6.9): every -/// record but, in version 3, a job's output receipt. A job's work, its route record and its -/// hops' OER/2 receipts, is new on every run and billed once; its output receipt is the -/// evidence of what it delivered, which a deterministic re-run delivers again. +/// record but, in versions 3 and 4, a job's output receipt, and in version 4 a package receipt. +/// A job's work, its route record and its hops' OER/2 receipts, is new on every run and billed +/// once; its output receipt is the evidence of what it delivered, which a deterministic re-run +/// delivers again. In version 4 a package is such an output: the run that made it is billed +/// once per run, its receipt cited by each, and its storage billed by every invoice whose +/// period it is held through (§4.7). pub fn billed_once(version: u8, kind: u8) -> bool { - !(version == VERSION_3 && kind == record_kind::VIDEO_RECEIPT) + !((bills_work(version) && kind == record_kind::VIDEO_RECEIPT) || (version == VERSION_4 && kind == record_kind::PACKAGE)) +} + +/// Under a tariff of version 4, mark each package the previous invoice holds as held through +/// the period [`start`, `end`) (§4.7); under versions 1 to 3, nothing. +pub fn hold(t: &Tariff, facts: &mut [Facts], previous: Option<&Invoice>, start: u64, end: u64) { + if t.version != VERSION_4 { + return; + } + for f in facts { + if let Facts::Package(p) = f { + p.held_us = previous.filter(|i| i.records.contains(&(record_kind::PACKAGE, p.receipt_hash))).map(|_| end - start); + } + } } /// §7.2 step 6 under a tariff of `version`: the index of the source refused and the reason, or @@ -1543,7 +1685,7 @@ pub struct Computed { /// Each line, and the records it cites. pub lines: Vec<(Line, Cited)>, pub energy: Vec, - pub unmetered: [u32; 5], + pub unmetered: [u32; 6], pub amount: u64, /// Per scope and tag, the sum of its figures, for the summed-classes check. pub sums: BTreeMap<(u8, u8), u128>, @@ -1557,8 +1699,10 @@ fn is_free(class: u8, grant: &[u8; 32]) -> bool { settlement::class::is_retrieval(class) && *grant == [0; 32] } -/// The figures of §6.2 to §6.6 over verified sources. +/// The figures of §6.2 to §6.6 over verified sources, a package's held through the period +/// marked by [`hold`]. pub fn compute(t: &Tariff, facts: &[Facts]) -> Result { + let v4 = t.version == VERSION_4; let mut records: BTreeSet<(u8, [u8; 32])> = BTreeSet::new(); for f in facts { records.extend(f.records()); @@ -1576,7 +1720,7 @@ pub fn compute(t: &Tariff, facts: &[Facts]) -> Result { for f in facts { match f { Facts::Room(r) => { - for unit in 1..=13u8 { + for unit in 1..=room_prices(t.version) as u8 { add(source_kind::ROOM, r.room, unit, r.unit(unit) as u128, &[(record_kind::SESSION, r.digest)]); } } @@ -1596,6 +1740,14 @@ pub fn compute(t: &Tariff, facts: &[Facts]) -> Result { add(source_kind::DELIVERY, s.party, c, bytes, &cites); } } + // A package source is the product held: its storage for each period it is held + // through, in byte-microseconds here, byte-days on its line; its work is the run's + // that made it, a job's (§4.7). + Facts::Package(p) if v4 => { + if let Some(us) = p.held_us { + add(source_kind::PACKAGE, p.signer, 3, p.stored_bytes as u128 * us as u128, &[(record_kind::PACKAGE, p.receipt_hash)]); + } + } Facts::Package(p) => { let cite = [(record_kind::PACKAGE, p.receipt_hash)]; add(source_kind::PACKAGE, p.signer, 1, 1, &cite); @@ -1624,15 +1776,21 @@ pub fn compute(t: &Tariff, facts: &[Facts]) -> Result { // cited once and counted for each (§6.5). Facts::Job(j) => { let Some((cap, hop)) = &j.billed else { continue }; - let priced = |p: &JobPrice| p.capability == *cap && (t.version != VERSION_3 || p.operation == j.operation); + let priced = |p: &JobPrice| p.capability == *cap && (!bills_work(t.version) || p.operation == j.operation); for (k, p) in t.job.iter().enumerate().filter(|(_, p)| priced(p)) { let unit = u8::try_from(k + 1).expect("at most 255 job prices"); let mut cites = vec![(record_kind::ROUTE_RECORD, j.record), (record_kind::OER_RECEIPT, *hop)]; - let n = if p.unit == 1 { - 1 - } else { - cites.extend(j.outputs.iter().filter(|(_, w)| *w > 0).map(|(h, _)| (record_kind::VIDEO_RECEIPT, *h))); - j.outputs.iter().map(|(_, w)| *w as u128).sum() + let n = match p.unit { + 1 => 1, + 2 => { + cites.extend(j.outputs.iter().filter(|(_, w)| *w > 0).map(|(h, _)| (record_kind::VIDEO_RECEIPT, *h))); + j.outputs.iter().map(|(_, w)| *w as u128).sum() + } + // Version 4: the work units its output packages state (§4.7). + _ => { + cites.extend(j.packages.iter().filter(|(_, w)| *w > 0).map(|(h, _)| (record_kind::PACKAGE, *h))); + j.packages.iter().map(|(_, w)| *w as u128).sum() + } }; add(source_kind::JOB, j.router, unit, n, &cites); } @@ -1642,6 +1800,11 @@ pub fn compute(t: &Tariff, facts: &[Facts]) -> Result { let mut lines = Vec::with_capacity(q.len()); let mut amount: u128 = 0; for ((kind, source, unit), (n, cited)) in q { + // Version 4's storage: byte-microseconds to byte-days, rounded down once per line. + let n = if v4 && kind == source_kind::PACKAGE && unit == 3 { n / DAY_US } else { n }; + if n == 0 { + continue; + } let quantity = u64::try_from(n).map_err(|_| Overflow)?; let price = t.price(kind, unit); let a = n * price as u128 / t.divisor(kind, unit); @@ -1673,9 +1836,13 @@ pub fn compute(t: &Tariff, facts: &[Facts]) -> Result { } for f in facts { match f { - Facts::Package(p) => figures.push((scope::PACKAGING, p.figure.clone())), + // In version 4 a package's figure is its run's, which the run's hop states (§6.6). + Facts::Package(p) if !v4 => figures.push((scope::PACKAGING, p.figure.clone())), Facts::Ads(a) => figures.extend(a.receipts.iter().map(|r| (scope::AD_DECISIONS, r.figure.clone()))), - Facts::Job(j) => figures.extend(j.figure.iter().map(|f| (scope::JOBS, f.clone()))), + Facts::Job(j) => { + figures.extend(j.figure.iter().map(|f| (scope::JOBS, f.clone()))); + figures.extend(j.unbilled.iter().map(|f| (scope::UNBILLED_HOPS, f.clone()))); + } _ => {} } } @@ -1683,11 +1850,11 @@ pub fn compute(t: &Tariff, facts: &[Facts]) -> Result { Ok(Computed { records: records.into_iter().collect(), lines, energy, unmetered, amount: u64::try_from(amount).map_err(|_| Overflow)?, sums }) } -type RowsOf = (Vec, [u32; 5], BTreeMap<(u8, u8), u128>); +type RowsOf = (Vec, [u32; 6], BTreeMap<(u8, u8), u128>); /// Rows, unmetered counts and sums per (scope, tag) of figures. fn rows_of(figures: &[(u8, Figure)]) -> Result { - let mut unmetered = [0u32; 5]; + let mut unmetered = [0u32; 6]; let mut acc: BTreeMap<(u8, u8), (u32, u128, u32)> = BTreeMap::new(); for (s, f) in figures { match f.tag() { @@ -1976,6 +2143,7 @@ pub fn verify_sources(t: &Tariff, start: u64, end: u64, sources: &[Value], previ facts.push(f); } check_across(t.version, &facts, previous).map_err(|(k, r)| (r.code(), json!(["source", k])))?; + hold(t, &mut facts, previous, start, end); Ok(facts) } @@ -2041,7 +2209,7 @@ pub fn accepted_json(a: &Accepted) -> Value { .map(|(l, cited)| { let mut v = json!({ "source_kind": source_kind::name(l.source_kind), "source": hex(&l.source), - "unit": unit_name(l.source_kind, l.unit).unwrap_or(""), "quantity": l.quantity, "price": l.price, "amount": l.amount, + "unit": unit_name_in(i.version, l.source_kind, l.unit).unwrap_or(""), "quantity": l.quantity, "price": l.price, "amount": l.amount, "cites": cited.iter().map(|(k, id)| json!([k, hex(id)])).collect::>(), }); // A job line names its unit and capability by its job price, and in version 3 its @@ -2050,7 +2218,7 @@ pub fn accepted_json(a: &Accepted) -> Value { let p = &a.tariff.job[l.unit as usize - 1]; v["unit"] = json!(JOB_UNITS[p.unit as usize - 1]); v["capability"] = json!(p.capability); - if a.tariff.version == VERSION_3 { + if bills_work(a.tariff.version) { v["operation"] = json!(p.operation); } } @@ -2059,7 +2227,7 @@ pub fn accepted_json(a: &Accepted) -> Value { .collect(); let energy: Vec = i.energy.iter().map(|r| json!({"scope": scope::name(r.scope), "class": class_label(r.tag), "figures": r.figures, "joules": r.joules, "max_ppm": r.max_ppm})).collect(); let (mut unmetered, mut coverage) = (Map::new(), Map::new()); - for s in 1..=if prices_jobs(i.version) { 5u8 } else { 4 } { + for s in 1..=scope::count(i.version) { let n = i.unmetered[s as usize - 1]; let has_row = i.energy.iter().any(|r| r.scope == s); unmetered.insert(scope::name(s).into(), n.into()); @@ -2106,7 +2274,12 @@ mod tests { start: 10, end: 20, currency: *b"EUR", - room: [3; ROOM_PRICES], + // Thirteen prices: a tariff of versions 1 to 3 prices no bytes out. + room: { + let mut r = [3; ROOM_PRICES]; + r[ROOM_PRICES_1] = 0; + r + }, delivery: [4; 4], package: [5; 3], ads: [6; 2], @@ -2187,10 +2360,70 @@ mod tests { let at = nb.windows(2).position(|w| w == [0xc3, 0xa9]).expect("the two bytes of é"); nb[at] = 0xff; assert_eq!(Tariff::parse(&nb).unwrap_err().0, "tariff_invalid"); - // A tariff of version 4 is not defined. - let mut v4 = b.clone(); - v4[4] = 4; - assert_eq!(Tariff::parse(&v4).unwrap_err().0, "unknown_version"); + // A tariff of version 5 is not defined. + let mut v5 = b.clone(); + v5[4] = 5; + assert_eq!(Tariff::parse(&v5).unwrap_err().0, "unknown_version"); + } + + fn tariff_v4() -> Tariff { + let mut t = tariff_v3(); + t.version = VERSION_4; + t.room[13] = 11; + t.package = [0, 0, 5]; + t.job.push(JobPrice { capability: "wai.video.package".into(), operation: "package.build".into(), unit: 3, divisor: 1, price: 4 }); + t.sign(&key(1), &key(2)) + } + + /// A tariff of version 4 is version 3's with a fourteenth room price, per 10^9 bytes out + /// (§4.1, §4.7); it reads back, every altered byte is refused, and a tariff of versions 1 + /// to 3 writes thirteen, whatever its fourteenth holds. + #[test] + fn a_tariff_of_version_4_prices_bytes_out() { + let t = tariff_v4(); + let b = t.to_bytes(); + assert_eq!(b[4], 4); + assert_eq!(Tariff::parse(&b).unwrap(), t); + for at in 0..b.len() { + let mut m = b.clone(); + m[at] ^= 0x01; + assert!(Tariff::parse(&m).is_err(), "byte {at} altered and accepted"); + } + let mut v3 = tariff_v3(); + v3.room[13] = 11; + assert_eq!(v3.body(), tariff_v3().body(), "version 3 states no price of bytes"); + // A job price of unit 3, `work_units`, only in version 4. + let mut work = tariff_v3(); + work.job.push(JobPrice { capability: "wai.video.package".into(), operation: "package.build".into(), unit: 3, divisor: 1, price: 4 }); + assert_eq!(Tariff::parse(&work.sign(&key(1), &key(2)).to_bytes()).unwrap_err().0, "tariff_invalid"); + let mut four = tariff_v4(); + four.job[3].unit = 4; + assert_eq!(Tariff::parse(&four.sign(&key(1), &key(2)).to_bytes()).unwrap_err().0, "tariff_invalid"); + let mut packed = tariff_v4(); + packed.package = [7, 8, 5]; + assert_eq!(packed.body(), tariff_v4().body(), "version 4 states one package price, of storage"); + assert_eq!(Tariff::parse(&v3.sign(&key(1), &key(2)).to_bytes()).unwrap().room[13], 0); + assert_eq!(t.price(source_kind::ROOM, 14), 11); + assert_eq!(t.divisor(source_kind::ROOM, 14), 1_000_000_000); + assert_eq!(unit_name_in(VERSION_4, source_kind::ROOM, 14), Some("bytes_out")); + assert_eq!(unit_name_in(VERSION_3, source_kind::ROOM, 14), None); + assert_eq!(unit_name_in(VERSION_4, source_kind::PACKAGE, 1), None, "a package source bills no work in version 4"); + assert_eq!(unit_name_in(VERSION_4, source_kind::PACKAGE, 2), None); + assert_eq!(unit_name_in(VERSION_4, source_kind::PACKAGE, 3), Some("byte_days")); + let price_4 = 1 + "wai.video.package".len() + 1 + "package.build".len() + 1 + 8 + 8; + assert_eq!(b.len(), tariff_v3().to_bytes().len() + 4 - 16 + price_4, "a fourteenth room price, one package price for three, and a price of work units"); + assert_eq!(unit_name_in(VERSION_3, source_kind::PACKAGE, 3), Some("stored_bytes")); + } + + /// What a chain of version 4 bills once (§6.9): a job's work and every record but an output + /// receipt and a package receipt, whose storage each period it is held bills (§4.7). + #[test] + fn a_chain_of_version_4_bills_a_packages_storage_each_period() { + assert!(!billed_once(VERSION_4, record_kind::PACKAGE) && billed_once(VERSION_3, record_kind::PACKAGE)); + assert!(!billed_once(VERSION_4, record_kind::VIDEO_RECEIPT)); + assert!(billed_once(VERSION_4, record_kind::OER_RECEIPT) && billed_once(VERSION_4, record_kind::ROUTE_RECORD) && billed_once(VERSION_4, record_kind::SESSION)); + assert!(bills_work(VERSION_4) && prices_jobs(VERSION_4) && !prices_jobs(5)); + assert_eq!((scope::count(VERSION), scope::count(VERSION_2), scope::count(VERSION_3), scope::count(VERSION_4)), (4, 5, 5, 6)); } /// What a chain bills once (§6.9): in version 3, every record but an output receipt; in @@ -2202,7 +2435,7 @@ mod tests { } assert!(billed_once(VERSION_2, record_kind::VIDEO_RECEIPT), "version 2 bills an output once"); assert!(!billed_once(VERSION_3, record_kind::VIDEO_RECEIPT), "version 3 bills the work, and cites the output"); - assert!(prices_jobs(VERSION_2) && prices_jobs(VERSION_3) && !prices_jobs(VERSION) && !prices_jobs(4)); + assert!(prices_jobs(VERSION_2) && prices_jobs(VERSION_3) && !prices_jobs(VERSION) && !prices_jobs(5)); } /// A tariff of version 2 reads back with its job prices, and every altered byte is refused; @@ -2239,7 +2472,7 @@ mod tests { #[test] fn an_invoice_of_version_2_states_the_jobs_scope() { let t = tariff_v2(); - let c = Computed { records: vec![], lines: vec![], energy: vec![], unmetered: [0, 0, 0, 0, 3], amount: 0, sums: BTreeMap::new() }; + let c = Computed { records: vec![], lines: vec![], energy: vec![], unmetered: [0, 0, 0, 0, 3, 0], amount: 0, sums: BTreeMap::new() }; let i = invoice_of(&t, [0; 32], 10, 20, &c).sign(&key(1)); assert_eq!(Invoice::parse(&i.to_bytes()).unwrap(), i); let mut v1 = i.clone(); @@ -2278,6 +2511,22 @@ mod tests { assert_eq!(with(k, &i3), Ok(()), "kind {k} in version 3"); } assert_eq!(with(record_kind::RUN, &i3), Err("invoice_invalid")); + // Version 4 states a sixth count, the unbilled hops' (§6.1), and a row of scope 6. + let mut c4 = c.clone(); + c4.unmetered[5] = 2; + c4.energy = vec![Row { scope: scope::UNBILLED_HOPS, tag: 4, figures: 1, joules: 9, max_ppm: 20_000 }]; + let i4 = invoice_of(&tariff_v4(), [0; 32], 10, 20, &c4).sign(&key(1)); + assert_eq!(i4.to_bytes().len(), i3.to_bytes().len() + 4 + ROW_LEN); + assert_eq!(Invoice::parse(&i4.to_bytes()).unwrap(), i4); + let mut row_6 = i3.clone(); + row_6.energy = c4.energy.clone(); + assert_eq!(Invoice::parse(&row_6.sign(&key(1)).to_bytes()).unwrap_err(), "invoice_invalid", "no scope 6 in version 3"); + let mut bytes = i4.clone(); + bytes.lines.push(Line { source_kind: source_kind::ROOM, source: [9; 32], unit: 14, quantity: 1, price: 1, amount: 0, cited: 1, cites: [0; 32] }); + assert!(Invoice::parse(&bytes.clone().sign(&key(1)).to_bytes()).is_ok(), "bytes out, a room unit of version 4"); + let mut bytes3 = i3.clone(); + bytes3.lines = bytes.lines.clone(); + assert_eq!(Invoice::parse(&bytes3.sign(&key(1)).to_bytes()).unwrap_err(), "invoice_invalid", "and not of version 3"); } #[test] @@ -2314,7 +2563,7 @@ mod tests { records: vec![(record_kind::SESSION, [7; 32]), (record_kind::HOP, [6; 32])], lines: vec![Line { source_kind: 1, source: [9; 32], unit: 1, quantity: 1_500_000, price: 3, amount: 4, cited: 1, cites: cites_digest(&cited) }], energy: vec![Row { scope: 1, tag: 4, figures: 1, joules: 5, max_ppm: 20_000 }], - unmetered: [0, 0, 1, 0, 0], + unmetered: [0, 0, 1, 0, 0, 0], amount: 4, sig: [0; 64], } @@ -2338,8 +2587,8 @@ mod tests { assert_eq!(Invoice::parse(&unit.sign(&key(1)).to_bytes()).unwrap_err(), "invoice_invalid"); assert_eq!(Invoice::parse(&[b.clone(), vec![0]].concat()).unwrap_err(), "malformed"); let mut v = b.clone(); - v[4] = 4; - assert_eq!(Invoice::parse(&v).unwrap_err(), "unknown_version", "version 4 is not defined (2 and 3 are, §6.1)"); + v[4] = 5; + assert_eq!(Invoice::parse(&v).unwrap_err(), "unknown_version", "version 5 is not defined (2 to 4 are, §6.1)"); let mut s = b; let n = s.len(); s[n - 1] ^= 1; @@ -2406,6 +2655,6 @@ mod tests { Row { scope: 2, tag: 2, figures: 1, joules: 7, max_ppm: 0 }, ] ); - assert_eq!(unmetered, [0, 0, 1, 0, 0]); + assert_eq!(unmetered, [0, 0, 1, 0, 0, 0]); } } diff --git a/wai/wai-rs/src/receipt_ledger/corpus.rs b/wai/wai-rs/src/receipt_ledger/corpus.rs index 05b1f116d..7ef72ecc9 100644 --- a/wai/wai-rs/src/receipt_ledger/corpus.rs +++ b/wai/wai-rs/src/receipt_ledger/corpus.rs @@ -9,8 +9,9 @@ //! fixed seeds, as are the tariffs and the invoices. Media jobs come from //! `live-conformance/routes/`, and those the version-3 vectors add (a decode, a re-run, a re-run //! replaying a hop receipt, a job claiming another's) are routed here under that corpus's own -//! seeds. [`generate`] reads those files from a `wai/` directory; [`verify`] checks every vector -//! against the outcome it states. +//! seeds, as are jobs routed under the route record's version 2 (per-operation entries, measured +//! failures, the served hop's outputs), billed under versions 3 and 4. [`generate`] reads those +//! files from a `wai/` directory; [`verify`] checks every vector against the outcome it states. use std::collections::BTreeMap; use std::path::Path; @@ -20,6 +21,7 @@ use serde_json::{json, Map, Value}; use super::*; use crate::energy_class::{CounterFiltering, Uncertainty}; +use crate::route_record::content_hash as rr_hash; use crate::route_record::corpus as rr; use crate::jwp_hash::content_hash; use crate::live_metering::HopRecord; @@ -314,9 +316,27 @@ fn output_of(receipt_payload: &[u8], codestream: &[u8], job: &str) -> Value { json!({"receipt": r.to_json(), "codestream": hex(codestream)}) } +/// The receipt hash of a package source (§5.2). +fn first_receipt(package: &Value) -> [u8; 32] { + let Ok(Facts::Package(p)) = verify_source(package, &[]) else { panic!("a corpus package verifies") }; + p.receipt_hash +} + /// The delivery prices: millionths of a euro cent per 10^9 bytes, by object class. const DELIVERY_PRICES: [u64; 4] = [20_000_000, 50_000_000, 80_000_000, 5_000_000]; +/// The invoice of `sources` under `t`'s own rules, after `previous` (a package it holds is held +/// through the period, §4.7), computed and signed without the checks of §7.2 steps 3 to 6. +#[allow(clippy::too_many_arguments)] +fn sealed_after(t: &Tariff, previous: Option<&Invoice>, held: (u64, u64), start: u64, end: u64, sources: &[&Value], f: impl FnOnce(&mut Invoice)) -> Invoice { + let mut facts: Vec = sources.iter().map(|s| verify_source_of(s, &signers(t), t.version).expect("a corpus source verifies")).collect(); + hold(t, &mut facts, previous, held.0, held.1); + let c = compute(t, &facts).expect("figures that fit"); + let mut i = invoice_of(t, previous.map_or([0; 32], Invoice::digest), start, end, &c); + f(&mut i); + i.sign(&key("seller")) +} + /// The invoice of `sources`, computed and signed without the checks of §7.2 steps 3 to 6, so a /// control can carry a defect those steps catch. fn sealed(t: &Tariff, prev: [u8; 32], start: u64, end: u64, sources: &[&Value], f: impl FnOnce(&mut Invoice)) -> Invoice { @@ -447,6 +467,86 @@ pub fn generate(wai: &Path) -> Result { vec![], ), ); + // Jobs routed under the route record's version 2 (route-record §3.4): the price book prices + // each operation of an endpoint in its own entry and states its measured failures, and the + // hop that served states its outputs by content hash, here the clip its receipt decodes. An + // encode; a failover whose failed hop was metered, it spent energy and delivered nothing; a + // decode; a hop that served past the deadline; three hops that all failed, one unmetered; a + // failover whose failed hop's figure states no class; and two jobs whose outputs are not what + // their hop delivered, another clip, and the clip twice. + let delivered = [rr_hash(&clip)]; + let failed = |endpoint: &'static str, start: u64, end: u64, receipt: Value| rr::Hop { endpoint, error: Some("server_error"), start, end, receipt }; + let routed_2 = |job: &str, operation: &str, hops: &[rr::Hop], outputs: &[[u8; 32]], given: Vec| routed(rr::job_document_2(job, operation, accepted, hops, outputs), given); + const ENC: &str = "media.encode"; + pool.insert("job_v2_encode", routed_2("job-3001", ENC, &[served("im.alpha", rr::hop_receipt(ENC, "job-3001", "im.alpha", Some("30.25")))], &delivered, out("job-3001"))); + pool.insert( + "job_v2_failover", + routed_2( + "job-3002", + ENC, + &[ + failed("im.alpha", 1_000, 2_000_000, rr::failed_hop_receipt(ENC, "job-3002", "im.alpha", Some("2.25"))), + rr::Hop { endpoint: "im.eta", error: None, start: 2_000_100, end: 9_000_000, receipt: rr::hop_receipt(ENC, "job-3002", "im.eta", Some("29.5")) }, + ], + &delivered, + out("job-3002"), + ), + ); + pool.insert("job_v2_decode", routed_2("job-3003", "media.decode", &[served("im.alpha", rr::hop_receipt("media.decode", "job-3003", "im.alpha", Some("12.0")))], &delivered, out("job-3003"))); + pool.insert( + "job_v2_late", + routed_2("job-3004", ENC, &[rr::Hop { endpoint: "im.alpha", error: None, start: 1_000, end: 31_000_000, receipt: rr::hop_receipt(ENC, "job-3004", "im.alpha", Some("31.0")) }], &delivered, out("job-3004")), + ); + pool.insert( + "job_v2_all_failed", + routed_2( + "job-3005", + ENC, + &[ + failed("im.alpha", 1_000, 2_000_000, rr::failed_hop_receipt(ENC, "job-3005", "im.alpha", Some("1.5"))), + failed("im.eta", 2_000_100, 3_000_000, rr::failed_hop_receipt(ENC, "job-3005", "im.eta", None)), + failed("im.iota", 3_000_100, 4_000_000, rr::failed_hop_receipt(ENC, "job-3005", "im.iota", Some("0.75"))), + ], + &[], + vec![], + ), + ); + pool.insert( + "job_v2_unclassed_failure", + routed_2( + "job-3006", + ENC, + &[ + failed("im.alpha", 1_000, 2_000_000, rr::without_class(rr::failed_hop_receipt(ENC, "job-3006", "im.alpha", Some("2.25")))), + rr::Hop { endpoint: "im.eta", error: None, start: 2_000_100, end: 9_000_000, receipt: rr::hop_receipt(ENC, "job-3006", "im.eta", Some("29.5")) }, + ], + &delivered, + out("job-3006"), + ), + ); + let encode_2 = pool["job_v2_encode"].clone(); + let with_outputs = |outputs: Vec| { + let mut j = encode_2.clone(); + j["outputs"] = Value::Array(outputs); + j + }; + pool.insert("job_v2_another_output", with_outputs(vec![output_of(&other_clip, &other_clip, "job-3001")])); + pool.insert("job_v2_output_twice", with_outputs([out("job-3001"), out("job-3001")].concat())); + // Version 4's room: the lesson's receipt of version 2, its bytes out priced. + pool.insert("lesson_bytes", room_of(&metering, "bytes_out_priced")?); + // Version 4's packaging runs (§4.7): video-base-01 made by a routed run of `package.build`, + // the package its output, and made again two days later, the same package from a new run + // with new energy; and that run made again replaying the first run's hop receipt. + let base = package_of(wai, "video-base-01")?; + let base_output = json!({"package": base["receipt"], "indexes": base["indexes"]}); + let base_object = [rr_hash(base["receipt"].as_str().ok_or("a package receipt")?.as_bytes())]; + let pack_hop = |at: u64, receipt: Value| rr::Hop { endpoint: "pack.alpha", error: None, start: at, end: at + 3_000_000, receipt }; + let first_pack = rr::hop_receipt("package.build", "pack-0001", "pack.alpha", Some("4.5")); + let packed = |accepted: u64, receipt: Value| routed(rr::package_job_document("pack-0001", accepted, &[pack_hop(1_000, receipt)], &base_object), vec![base_output.clone()]); + pool.insert("package_run", packed(accepted, first_pack.clone())); + pool.insert("package_run_again", packed(accepted + 2 * DAY_US, rr::hop_receipt("package.build", "pack-0001", "pack.alpha", Some("4.625")))); + let first_sealed: Value = serde_json::from_str(pool["package_run"]["receipts"][0].as_str().ok_or("the run's hop receipt")?).map_err(|e| e.to_string())?; + pool.insert("package_run_replayed", routed(rr::package_job_document("pack-0001", accepted + 2 * DAY_US, &[rr::Hop { endpoint: "pack.alpha", error: None, start: 1_000, end: 3_001_000, receipt: first_sealed }], &base_object), vec![base_output.clone()])); // The rooms' prices are the lesson receipts'; the tariff's scope is every party of the // accepted invoices. @@ -539,7 +639,7 @@ pub fn generate(wai: &Path) -> Result { Vector { name: "tariff_period_empty", about: "a tariff whose period is empty, signed by both", tariff: tariff_period.to_bytes(), invoice: ab.clone(), previous: None, sources: day_a.to_vec() }, // The invoice. Vector { name: "invoice_trailing_byte", about: "an invoice with a byte after its signature", tariff: tb.clone(), invoice: [ab.clone(), vec![0]].concat(), previous: None, sources: day_a.to_vec() }, - Vector { name: "invoice_version", about: "an invoice of version 4, which this revision does not define", tariff: tb.clone(), invoice: { let mut b = ab.clone(); b[4] = 4; b }, previous: None, sources: day_a.to_vec() }, + Vector { name: "invoice_version", about: "an invoice of version 5, which this revision does not define", tariff: tb.clone(), invoice: { let mut b = ab.clone(); b[4] = 5; b }, previous: None, sources: day_a.to_vec() }, Vector { name: "invoice_signature", about: "an invoice whose signature does not verify", tariff: tb.clone(), invoice: flip(ab.clone(), ab.len() - 1), previous: None, sources: day_a.to_vec() }, Vector { name: "invoice_lines_unordered", about: "an invoice whose first two lines are swapped", tariff: tb.clone(), invoice: sealed(&t, [0; 32], a0, a1, &refs(&day_a), |i| i.lines.swap(0, 1)).to_bytes(), previous: None, sources: day_a.to_vec() }, Vector { name: "invoice_row_of_no_class", about: "an energy row of tag 0: joules of no one class", tariff: tb.clone(), invoice: sealed(&t, [0; 32], a0, a1, &refs(&day_a), |i| i.energy.insert(0, Row { scope: 1, tag: 0, figures: 1, joules: 1, max_ppm: 0 })).to_bytes(), previous: None, sources: day_a.to_vec() }, @@ -683,6 +783,93 @@ pub fn generate(wai: &Path) -> Result { Vector { name: "version_2_bills_an_output_once", about: "version 2 as before: the re-run of job-0001 in the next invoice of a version-2 chain, refused because its output receipt was billed", tariff: tjb.clone(), invoice: sealed(&t_j, inv_j_first.digest(), mid, MONTH.1, &refs(&["job_rerun"]), |_| {}).to_bytes(), previous: Some(inv_j_first.to_bytes()), sources: vec!["job_rerun"] }, ]); + // Jobs routed under the route record's version 2, billed under a tariff of version 3: each + // output receipt is of an object its served hop states it delivered (§5.1); a failed hop's + // figure is not read, as version 3 states none. + let day_r = ["job_v2_encode", "job_v2_failover", "job_v2_decode", "job_v2_late", "job_v2_all_failed", "job_v2_unclassed_failure"]; + let inv_r = make_invoice(&seller, &t_k, None, MONTH.0, MONTH.1, &src(&day_r)).map_err(|e| format!("invoice r: {e:?}"))?; + vectors.extend([ + Vector { name: "version_2_routes_under_version_3", about: "version 3: jobs routed under the route record's version 2, per operation and ranked by their measured failures, each output receipt of an object its served hop states it delivered: an encode, a failover billed at the endpoint that served, a decode, a hop past the deadline and three that failed, billed nothing, the failed hops' figures not stated", tariff: tkb.clone(), invoice: inv_r.to_bytes(), previous: None, sources: day_r.to_vec() }, + Vector { name: "an_output_the_hop_did_not_deliver", about: "version 3: a job of version 2 whose output receipt is of a clip its served hop does not state it delivered", tariff: tkb.clone(), invoice: inv_r.to_bytes(), previous: None, sources: vec!["job_v2_another_output"] }, + Vector { name: "one_output_given_twice", about: "version 3: a job of version 2 giving the receipt of its one output twice, to bill its subpixels twice", tariff: tkb.clone(), invoice: inv_r.to_bytes(), previous: None, sources: vec!["job_v2_output_twice"] }, + ]); + + // Version 4 (§4.7): a room's bytes out at a price per 10^9 bytes, a package's work once and + // its storage by byte-days for each period it is held, and every hop's energy, the hops not + // billed in a scope of their own. Its room prices are the receipt of version 2's. + let room_prices_4 = { + let Facts::Room(r) = verify_source(&pool["lesson_bytes"], &[]).map_err(|e| format!("lesson_bytes: {e:?}"))? else { unreachable!() }; + let mut p = room_prices; + p[ROOM_PRICES_1] = r.tariff.bytes; + p + }; + let staged_scope = first_scope("package_staged"); + // A run of `package.build` priced per run and per work unit of the package it made. + let mut job_prices_4 = job_prices_3.clone(); + job_prices_4.push(jp(rr::PACKAGE, "package.build", 1, 1, 300_000)); + job_prices_4.push(jp(rr::PACKAGE, "package.build", 3, 1, 1_000)); + let v4 = |room: [u32; ROOM_PRICES]| -> Tariff { + let mut t4 = tariff_of("buyer-4", room, vec![(source_kind::ROOM, lesson_id), package_scope, staged_scope, (source_kind::JOB, router)]); + t4.version = VERSION_4; + t4.package = [0, 0, 2_000_000]; + t4.job = job_prices_4.clone(); + t4.sign(&seller, &key("buyer-4")) + }; + let t_4 = v4(room_prices_4); + let t4b = t_4.to_bytes(); + let day_4a = ["lesson_bytes", "package_base", "package_run", "job_v2_encode", "job_v2_failover", "job_v2_decode", "job_v2_late", "job_v2_all_failed"]; + let day_4b = ["package_base", "package_staged", "package_run_again"]; + let inv_4a = make_invoice(&seller, &t_4, None, MONTH.0, mid, &src(&day_4a)).map_err(|e| format!("invoice 4a: {e:?}"))?; + let inv_4b = make_invoice(&seller, &t_4, Some(&inv_4a), mid, MONTH.1, &src(&day_4b)).map_err(|e| format!("invoice 4b: {e:?}"))?; + let (a4, b4) = (inv_4a.to_bytes(), inv_4b.to_bytes()); + let line_of = |i: &Invoice, kind: u8, unit: u8| i.lines.iter().position(|l| l.source_kind == kind && l.unit == unit).expect("a line"); + let im_encode = |unit: u8| u8::try_from(job_prices_4.iter().position(|p| p.capability == IM && p.operation == "media.encode" && p.unit == unit).expect("a price") + 1).expect("a unit"); + let mut other_bytes = room_prices_4; + other_bytes[ROOM_PRICES_1] += 1; + let t_4_other = v4(other_bytes); + let base_signer = package_scope.1; + vectors.extend([ + Vector { name: "version_4_by_the_byte_and_the_work", about: "version 4: a lesson room's receipt of version 2 billed by the bytes its hops sent its sessions beside its time, a package listed and not yet billed for storage, the run that made it billed per run and per work unit of the package, and jobs routed under the route record's version 2 at their own prices, every hop's energy stated: the billed hops' in the jobs' scope, the failed hops' and the late hop's in a scope of their own, one of them unmetered", tariff: t4b.clone(), invoice: a4.clone(), previous: None, sources: day_4a.to_vec() }, + Vector { name: "version_4_storage_held_through_a_period", about: "version 4: the next invoice of the chain bills the package the first invoice holds for the byte-days of its own period, and the same package made again by a new run, its work billed for that run and its receipt cited again, beside a second package listed", tariff: t4b.clone(), invoice: b4.clone(), previous: Some(a4.clone()), sources: day_4b.to_vec() }, + Vector { name: "version_4_bytes_at_another_price", about: "version 4: a tariff whose price of bytes out is not the room receipt's", tariff: t_4_other.to_bytes(), invoice: sealed_after(&t_4_other, None, (MONTH.0, mid), MONTH.0, mid, &refs(&day_4a), |_| {}).to_bytes(), previous: None, sources: day_4a.to_vec() }, + Vector { name: "version_4_a_receipt_that_prices_no_bytes", about: "version 4: a room receipt of version 1 under its tariff, which states no price of bytes, billed under a tariff that prices them", tariff: t4b.clone(), invoice: sealed_after(&t_4, None, (MONTH.0, mid), MONTH.0, mid, &refs(&["lesson"]), |_| {}).to_bytes(), previous: None, sources: vec!["lesson"] }, + Vector { name: "version_4_bytes_out_above_the_receipt", about: "version 4: the room's bytes-out line one byte above what its receipt states", tariff: t4b.clone(), invoice: sealed_after(&t_4, None, (MONTH.0, mid), MONTH.0, mid, &refs(&day_4a), |i| { let k = line_of(i, source_kind::ROOM, 14); i.lines[k].quantity += 1; }).to_bytes(), previous: None, sources: day_4a.to_vec() }, + Vector { name: "version_4_storage_of_a_package_first_billed", about: "version 4: the first invoice billing a day of storage for a package it bills for the first time, which no record shows was kept before the period ended", tariff: t4b.clone(), invoice: sealed_after(&t_4, None, (MONTH.0, mid), MONTH.0, mid, &refs(&day_4a), |i| { + let cited: Cited = [(record_kind::PACKAGE, first_receipt(&pool["package_base"]))].into_iter().collect(); + i.lines.push(Line { source_kind: source_kind::PACKAGE, source: base_signer, unit: 3, quantity: 1, price: 2_000_000, amount: 0, cited: 1, cites: cites_digest(&cited) }); + i.lines.sort_by_key(|l| (l.source_kind, l.source, l.unit)); + }).to_bytes(), previous: None, sources: day_4a.to_vec() }, + Vector { name: "version_4_a_package_run_replayed", about: "version 4: the next invoice bills the package made again under a new route record whose hop receipt is the first run's, which the first invoice billed", tariff: t4b.clone(), invoice: sealed_after(&t_4, Some(&inv_4a), (mid, MONTH.1), mid, MONTH.1, &refs(&["package_base", "package_staged", "package_run_replayed"]), |_| {}).to_bytes(), previous: Some(a4.clone()), sources: vec!["package_base", "package_staged", "package_run_replayed"] }, + Vector { name: "version_4_one_package_run_under_two_jobs", about: "version 4: the package's first run and its replay in one invoice, one hop receipt under two route records", tariff: t4b.clone(), invoice: sealed_after(&t_4, None, (MONTH.0, MONTH.1), MONTH.0, MONTH.1, &refs(&["package_run", "package_run_replayed"]), |_| {}).to_bytes(), previous: None, sources: vec!["package_run", "package_run_replayed"] }, + Vector { name: "version_4_storage_over_the_tariffs_period", about: "version 4: the held package's storage billed over the tariff's whole period rather than the invoice's", tariff: t4b.clone(), invoice: sealed_after(&t_4, Some(&inv_4a), (MONTH.0, MONTH.1), mid, MONTH.1, &refs(&day_4b), |_| {}).to_bytes(), previous: Some(a4.clone()), sources: day_4b.to_vec() }, + Vector { name: "version_4_unbilled_hops_left_out", about: "version 4: the first invoice without the failed and late hops' energy", tariff: t4b.clone(), invoice: sealed_after(&t_4, None, (MONTH.0, mid), MONTH.0, mid, &refs(&day_4a), |i| { i.energy.retain(|r| r.scope != scope::UNBILLED_HOPS); i.unmetered[5] = 0; }).to_bytes(), previous: None, sources: day_4a.to_vec() }, + Vector { name: "version_4_unbilled_hops_in_the_jobs_scope", about: "version 4: the failed and late hops' counter readings added to the billed hops' row", tariff: t4b.clone(), invoice: sealed_after(&t_4, None, (MONTH.0, mid), MONTH.0, mid, &refs(&day_4a), |i| { + let moved: Vec = i.energy.iter().filter(|r| r.scope == scope::UNBILLED_HOPS).copied().collect(); + i.energy.retain(|r| r.scope != scope::UNBILLED_HOPS); + for m in moved { + if let Some(r) = i.energy.iter_mut().find(|r| r.scope == scope::JOBS && r.tag == m.tag) { + r.figures += m.figures; + r.joules += m.joules; + } + } + i.unmetered[4] += i.unmetered[5]; + i.unmetered[5] = 0; + }).to_bytes(), previous: None, sources: day_4a.to_vec() }, + Vector { name: "version_4_a_failed_hop_billed_as_a_job", about: "version 4: the int_motion encode jobs line counting the failover's failed hop as a job, a routing figure billed", tariff: t4b.clone(), invoice: sealed_after(&t_4, None, (MONTH.0, mid), MONTH.0, mid, &refs(&day_4a), |i| { let k = i.lines.iter().position(|l| l.source_kind == source_kind::JOB && l.unit == im_encode(1)).expect("the encode jobs line"); i.lines[k].quantity += 1; }).to_bytes(), previous: None, sources: day_4a.to_vec() }, + Vector { name: "version_4_a_job_line_at_the_routers_price", about: "version 4: the int_motion encode subpixels line priced at the router's price book's list price for its endpoint, not the tariff's", tariff: t4b.clone(), invoice: sealed_after(&t_4, None, (MONTH.0, mid), MONTH.0, mid, &refs(&day_4a), |i| { + let k = i.lines.iter().position(|l| l.source_kind == source_kind::JOB && l.unit == im_encode(2)).expect("the encode subpixels line"); + let l = &mut i.lines[k]; + i.amount -= l.amount; + l.price = 30_000; + l.amount = (l.quantity as u128 * l.price as u128 / 1_000_000) as u64; + i.amount += l.amount; + }).to_bytes(), previous: None, sources: day_4a.to_vec() }, + Vector { name: "version_4_an_output_the_hop_did_not_deliver", about: "version 4: a job of version 2 whose output receipt is of a clip its served hop does not state it delivered", tariff: t4b.clone(), invoice: a4.clone(), previous: None, sources: vec!["job_v2_another_output"] }, + Vector { name: "version_4_an_output_of_a_version_1_record", about: "version 4: a job whose route record of version 1 states no output, given an output receipt", tariff: t4b.clone(), invoice: a4.clone(), previous: None, sources: vec!["job_int_motion"] }, + Vector { name: "version_4_unbilled_hop_with_no_class", about: "version 4: a failover whose failed hop's figure states no acquisition class, which no row can state", tariff: t4b.clone(), invoice: a4.clone(), previous: None, sources: vec!["job_v2_unclassed_failure"] }, + Vector { name: "version_3_invoice_under_a_version_4_tariff", about: "an invoice of version 3 naming a tariff of version 4", tariff: t4b.clone(), invoice: sealed_after(&t_4, None, (MONTH.0, mid), MONTH.0, mid, &refs(&day_4a), |i| { i.version = VERSION_3; i.unmetered[5] = 0; i.energy.retain(|r| r.scope != scope::UNBILLED_HOPS); i.lines.retain(|l| !(l.source_kind == source_kind::ROOM && l.unit == 14)); }).to_bytes(), previous: None, sources: day_4a.to_vec() }, + ]); + let mut sources = Map::new(); for (n, v) in &pool { sources.insert((*n).into(), v.clone()); @@ -696,7 +883,7 @@ pub fn generate(wai: &Path) -> Result { "sources": v.sources, "outcome": outcome, })); } - let keys = json!({"seller": hex(&pk("seller")), "buyer": hex(&pk("buyer")), "buyer_m": hex(&pk("buyer-m")), "buyer_s": hex(&pk("buyer-s")), "buyer_j": hex(&pk("buyer-j")), "cdn_a": hex(&pk("cdn-a")), "cdn_b": hex(&pk("cdn-b")), "output_sink": hex(&pk("output-sink"))}); + let keys = json!({"seller": hex(&pk("seller")), "buyer": hex(&pk("buyer")), "buyer_m": hex(&pk("buyer-m")), "buyer_s": hex(&pk("buyer-s")), "buyer_j": hex(&pk("buyer-j")), "buyer_4": hex(&pk("buyer-4")), "cdn_a": hex(&pk("cdn-a")), "cdn_b": hex(&pk("cdn-b")), "output_sink": hex(&pk("output-sink"))}); let doc = json!({ "corpus": CAPABILITY, "extension": "extensions/receipt-ledger.md", diff --git a/wai/wai-rs/src/route_record/corpus.rs b/wai/wai-rs/src/route_record/corpus.rs index f7cc8d5ca..6419ccf9b 100644 --- a/wai/wai-rs/src/route_record/corpus.rs +++ b/wai/wai-rs/src/route_record/corpus.rs @@ -614,6 +614,91 @@ pub(crate) fn job_document(job: &str, operation: &str, accepted: u64, attempts: }) } +/// The OER/2 receipt of a hop of `job` at `endpoint` for `operation` that failed, sealed and +/// bound as [`hop_receipt`] seals and binds: its figure a counter reading of `joules`, for a +/// hop that spent energy and delivered nothing, or the unmetered marker (`None`). +#[cfg(feature = "receipt_ledger")] +pub(crate) fn failed_hop_receipt(operation: &str, job: &str, endpoint: &str, joules: Option<&str>) -> Value { + let mut r = match joules { + Some(j) => receipt(operation, endpoint, -1, Some((j, counter(), "measured"))), + None => receipt(operation, endpoint, -1, None), + }; + r["subject"]["inputs"] = json!([sha(&format!("{job}/{endpoint}"))]); + reseal_receipt(&mut r); + r +} + +/// A hop's receipt with its figure's acquisition class removed, sealed again: a figure no +/// energy row can state (receipt-ledger §5.1). +#[cfg(feature = "receipt_ledger")] +pub(crate) fn without_class(mut r: Value) -> Value { + r["energy"].as_object_mut().expect("an energy object").remove("class"); + reseal_receipt(&mut r); + r +} + +/// The verification document (§7.1) of a job of version 2 (§3.4): version 2's request under +/// `job` and `operation`, routed by this corpus's router under version 2's price book, with its +/// per-operation entries and measured failures, and its policy, accepted at `accepted`, with +/// `attempts` in their order. The attempt that served states `outputs`, and its receipt is +/// sealed again naming their commitment (§6), so a caller gives a served hop's receipt as +/// [`hop_receipt`] makes it. +#[cfg(feature = "receipt_ledger")] +pub(crate) fn job_document_2(job: &str, operation: &str, accepted: u64, attempts: &[Hop], outputs: &[[u8; 32]]) -> Value { + routed_2(request_2(job, operation, no_preference()), pricebook_2(), accepted, attempts, outputs) +} + +/// The capability a packaging job names: WAI's packaging (`wai.video.package`). +#[cfg(feature = "receipt_ledger")] +pub(crate) const PACKAGE: &str = "wai.video.package"; + +/// The verification document of a packaging job of version 2: version 2's request under `job` +/// for the operation `package.build` of [`PACKAGE`], one package, routed under a price book of +/// version 2 whose one entry, `pack.alpha`, prices that operation per package and never failed in +/// 1,000 hops; `attempts` and `outputs` as [`job_document_2`] takes them. +#[cfg(feature = "receipt_ledger")] +pub(crate) fn package_job_document(job: &str, accepted: u64, attempts: &[Hop], outputs: &[[u8; 32]]) -> Value { + let mut request = request_2(job, "package.build", no_preference()); + request["capability"] = json!(PACKAGE); + request["fallback"] = Value::Null; + request["quantities"] = json!([{"unit": "packages", "quantity": 1}]); + let entry = entry_2("pack.alpha", "package.build", "prov-alpha", PACKAGE, EU_C, ("packages", 1, 400_000), Some(500), Some((4_500_000, "OnChipCounter")), Some(950), failures(1_000, 0, 0, 0)); + routed_2(request, pricebook_2_of(vec![entry]), accepted, attempts, outputs) +} + +#[cfg(feature = "receipt_ledger")] +fn routed_2(request: Value, pricebook: Value, accepted: u64, attempts: &[Hop], outputs: &[[u8; 32]]) -> Value { + let r = Request::read(&canonical(&request)).expect("the request reads"); + let b = PriceBook::read(&canonical(&pricebook)).expect("the price book reads"); + let p = Policy::read(&canonical(&policy(3))).expect("the policy reads"); + let commitment = hex(&super::output_commitment(outputs)); + let receipts: Vec = attempts + .iter() + .map(|h| { + let mut rc = h.receipt.clone(); + if h.error.is_none() { + rc["subject"]["output"] = json!(commitment); + reseal_receipt(&mut rc); + } + rc + }) + .collect(); + let atts: Vec = attempts + .iter() + .zip(&receipts) + .map(|(h, rc)| Attempt { endpoint: h.endpoint.to_string(), error: h.error, start: accepted + h.start, end: accepted + h.end, receipt: id(rc) }) + .collect(); + let record = super::seal_delivered(&router(), &r, &b, &p, accepted, &atts, outputs); + json!({ + "request": canonical(&request), + "pricebook": canonical(&pricebook), + "policy": canonical(&policy(3)), + "record": canonical(&record), + "receipts": receipts.iter().map(text).collect::>(), + "keys": {HOP_SIGNER: hex(&hops().verifying_key().to_bytes())}, + }) +} + /// The corpus, as `vectors.json` holds it. pub fn generate() -> Result { let mut out = Vec::new(); diff --git a/wai/wai-rs/tests/live_metering.rs b/wai/wai-rs/tests/live_metering.rs index 353fb73b1..efad1f91e 100644 --- a/wai/wai-rs/tests/live_metering.rs +++ b/wai/wai-rs/tests/live_metering.rs @@ -87,6 +87,42 @@ fn the_corpus_covers_every_reason_and_case() { } } +/// A receipt of version 2 (§4.1, §4.4, §4.6): its bytes out are its hops' ledgers' bytes out, +/// the sum of its grants'; a grant's funds count its bytes at their price; every receipt of +/// version 1 states no bytes; and the controls of version 2 are refused at their places. +#[test] +fn a_receipt_of_version_2_states_and_prices_the_bytes_out() { + let doc: serde_json::Value = serde_json::from_str(&committed()).unwrap(); + let vectors = doc["vectors"].as_array().unwrap(); + let get = |n: &str| vectors.iter().find(|v| v["name"] == n).unwrap_or_else(|| panic!("no vector {n}")); + let v2 = get("bytes_out_priced"); + assert_eq!(v2["outcome"], "accept"); + assert_eq!(&v2["receipt"].as_str().unwrap()[8..10], "02", "a receipt of version 2"); + let bytes = v2["units"]["bytes_out"].as_u64().unwrap(); + assert!(bytes > 0); + let by_grant: u64 = v2["consumption"].as_array().unwrap().iter().map(|c| c["bytes_out"].as_u64().unwrap()).sum(); + assert_eq!(by_grant, bytes, "the grants' bytes out sum to the receipt's"); + let lesson = get("lesson"); + let mut without = v2["units"].clone(); + without.as_object_mut().unwrap().remove("bytes_out"); + assert_eq!(without, lesson["units"], "every other unit is version 1's"); + assert!( + v2["consumption"].as_array().unwrap().iter().zip(lesson["consumption"].as_array().unwrap()).any(|(a, b)| a["funds"].as_u64() > b["funds"].as_u64()), + "a grant's funds count its bytes" + ); + for v in vectors.iter().filter(|v| v["outcome"] == "accept" && v["name"] != "bytes_out_priced") { + assert!(v["units"].get("bytes_out").is_none(), "{}", v["name"]); + } + for (n, why, at) in [ + ("bytes_out_mismatch", "unit_mismatch", serde_json::json!(["units"])), + ("bytes_out_left_out_of_the_consumption", "ceiling_mismatch", serde_json::json!(["ceilings"])), + ("bytes_priced_with_no_tariff", "session_invalid", serde_json::json!(["receipt"])), + ("receipt_unknown_version", "unknown_version", serde_json::json!(["receipt"])), + ] { + assert_eq!((&get(n)["reason"], &get(n)["at"]), (&serde_json::json!(why), &at), "{n}"); + } +} + /// §9 of the extension lists exactly the codes `Reason::ALL` has, each once, in order. #[test] fn the_extension_lists_the_reasons() { diff --git a/wai/wai-rs/tests/receipt_ledger.rs b/wai/wai-rs/tests/receipt_ledger.rs index 2ec7fed68..93c1c4dec 100644 --- a/wai/wai-rs/tests/receipt_ledger.rs +++ b/wai/wai-rs/tests/receipt_ledger.rs @@ -180,6 +180,99 @@ fn version_3_prices_each_operation_and_bills_the_work() { } } +/// Jobs routed under the route record's version 2 (§5.1): billed under version 3 at the endpoint +/// that served, each output receipt of an object its hop states it delivered, and refused +/// `output_not_delivered` when it is another or given twice; under version 4 a record of +/// version 1 holds its outputs to none. +#[test] +fn a_jobs_output_is_what_its_hop_delivered() { + use serde_json::json; + let doc: serde_json::Value = serde_json::from_str(&committed()).unwrap(); + let vectors = doc["vectors"].as_array().unwrap(); + let get = |n: &str| vectors.iter().find(|v| v["name"] == n).unwrap_or_else(|| panic!("no vector {n}"))["outcome"].clone(); + let r = get("version_2_routes_under_version_3"); + assert_eq!(r["outcome"], "accept"); + let jobs: u64 = r["lines"].as_array().unwrap().iter().filter(|l| l["unit"] == "jobs").map(|l| l["quantity"].as_u64().unwrap()).sum(); + assert_eq!(jobs, 4, "an encode, a failover, a decode and a failover whose failed hop states no class; the late and the failed jobs bill nothing"); + assert!(r["energy"].as_array().unwrap().iter().all(|e| e["scope"] == "jobs"), "version 3 states the billed hops' energy alone"); + let record = |n: &str| -> serde_json::Value { serde_json::from_str(doc["sources"][n]["record"].as_str().unwrap()).unwrap() }; + assert_eq!(record("job_v2_encode")["version"], 2, "a route record of version 2"); + assert!(record("job_v2_failover")["candidates"].as_array().unwrap().iter().any(|c| c["failures"].is_object()), "measured failures stated"); + for (n, at) in [ + ("an_output_the_hop_did_not_deliver", json!(["source", 0, "outputs", 0])), + ("one_output_given_twice", json!(["source", 0, "outputs", 1])), + ("version_4_an_output_the_hop_did_not_deliver", json!(["source", 0, "outputs", 0])), + ("version_4_an_output_of_a_version_1_record", json!(["source", 0, "outputs", 0])), + ] { + let o = get(n); + assert_eq!((o["reason"].as_str(), &o["at"]), (Some("output_not_delivered"), &at), "{n}"); + } +} + +/// Version 4 (§4.7, §6.6): a room's bytes out at its price per 10^9 bytes; a package's work +/// billed once per run that made it, its receipt cited by each, and its storage by byte-days for +/// each period it is held; every hop's energy, the hops not billed in a scope of their own; and +/// each control refused at its place. +#[test] +fn version_4_bills_the_bytes_the_work_and_the_storage() { + use serde_json::{json, Value}; + let doc: Value = serde_json::from_str(&committed()).unwrap(); + let vectors = doc["vectors"].as_array().unwrap(); + let get = |n: &str| vectors.iter().find(|v| v["name"] == n).unwrap_or_else(|| panic!("no vector {n}"))["outcome"].clone(); + let lines = |o: &Value, unit: &str| -> Vec { o["lines"].as_array().unwrap().iter().filter(|l| l["unit"] == unit).cloned().collect() }; + let metering: Value = serde_json::from_str(&read("live-conformance/metering/vectors.json")).unwrap(); + let bytes = metering["vectors"].as_array().unwrap().iter().find(|v| v["name"] == "bytes_out_priced").unwrap()["units"]["bytes_out"].as_u64().unwrap(); + let package = |n: &str| -> Value { serde_json::from_str(doc["sources"][n]["receipt"].as_str().unwrap()).unwrap() }; + let base = package("package_base"); + let cites = |l: &Value, kind: u64| -> Vec { l["cites"].as_array().unwrap().iter().filter(|c| c[0] == kind).map(|c| c[1].as_str().unwrap().to_string()).collect() }; + + let a = get("version_4_by_the_byte_and_the_work"); + assert_eq!(a["outcome"], "accept"); + let out = lines(&a, "bytes_out"); + assert_eq!(out.len(), 1); + assert_eq!(out[0]["quantity"].as_u64(), Some(bytes), "the receipt's bytes out"); + assert_eq!(out[0]["amount"].as_u64().unwrap(), (bytes as u128 * out[0]["price"].as_u64().unwrap() as u128 / 1_000_000_000) as u64); + let work_a = lines(&a, "work_units"); + assert_eq!((work_a.len(), &work_a[0]["quantity"], &work_a[0]["source_kind"]), (1, &base["work_units"], &json!("job")), "the run that made the package, by its work units"); + assert_eq!(cites(&work_a[0], 5), vec![base["receipt_hash"].as_str().unwrap().to_string()], "the package cited as the run's output"); + assert!(a["lines"].as_array().unwrap().iter().all(|l| l["source_kind"] != "package"), "a package first listed bills no storage, and a package source no work"); + let scope = |o: &Value, s: &str| -> Vec { o["energy"].as_array().unwrap().iter().filter(|e| e["scope"] == s).cloned().collect() }; + assert_eq!(scope(&a, "jobs").iter().map(|e| e["figures"].as_u64().unwrap()).sum::(), 4, "four billed hops, the packaging run's among them"); + assert!(scope(&a, "packaging").is_empty(), "a package's energy is its run's, stated by its hop"); + assert_eq!(scope(&a, "unbilled_hops").iter().map(|e| e["figures"].as_u64().unwrap()).sum::(), 4, "the failover's, the late hop's and two of the three failed hops' figures"); + assert_eq!((a["unmetered"]["unbilled_hops"].as_u64(), a["coverage"]["unbilled_hops"].as_str()), (Some(1), Some("partial")), "one failed hop unmetered"); + + let b = get("version_4_storage_held_through_a_period"); + assert_eq!(b["outcome"], "accept"); + let days = lines(&b, "byte_days"); + assert_eq!(days.len(), 1); + let period = b["end"].as_u64().unwrap() - b["start"].as_u64().unwrap(); + assert_eq!(days[0]["quantity"].as_u64().unwrap() as u128, base["stored_bytes"].as_u64().unwrap() as u128 * period as u128 / 86_400_000_000, "its bytes over the invoice's period, in days"); + let work_b = lines(&b, "work_units"); + assert_eq!((work_b.len(), &work_b[0]["quantity"]), (1, &base["work_units"]), "the same package made again, its work billed for the new run"); + assert_eq!(cites(&work_b[0], 5), cites(&work_a[0], 5), "the package the first invoice lists, cited again"); + assert!(cites(&work_b[0], 14).iter().all(|h| !cites(&work_a[0], 14).contains(h)), "a new run's hop receipt"); + + for (n, reason, at) in [ + ("version_4_bytes_at_another_price", "tariff_conflict", json!(["source", 0])), + ("version_4_a_receipt_that_prices_no_bytes", "tariff_conflict", json!(["source", 0])), + ("version_4_bytes_out_above_the_receipt", "quantity_not_recorded", json!(["invoice"])), + ("version_4_storage_of_a_package_first_billed", "quantity_not_recorded", json!(["invoice"])), + ("version_4_a_package_run_replayed", "record_rebilled", json!(["source", 2])), + ("version_4_one_package_run_under_two_jobs", "record_duplicate", json!(["source", 1])), + ("version_4_storage_over_the_tariffs_period", "quantity_not_recorded", json!(["invoice"])), + ("version_4_unbilled_hops_left_out", "invoice_mismatch", json!(["invoice"])), + ("version_4_unbilled_hops_in_the_jobs_scope", "invoice_mismatch", json!(["invoice"])), + ("version_4_a_failed_hop_billed_as_a_job", "quantity_not_recorded", json!(["invoice"])), + ("version_4_a_job_line_at_the_routers_price", "invoice_mismatch", json!(["invoice"])), + ("version_4_unbilled_hop_with_no_class", "job_figure_invalid", json!(["source", 0, "receipts", 0])), + ("version_3_invoice_under_a_version_4_tariff", "tariff_mismatch", json!(["invoice"])), + ] { + let o = get(n); + assert_eq!((o["reason"].as_str(), &o["at"]), (Some(reason), &at), "{n}"); + } +} + /// §10 of the extension lists exactly the codes `Reason::ALL` has, each once, in order. #[test] fn the_extension_lists_the_reasons() { -- 2.54.0 (Apple Git-157)