githolon 0.108.3 → 0.108.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/compile_mountability_entry.js +180 -12
- package/dist/dev-server.mjs +643 -134
- package/dist/framework/bootstrap.law.usdz +0 -0
- package/dist/framework/nomos.law.usdz +0 -0
- package/dist/full-cli.mjs +720 -181
- package/package.json +2 -2
package/dist/full-cli.mjs
CHANGED
|
@@ -408,9 +408,8 @@ var init_fields = __esm({
|
|
|
408
408
|
{ timestamp: true }
|
|
409
409
|
);
|
|
410
410
|
},
|
|
411
|
-
/** A boolean flag (Lww).
|
|
412
|
-
*
|
|
413
|
-
* same string form. (Not encryptable — only Lww-class scalars are, and bool already is.) */
|
|
411
|
+
/** A first-class USDA boolean flag (Lww). It remains a boolean through authored law, kernel state,
|
|
412
|
+
* canonical custody and generated reads; it is never lowered through a string or JSON value. */
|
|
414
413
|
bool() {
|
|
415
414
|
return makeField("bool", z2.boolean(), FirstWriterWins);
|
|
416
415
|
},
|
|
@@ -1606,7 +1605,11 @@ function payloadIdSelector(selector) {
|
|
|
1606
1605
|
};
|
|
1607
1606
|
}
|
|
1608
1607
|
if (Array.isArray(selector)) {
|
|
1609
|
-
const readId = {
|
|
1608
|
+
const readId = {
|
|
1609
|
+
source: "template",
|
|
1610
|
+
parts: [...selector],
|
|
1611
|
+
optional: false
|
|
1612
|
+
};
|
|
1610
1613
|
return {
|
|
1611
1614
|
field: (payload) => resolveInvariantReadId(readId, payload) ?? "",
|
|
1612
1615
|
readId
|
|
@@ -1614,9 +1617,17 @@ function payloadIdSelector(selector) {
|
|
|
1614
1617
|
}
|
|
1615
1618
|
if (typeof selector === "object" && selector !== null && "source" in selector) {
|
|
1616
1619
|
if (selector.source === "item") {
|
|
1617
|
-
throw new Error(
|
|
1620
|
+
throw new Error(
|
|
1621
|
+
"directive precondition ids cannot use item-relative read parts"
|
|
1622
|
+
);
|
|
1618
1623
|
}
|
|
1619
|
-
const readId = selector.source === "literal" ? selector : selector.transform === "none" ? {
|
|
1624
|
+
const readId = selector.source === "literal" ? selector : selector.transform === "none" ? {
|
|
1625
|
+
source: "payload",
|
|
1626
|
+
path: selector.path,
|
|
1627
|
+
prefix: "",
|
|
1628
|
+
suffix: "",
|
|
1629
|
+
optional: false
|
|
1630
|
+
} : { source: "template", parts: [selector], optional: false };
|
|
1620
1631
|
return {
|
|
1621
1632
|
field: (payload) => resolveInvariantReadId(readId, payload) ?? "",
|
|
1622
1633
|
...readId.source === "payload" ? { path: readId.path } : {},
|
|
@@ -1653,7 +1664,10 @@ function makeRequirable(base) {
|
|
|
1653
1664
|
)
|
|
1654
1665
|
});
|
|
1655
1666
|
}
|
|
1656
|
-
return makeRequirable({
|
|
1667
|
+
return makeRequirable({
|
|
1668
|
+
...base,
|
|
1669
|
+
secondaryOutputs: [...base.secondaryOutputs ?? [], next]
|
|
1670
|
+
});
|
|
1657
1671
|
};
|
|
1658
1672
|
return {
|
|
1659
1673
|
...base,
|
|
@@ -1664,15 +1678,18 @@ function makeRequirable(base) {
|
|
|
1664
1678
|
return makeRequirable({ ...base, payloadExample: payload });
|
|
1665
1679
|
}
|
|
1666
1680
|
const parsed = base.payloadSchema.safeParse(payload);
|
|
1667
|
-
if (!parsed.success)
|
|
1668
|
-
|
|
1669
|
-
|
|
1681
|
+
if (!parsed.success)
|
|
1682
|
+
throw new Error(
|
|
1683
|
+
`directive('${base.id}').example(...) must satisfy its payload schema: ${parsed.error.message}`
|
|
1684
|
+
);
|
|
1670
1685
|
return makeRequirable({ ...base, payloadExample: parsed.data });
|
|
1671
1686
|
},
|
|
1672
1687
|
fromCurrentPrincipal(field) {
|
|
1673
1688
|
const name = field.trim();
|
|
1674
1689
|
if (name.length === 0) {
|
|
1675
|
-
throw new Error(
|
|
1690
|
+
throw new Error(
|
|
1691
|
+
"directive.fromCurrentPrincipal(field): field must be a non-empty payload field name"
|
|
1692
|
+
);
|
|
1676
1693
|
}
|
|
1677
1694
|
if (zodKind2(base.payloadSchema) !== "object") {
|
|
1678
1695
|
throw new Error(
|
|
@@ -1703,7 +1720,9 @@ function makeRequirable(base) {
|
|
|
1703
1720
|
},
|
|
1704
1721
|
fromRecord(field, opts) {
|
|
1705
1722
|
if (typeof field !== "string" || field.length === 0) {
|
|
1706
|
-
throw new Error(
|
|
1723
|
+
throw new Error(
|
|
1724
|
+
"directive.fromRecord(field): field must be a non-empty payload field name"
|
|
1725
|
+
);
|
|
1707
1726
|
}
|
|
1708
1727
|
const prior = base.businessRecordInputs ?? [];
|
|
1709
1728
|
const next = {
|
|
@@ -1712,7 +1731,10 @@ function makeRequirable(base) {
|
|
|
1712
1731
|
};
|
|
1713
1732
|
return makeRequirable({
|
|
1714
1733
|
...base,
|
|
1715
|
-
businessRecordInputs: [
|
|
1734
|
+
businessRecordInputs: [
|
|
1735
|
+
...prior.filter((candidate) => candidate.field !== field),
|
|
1736
|
+
next
|
|
1737
|
+
]
|
|
1716
1738
|
});
|
|
1717
1739
|
},
|
|
1718
1740
|
trustsSource(opts) {
|
|
@@ -1741,6 +1763,11 @@ function makeRequirable(base) {
|
|
|
1741
1763
|
`directive('${base.id}').trustsSource(...): the trust directive must be wrapped in nomosImplementationDetail(...) so tenant code cannot call it`
|
|
1742
1764
|
);
|
|
1743
1765
|
}
|
|
1766
|
+
if (opts.satisfiedBy === void 0 !== (opts.satisfiedByArgs === void 0)) {
|
|
1767
|
+
throw new Error(
|
|
1768
|
+
`directive('${base.id}').trustsSource(...): satisfiedBy and satisfiedByArgs must be declared together`
|
|
1769
|
+
);
|
|
1770
|
+
}
|
|
1744
1771
|
return makeRequirable({
|
|
1745
1772
|
...base,
|
|
1746
1773
|
businessSourceTrust: {
|
|
@@ -1750,7 +1777,11 @@ function makeRequirable(base) {
|
|
|
1750
1777
|
queryArgs: { ...opts.queryArgs },
|
|
1751
1778
|
copy: { ...opts.copy ?? {} },
|
|
1752
1779
|
genesisField: opts.genesisField ?? "sourceGenesis",
|
|
1753
|
-
keyHashesField: opts.keyHashesField ?? "sourceKeyHashes"
|
|
1780
|
+
keyHashesField: opts.keyHashesField ?? "sourceKeyHashes",
|
|
1781
|
+
...opts.satisfiedBy === void 0 ? {} : {
|
|
1782
|
+
satisfiedByQueryId: opts.satisfiedBy.id,
|
|
1783
|
+
satisfiedByQueryArgs: { ...opts.satisfiedByArgs ?? {} }
|
|
1784
|
+
}
|
|
1754
1785
|
}
|
|
1755
1786
|
});
|
|
1756
1787
|
},
|
|
@@ -1815,7 +1846,9 @@ function makeRequirable(base) {
|
|
|
1815
1846
|
delegatedFrom(parent) {
|
|
1816
1847
|
const g = base.delegatedRoleGate;
|
|
1817
1848
|
if (g === void 0) {
|
|
1818
|
-
throw new Error(
|
|
1849
|
+
throw new Error(
|
|
1850
|
+
"directive.delegatedFrom(): call .delegatedRole(relation) before .delegatedFrom(parent)"
|
|
1851
|
+
);
|
|
1819
1852
|
}
|
|
1820
1853
|
return makeRequirable({
|
|
1821
1854
|
...base,
|
|
@@ -1846,12 +1879,22 @@ function makeRequirable(base) {
|
|
|
1846
1879
|
},
|
|
1847
1880
|
reads(...reads) {
|
|
1848
1881
|
const refTypes = reads.filter((r) => typeof r === "string");
|
|
1849
|
-
const queryDecls = reads.filter(
|
|
1882
|
+
const queryDecls = reads.filter(
|
|
1883
|
+
(r) => typeof r !== "string"
|
|
1884
|
+
);
|
|
1850
1885
|
const merged = [.../* @__PURE__ */ new Set([...base.declaredReads, ...refTypes])].sort();
|
|
1851
|
-
const byId = new Map(
|
|
1886
|
+
const byId = new Map(
|
|
1887
|
+
(base.declaredQueryReads ?? []).map((q) => [q.id, q])
|
|
1888
|
+
);
|
|
1852
1889
|
for (const q of queryDecls) byId.set(q.id, q);
|
|
1853
|
-
const mergedQueries = [...byId.values()].sort(
|
|
1854
|
-
|
|
1890
|
+
const mergedQueries = [...byId.values()].sort(
|
|
1891
|
+
(a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0
|
|
1892
|
+
);
|
|
1893
|
+
return makeRequirable({
|
|
1894
|
+
...base,
|
|
1895
|
+
declaredReads: merged,
|
|
1896
|
+
declaredQueryReads: mergedQueries
|
|
1897
|
+
});
|
|
1855
1898
|
},
|
|
1856
1899
|
readsFrom(source, query3, opts) {
|
|
1857
1900
|
let entry;
|
|
@@ -1867,20 +1910,33 @@ function makeRequirable(base) {
|
|
|
1867
1910
|
`readsFrom(fromPayload('${source.payloadField}'), '${query3.id}'): { policy } must be a trustPolicy(...) declaration.`
|
|
1868
1911
|
);
|
|
1869
1912
|
}
|
|
1870
|
-
entry = {
|
|
1913
|
+
entry = {
|
|
1914
|
+
queryId: query3.id,
|
|
1915
|
+
policy: policy.policyId,
|
|
1916
|
+
fromPayload: source.payloadField
|
|
1917
|
+
};
|
|
1871
1918
|
if (policy.monotone === true) __registerMonotoneForeignQuery(query3.id);
|
|
1872
1919
|
} else {
|
|
1873
1920
|
entry = { queryId: query3.id, from: source };
|
|
1874
1921
|
}
|
|
1875
1922
|
const canon = (e) => "from" in e ? `0\\0${e.from}\\0${e.queryId}` : `1\\0${e.policy}\\0${e.fromPayload}\\0${e.queryId}`;
|
|
1876
1923
|
const prior = base.declaredForeignReads ?? [];
|
|
1877
|
-
const byKey = new Map(
|
|
1924
|
+
const byKey = new Map(
|
|
1925
|
+
prior.map((e) => [canon(e), e])
|
|
1926
|
+
);
|
|
1878
1927
|
byKey.set(canon(entry), entry);
|
|
1879
|
-
const merged = [...byKey.values()].sort(
|
|
1880
|
-
|
|
1928
|
+
const merged = [...byKey.values()].sort(
|
|
1929
|
+
(a, b) => canon(a) < canon(b) ? -1 : canon(a) > canon(b) ? 1 : 0
|
|
1930
|
+
);
|
|
1931
|
+
return makeRequirable({
|
|
1932
|
+
...base,
|
|
1933
|
+
declaredForeignReads: merged
|
|
1934
|
+
}).alsoEnsures(NomosSourceFrontier);
|
|
1881
1935
|
},
|
|
1882
1936
|
emits(eventType, opts) {
|
|
1883
|
-
const merged = {
|
|
1937
|
+
const merged = {
|
|
1938
|
+
...base.declaredEmits
|
|
1939
|
+
};
|
|
1884
1940
|
merged[eventType] = opts?.max !== void 0 ? { max: opts.max } : {};
|
|
1885
1941
|
return makeRequirable({ ...base, declaredEmits: merged });
|
|
1886
1942
|
},
|
|
@@ -1892,20 +1948,41 @@ function makeRequirable(base) {
|
|
|
1892
1948
|
...base.marker === "creates" ? [base.aggregateId] : [],
|
|
1893
1949
|
...(base.secondaryOutputs ?? []).filter((o) => o.marker === "creates").map((o) => o.aggregateId)
|
|
1894
1950
|
];
|
|
1895
|
-
return makeRequirable({
|
|
1951
|
+
return makeRequirable({
|
|
1952
|
+
...base,
|
|
1953
|
+
activityDescriptor: normalizeActivity(
|
|
1954
|
+
base.id,
|
|
1955
|
+
input,
|
|
1956
|
+
base.payloadSchema,
|
|
1957
|
+
createdIds
|
|
1958
|
+
)
|
|
1959
|
+
});
|
|
1896
1960
|
},
|
|
1897
1961
|
declaresRelation(rel) {
|
|
1898
|
-
return makeRequirable({
|
|
1962
|
+
return makeRequirable({
|
|
1963
|
+
...base,
|
|
1964
|
+
declaredRelations: [...base.declaredRelations, rel]
|
|
1965
|
+
});
|
|
1899
1966
|
},
|
|
1900
1967
|
requiresHostCapability(...portIds) {
|
|
1901
|
-
const merged = [
|
|
1968
|
+
const merged = [
|
|
1969
|
+
.../* @__PURE__ */ new Set([...base.declaredHostCapabilities, ...portIds])
|
|
1970
|
+
].sort();
|
|
1902
1971
|
return makeRequirable({ ...base, declaredHostCapabilities: merged });
|
|
1903
1972
|
},
|
|
1904
1973
|
births() {
|
|
1905
|
-
const byId = new Map(
|
|
1974
|
+
const byId = new Map(
|
|
1975
|
+
(base.declaredQueryReads ?? []).map((q) => [q.id, q])
|
|
1976
|
+
);
|
|
1906
1977
|
for (const q of BIRTH_METER_QUERIES) byId.set(q.id, q);
|
|
1907
|
-
const mergedQueries = [...byId.values()].sort(
|
|
1908
|
-
|
|
1978
|
+
const mergedQueries = [...byId.values()].sort(
|
|
1979
|
+
(a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0
|
|
1980
|
+
);
|
|
1981
|
+
return makeRequirable({
|
|
1982
|
+
...base,
|
|
1983
|
+
birthsChild: true,
|
|
1984
|
+
declaredQueryReads: mergedQueries
|
|
1985
|
+
});
|
|
1909
1986
|
},
|
|
1910
1987
|
resolves(field) {
|
|
1911
1988
|
if (typeof field !== "string" || field.length === 0) {
|
|
@@ -1921,7 +1998,9 @@ function makeRequirable(base) {
|
|
|
1921
1998
|
return makeRequirable({ ...base, resolvesField: field });
|
|
1922
1999
|
},
|
|
1923
2000
|
grants(relation) {
|
|
1924
|
-
const merged = [
|
|
2001
|
+
const merged = [
|
|
2002
|
+
.../* @__PURE__ */ new Set([...base.grantsRelation ?? [], relation])
|
|
2003
|
+
].sort();
|
|
1925
2004
|
return makeRequirable({ ...base, grantsRelation: merged });
|
|
1926
2005
|
}
|
|
1927
2006
|
};
|
|
@@ -2017,7 +2096,9 @@ var init_directive = __esm({
|
|
|
2017
2096
|
const actual = schema === void 0 ? void 0 : idOfMetaOf(schema);
|
|
2018
2097
|
if (actual !== this.aggregate.id) {
|
|
2019
2098
|
throw new Error(
|
|
2020
|
-
`directive('${this.id}').target('${field}') must name an idOf(${shortName(
|
|
2099
|
+
`directive('${this.id}').target('${field}') must name an idOf(${shortName(
|
|
2100
|
+
this.aggregate.id
|
|
2101
|
+
)}) payload field`
|
|
2021
2102
|
);
|
|
2022
2103
|
}
|
|
2023
2104
|
return new _DirectivePlanStep(
|
|
@@ -2164,10 +2245,7 @@ var init_directive = __esm({
|
|
|
2164
2245
|
this.aggregate,
|
|
2165
2246
|
this.payloadSchema,
|
|
2166
2247
|
this.createOnceIdField,
|
|
2167
|
-
[
|
|
2168
|
-
...this.preconditions.slice(0, -1),
|
|
2169
|
-
{ ...last, declassify: trimmed }
|
|
2170
|
-
],
|
|
2248
|
+
[...this.preconditions.slice(0, -1), { ...last, declassify: trimmed }],
|
|
2171
2249
|
this.targetField
|
|
2172
2250
|
);
|
|
2173
2251
|
}
|
|
@@ -2179,7 +2257,9 @@ var init_directive = __esm({
|
|
|
2179
2257
|
const field = this.targetField ?? (candidates.length === 1 ? candidates[0] : void 0);
|
|
2180
2258
|
if (this.targetField === void 0 && candidates.length > 1) {
|
|
2181
2259
|
throw new Error(
|
|
2182
|
-
`directive('${this.id}') has several idOf(${shortName(
|
|
2260
|
+
`directive('${this.id}') has several idOf(${shortName(
|
|
2261
|
+
this.aggregate.id
|
|
2262
|
+
)}) payload fields; select the mutation target with .target('field') before .plan(...)`
|
|
2183
2263
|
);
|
|
2184
2264
|
}
|
|
2185
2265
|
if (field !== void 0) {
|
|
@@ -4167,7 +4247,8 @@ function nmsInternalEncodeTypedProviderCall(operation, requestPrefix = "browser"
|
|
|
4167
4247
|
}));
|
|
4168
4248
|
const query3 = operation.case === "query" ? operation.value.query : void 0;
|
|
4169
4249
|
const custody = operation.case === "custody" ? operation.value.operation : void 0;
|
|
4170
|
-
const
|
|
4250
|
+
const offeredIntent = operation.case === "offer" ? operation.value.intent.case : void 0;
|
|
4251
|
+
const detail = query3?.case === "named" ? `query:named:${String(query3.value.operation)}` : query3?.case ? `query:${query3.case}` : custody?.case ? `custody:${custody.case}` : offeredIntent ? `offer:${offeredIntent}` : operation.case || "empty";
|
|
4171
4252
|
return { requestId, mode: operation.case || "empty", detail, bytes, encodeMs: monotonicMs() - started };
|
|
4172
4253
|
}
|
|
4173
4254
|
function nmsInternalDecodeTypedProviderResponse(bytes, requestId) {
|
|
@@ -4589,8 +4670,13 @@ function createWasmEnginePlane({ span } = {}) {
|
|
|
4589
4670
|
wsContents.set(name, new File(bytes));
|
|
4590
4671
|
},
|
|
4591
4672
|
readWsFile(name) {
|
|
4592
|
-
const
|
|
4593
|
-
|
|
4673
|
+
const parts = String(name).split("/").filter(Boolean);
|
|
4674
|
+
let node = wsDirNode ?? void 0;
|
|
4675
|
+
for (const part of parts) {
|
|
4676
|
+
if (!(node instanceof Directory)) return null;
|
|
4677
|
+
node = node.contents.get(part);
|
|
4678
|
+
}
|
|
4679
|
+
return node instanceof File ? node.data : null;
|
|
4594
4680
|
},
|
|
4595
4681
|
memBytes() {
|
|
4596
4682
|
return ex ? ex.memory.buffer.byteLength : 0;
|
|
@@ -4676,6 +4762,11 @@ function createWasmEnginePlane({ span } = {}) {
|
|
|
4676
4762
|
}
|
|
4677
4763
|
})
|
|
4678
4764
|
});
|
|
4765
|
+
if (response.outcome.case === "failure") {
|
|
4766
|
+
throw new Error(
|
|
4767
|
+
`${response.outcome.value.code}: ${response.outcome.value.message}`
|
|
4768
|
+
);
|
|
4769
|
+
}
|
|
4679
4770
|
if (response.outcome.case !== "custody" || response.outcome.value.operation.case !== "packDelta") return null;
|
|
4680
4771
|
const pack = response.outcome.value.operation.value.pack;
|
|
4681
4772
|
return pack.length ? pack : null;
|
|
@@ -5205,6 +5296,7 @@ function createModelLifecycleOfferRequest(target, args) {
|
|
|
5205
5296
|
rng: args.capturedPorts.rng,
|
|
5206
5297
|
deferProjection: args.deferProjection === true,
|
|
5207
5298
|
spans: args.spans === true,
|
|
5299
|
+
prepareOnly: args.prepareOnly === true,
|
|
5208
5300
|
sequence: BigInt(args.sequence),
|
|
5209
5301
|
clock: create2(CapturedClockSchema, {
|
|
5210
5302
|
physicalMillis: BigInt(args.capturedPorts.clock.physical),
|
|
@@ -6384,19 +6476,19 @@ var init_runtime_pb = __esm({
|
|
|
6384
6476
|
"use strict";
|
|
6385
6477
|
init_kernel_pb();
|
|
6386
6478
|
init_progress_pb();
|
|
6387
|
-
file_nomos_runtime_v2_runtime = /* @__PURE__ */ fileDesc4("Ch5ub21vcy9ydW50aW1lL3YyL3J1bnRpbWUucHJvdG8SEG5vbW9zLnJ1bnRpbWUudjIioAkKDlJ1bnRpbWVSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIyCgV0cmFjZRgDIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhY2VDb250ZXh0SAGIAQESOgoLa2VybmVsX2NhbGwYCiABKAsyIy5ub21vcy5ydW50aW1lLnYyLktlcm5lbENhbGxSZXF1ZXN0SAASMwoHY29ubmVjdBgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdFJlcXVlc3RIABJCCg9saXN0X3dvcmtzcGFjZXMYDCABKAsyJy5ub21vcy5ydW50aW1lLnYyLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdEgAEkgKEnNuYXBzaG90X3dvcmtzcGFjZRgNIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0SAASQAoOc3luY193b3Jrc3BhY2UYDiABKAsyJi5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXF1ZXN0SAASQQoPc3RhcnRfYXV0b19zeW5jGA8gASgLMiYubm9tb3MucnVudGltZS52Mi5TdGFydEF1dG9TeW5jUmVxdWVzdEgAEj8KDnN0b3BfYXV0b19zeW5jGBAgASgLMiUubm9tb3MucnVudGltZS52Mi5TdG9wQXV0b1N5bmNSZXF1ZXN0SAASLwoFd2F0Y2gYESABKAsyHi5ub21vcy5ydW50aW1lLnYyLldhdGNoUmVxdWVzdEgAEjMKB3Vud2F0Y2gYEiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlVud2F0Y2hSZXF1ZXN0SAASQAoOcHJlcGFyZV9kb21haW4YEyABKAsyJi5ub21vcy5ydW50aW1lLnYyLlByZXBhcmVEb21haW5SZXF1ZXN0SAASTQoVcmVzb2x2ZV9jdXN0b2R5X2JyZWFrGBQgASgLMiwubm9tb3MucnVudGltZS52Mi5SZXNvbHZlQ3VzdG9keUJyZWFrUmVxdWVzdEgAEjoKC2Nsb3NlX3JlYWxtGBUgASgLMiMubm9tb3MucnVudGltZS52Mi5DbG9zZVJlYWxtUmVxdWVzdEgAEjoKC2RlYWRfbGV0dGVyGBYgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVxdWVzdEgAEkAKDmhpc3RvcmljX3F1ZXJ5GBcgASgLMiYubm9tb3MucnVudGltZS52Mi5IaXN0b3JpY1F1ZXJ5UmVxdWVzdEgAEkIKD21vZGVsX2xpZmVjeWNsZRgYIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxMaWZlY3ljbGVSZXF1ZXN0SAASXQodZXN0YWJsaXNoX2FwcGxpY2F0aW9uX2N1c3RvZHkYGSABKAsyNC5ub21vcy5ydW50aW1lLnYyLkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3RIAEIJCgdjb21tYW5kQggKBl90cmFjZSJTChFLZXJuZWxDYWxsUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEi0KB3JlcXVlc3QYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuQ2FsbFJlcXVlc3Qi8QIKIkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZwYXJlbnQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJEg8KB3N1YmplY3QYBCABKAkSFQoNZGV2aWNlX3NlY3JldBgFIAEoDBIVCg1kZXZpY2VfcHVibGljGAYgASgMEhIKCmF1dGhfdG9rZW4YByABKAkSEAoIaWRfdG9rZW4YCCABKAkSFAoMdmVyaWZpZWRfdmlhGAkgASgJEg8KB2Jvcm5fYXQYCiABKAkSOwoTZW5yb2xsX2ZpcnN0X2RldmljZRgLIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsEj0KFWJpcnRoX3JlY2VpdmluZ19ncm91cBgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsEg8KB2NvbmZpcm0YDSABKAginwEKHUFwcGxpY2F0aW9uQ3VzdG9keUVzdGFibGlzaGVkEgwKBGhvbWUYASABKAkSFwoKY2hpbGRfaGVhZBgCIAEoCUgAiAEBEhAKCHZlcmlmaWVkGAMgASgIEh8KEnZlcmlmaWNhdGlvbl9lcnJvchgEIAEoCUgBiAEBQg0KC19jaGlsZF9oZWFkQhUKE192ZXJpZmljYXRpb25fZXJyb3IiZQoUSGlzdG9yaWNRdWVyeVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZtb21lbnQYAiABKAkSLAoFcXVlcnkYAyABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0IrUJCg9SdW50aW1lUmVzcG9uc2USGAoQcHJvdG9jb2xfdmVyc2lvbhgBIAEoDRISCgpyZXF1ZXN0X2lkGAIgASgEEjMKB2ZhaWx1cmUYCiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVGYWlsdXJlSAASNAoLa2VybmVsX2NhbGwYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuQ2FsbFJlc3BvbnNlSAASMAoJY29ubmVjdGVkGAwgASgLMhsubm9tb3MucnVudGltZS52Mi5Db25uZWN0ZWRIABI5Cg53b3Jrc3BhY2VfbGlzdBgNIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlTGlzdEgAEkEKEndvcmtzcGFjZV9zbmFwc2hvdBgOIAEoCzIjLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlU25hcHNob3RIABJBCg5zeW5jX3dvcmtzcGFjZRgPIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuU3luY1dvcmtzcGFjZVJlc3BvbnNlSAASPgoRYXV0b19zeW5jX3N0YXJ0ZWQYECABKAsyIS5ub21vcy5ydW50aW1lLnYyLkF1dG9TeW5jU3RhcnRlZEgAEj4KEWF1dG9fc3luY19zdG9wcGVkGBEgASgLMiEubm9tb3MucnVudGltZS52Mi5BdXRvU3luY1N0b3BwZWRIABI3Cg13YXRjaF9zdGFydGVkGBIgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaFN0YXJ0ZWRIABI3Cg13YXRjaF9zdG9wcGVkGBMgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaFN0b3BwZWRIABI7Cg9kb21haW5fcHJlcGFyZWQYFCABKAsyIC5ub21vcy5ydW50aW1lLnYyLkRvbWFpblByZXBhcmVkSAASSAoWY3VzdG9keV9icmVha19yZXNvbHZlZBgVIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrUmVzb2x2ZWRIABI1CgxyZWFsbV9jbG9zZWQYFiABKAsyHS5ub21vcy5ydW50aW1lLnYyLlJlYWxtQ2xvc2VkSAASMwoHYmxvY2tlZBgXIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUJsb2NrZWRIABJIChZyZW1vdGVfb2ZmZXJfYWRtaXNzaW9uGBggASgLMiYubm9tb3MucnVudGltZS52Mi5SZW1vdGVPZmZlckFkbWlzc2lvbkgAEjsKC2RlYWRfbGV0dGVyGBkgASgLMiQubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVzcG9uc2VIABJDCg9tb2RlbF9saWZlY3ljbGUYGiABKAsyKC5ub21vcy5ydW50aW1lLnYyLk1vZGVsTGlmZWN5Y2xlUmVzcG9uc2VIABJaCh9hcHBsaWNhdGlvbl9jdXN0b2R5X2VzdGFibGlzaGVkGBsgASgLMi8ubm9tb3MucnVudGltZS52Mi5BcHBsaWNhdGlvbkN1c3RvZHlFc3RhYmxpc2hlZEgAQgkKB291dGNvbWUinwEKDlJ1bnRpbWVCbG9ja2VkEkEKCXdvcmtzcGFjZRgBIAEoCzIsLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZWRIABJACghzaWJsaW5ncxgCIAEoCzIsLm5vbW9zLnJ1bnRpbWUudjIuU2libGluZ1Jlc2lkZW5jaWVzUmVxdWlyZWRIAEIICgZyZWFzb24iLwoaV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZWQSEQoJd29ya3NwYWNlGAEgASgJIlUKGFNpYmxpbmdSZXNpZGVuY3lSZXF1aXJlZBIRCgl3b3Jrc3BhY2UYASABKAkSEwoLc291cmNlX2hlYWQYAiABKAkSEQoJZm9sZF9yb290GAMgASgJIl0KGlNpYmxpbmdSZXNpZGVuY2llc1JlcXVpcmVkEj8KC3Jlc2lkZW5jaWVzGAEgAygLMioubm9tb3MucnVudGltZS52Mi5TaWJsaW5nUmVzaWRlbmN5UmVxdWlyZWQihgIKFFJlbW90ZU9mZmVyQWRtaXNzaW9uEhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRtYWluGAIgASgJEhgKC3NlYWxlZF9tYWluGAMgASgJSACIAQESLwoHdmVyZGljdBgEIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlEjMKDGJvcm5fY3VzdG9keRgFIAMoCzIdLm5vbW9zLnJ1bnRpbWUudjIuQm9ybkN1c3RvZHkSEwoLcmVzdWx0X3BhY2sYBiABKAwSGAoLcmVzdWx0X2Jhc2UYByABKAlIAYgBAUIOCgxfc2VhbGVkX21haW5CDgoMX3Jlc3VsdF9iYXNlIkoKC0Jvcm5DdXN0b2R5Ei0KBWNoaWxkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLkJvcm5Xb3Jrc3BhY2USDAoEcGFjaxgCIAEoDCL5AQoYQ3VzdG9keU9mZmVyQmF0Y2hSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRI3CgZpbmxpbmUYAyABKAsyJS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbmxpbmVPZmZlcnNIABJGChFzZXNzaW9uX2NhbmRpZGF0ZRgEIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keVNlc3Npb25DYW5kaWRhdGVIABIWCgliYXNlX2hlYWQYBSABKAlIAYgBAUIICgZzb3VyY2VCDAoKX2Jhc2VfaGVhZCJOChJDdXN0b2R5SW50ZW50T2ZmZXISDwoHc2Vzc2lvbhgBIAEoCRISCgpjb21taXRfb2lkGAIgASgJEhMKC2NoYW5nZV91c2RhGAMgASgMIksKE0N1c3RvZHlJbmxpbmVPZmZlcnMSNAoGb2ZmZXJzGAEgAygLMiQubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50T2ZmZXIiLAoXQ3VzdG9keVNlc3Npb25DYW5kaWRhdGUSEQoJcmVmZXJlbmNlGAEgASgJIvcBChlDdXN0b2R5T2ZmZXJCYXRjaFJlc3BvbnNlEhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRI3CglhZG1pc3Npb24YCiABKAsyIi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlBZG1pc3Npb25IABIzCgdmYWlsdXJlGAsgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAEjMKB2Jsb2NrZWQYDCABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVCbG9ja2VkSABCCQoHb3V0Y29tZSLuAgoQQ3VzdG9keUFkbWlzc2lvbhIMCgRtYWluGAEgASgJEhgKC3NlYWxlZF9tYWluGAIgASgJSACIAQESOwoIc2Vzc2lvbnMYAyADKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTZXNzaW9uQWRtaXNzaW9uEjUKDmJpcnRoX291dGNvbWVzGAQgAygLMh0ubm9tb3Mua2VybmVsLnYxLkJpcnRoT3V0Y29tZRIzCgxib3JuX2N1c3RvZHkYBSADKAsyHS5ub21vcy5ydW50aW1lLnYyLkJvcm5DdXN0b2R5EhMKC3Jlc3VsdF9wYWNrGAYgASgMEhgKC3Jlc3VsdF9iYXNlGAcgASgJSAGIAQESOgoHdGltaW5ncxgIIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUFkbWlzc2lvblRpbWluZ3NCDgoMX3NlYWxlZF9tYWluQg4KDF9yZXN1bHRfYmFzZSJlChdDdXN0b2R5U2Vzc2lvbkFkbWlzc2lvbhIPCgdzZXNzaW9uGAEgASgJEjkKB2ludGVudHMYAiADKAsyKC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRBZG1pc3Npb24ikAIKFkN1c3RvZHlJbnRlbnRBZG1pc3Npb24SEgoKY29tbWl0X29pZBgBIAEoCRIWCglpbnRlbnRfaWQYAiABKAlIAYgBARI7CghhZG1pdHRlZBgKIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudEFkbWl0dGVkSAASOQoHc2tpcHBlZBgLIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudFNraXBwZWRIABI5CgdyZWZ1c2VkGAwgASgLMiYubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50UmVmdXNlZEgAQgkKB291dGNvbWVCDAoKX2ludGVudF9pZCKQAQoVQ3VzdG9keUludGVudEFkbWl0dGVkEgwKBGhlYWQYASABKAkSMwoHY3JlYXRlZBgCIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5PZmZlckFnZ3JlZ2F0ZVJlZhI0CghhZmZlY3RlZBgDIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5PZmZlckFnZ3JlZ2F0ZVJlZiIvChRDdXN0b2R5SW50ZW50U2tpcHBlZBIXCg9hbHJlYWR5X29uX21haW4YASABKAgiWgoUQ3VzdG9keUludGVudFJlZnVzZWQSDwoHbWVzc2FnZRgBIAEoCRIVCg1kZWFkX2xldHRlcmVkGAIgASgIEhEKBGhpbnQYAyABKAlIAIgBAUIHCgVfaGludCLtAQoXQ3VzdG9keUFkbWlzc2lvblRpbWluZ3MSFAoMdG90YWxfbWlsbGlzGAEgASgBEhMKC3NjYW5fbWlsbGlzGAIgASgBEhQKDGZldGNoX21pbGxpcxgDIAEoARITCgtzZWFsX21pbGxpcxgEIAEoARIYChBnYXRlX2ZvbGRfbWlsbGlzGAUgASgBEhQKDGludGVudF9jb3VudBgGIAEoDRIVCg1zZXNzaW9uX2NvdW50GAcgASgNEjUKBXNwYW5zGAggAygLMiYubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QWRtaXNzaW9uU3BhbiKXAQoUQ3VzdG9keUFkbWlzc2lvblNwYW4SCgoCaWQYASABKAkSDQoFdHJhY2sYAiABKAkSDAoEbmFtZRgDIAEoCRIMCgRraW5kGAQgASgJEg0KBWRlcHRoGAUgASgNEhsKE3N0YXJ0ZWRfdW5peF9taWxsaXMYBiABKAESHAoUZmluaXNoZWRfdW5peF9taWxsaXMYByABKAEiQgoMVHJhY2VDb250ZXh0EhAKCHRyYWNlX2lkGAEgASgMEg8KB3NwYW5faWQYAiABKAwSDwoHc2FtcGxlZBgDIAEoCCLpAQoOUnVudGltZUZhaWx1cmUSDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEhEKCWNvbXBvbmVudBgDIAEoCRIWCgl3b3Jrc3BhY2UYBCABKAlIAIgBARITCgZkb21haW4YBSABKAlIAYgBARIWCglkaXJlY3RpdmUYBiABKAlIAogBARI5CgphdHRyaWJ1dGVzGAcgAygLMiUubm9tb3MucnVudGltZS52Mi5EaWFnbm9zdGljQXR0cmlidXRlQgwKCl93b3Jrc3BhY2VCCQoHX2RvbWFpbkIMCgpfZGlyZWN0aXZlIqUBChNEaWFnbm9zdGljQXR0cmlidXRlEgwKBG5hbWUYASABKAkSFgoMc3RyaW5nX3ZhbHVlGAIgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgDIAEoEkgAEhYKDGRvdWJsZV92YWx1ZRgEIAEoAUgAEhcKDWJvb2xlYW5fdmFsdWUYBSABKAhIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAQgcKBXZhbHVlIs0CCg5Db25uZWN0UmVxdWVzdBIRCgl3b3Jrc3BhY2UYASABKAkSEQoJY2xpZW50X2lkGAIgASgJEhQKB3Nlc3Npb24YAyABKAlIAIgBARISCgVjbG91ZBgEIAEoCUgBiAEBEhIKCmF1dGhfdG9rZW4YBSABKAwSFQoNYXV0aG9yX3NlY3JldBgGIAEoDBIiChptYXhpbXVtX21vdW50ZWRfd29ya3NwYWNlcxgHIAEoDRIUCgxhbGxvd191bmJvcm4YCCABKAgSDwoHcmVjb3ZlchgJIAEoCBJCChRjdXN0b2R5X2JyZWFrX3BvbGljeRgKIAEoDjIkLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrUG9saWN5EhsKE2hhc19yZXN0b3JlX2N1c3RvZHkYCyABKAhCCgoIX3Nlc3Npb25CCAoGX2Nsb3VkIosBCglDb25uZWN0ZWQSEQoJd29ya3NwYWNlGAEgASgJEg8KB3Nlc3Npb24YAiABKAkSEwoLY2xvdWRfYm91bmQYAyABKAgSOAoIcmVjb3ZlcnkYBCABKAsyIS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlSZWNvdmVyeUgAiAEBQgsKCV9yZWNvdmVyeSJbCg9DdXN0b2R5UmVjb3ZlcnkSFQoNcHJldmlvdXNfaGVhZBgBIAEoCRIWCg5yZWNvdmVyZWRfaGVhZBgCIAEoCRIZChFyZWNvdmVyZWRfaW50ZW50cxgDIAEoBCIXChVMaXN0V29ya3NwYWNlc1JlcXVlc3QirQEKEFdvcmtzcGFjZVN1bW1hcnkSDwoHc2Vzc2lvbhgBIAEoCRIRCgl3b3Jrc3BhY2UYAiABKAkSNwoJcmVzaWRlbmN5GAMgASgOMiQubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VSZXNpZGVuY3kSPAoMc3luY19wb3N0dXJlGAQgASgOMiYubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTeW5jUG9zdHVyZSJHCg1Xb3Jrc3BhY2VMaXN0EjYKCndvcmtzcGFjZXMYASADKAsyIi5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVN1bW1hcnkiTQoYU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFAoHaWZfaGVhZBgCIAEoCUgAiAEBQgoKCF9pZl9oZWFkIlwKEVdvcmtzcGFjZVNuYXBzaG90EhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRoZWFkGAIgASgJEhEKCXVuY2hhbmdlZBgDIAEoCBITCgtoYXNfY3VzdG9keRgEIAEoCCI2ChRTeW5jV29ya3NwYWNlUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEg0KBWFkbWl0GAIgASgIIrwFChVTeW5jV29ya3NwYWNlUmVzcG9uc2USEQoJd29ya3NwYWNlGAEgASgJEhoKDXByZXZpb3VzX2hlYWQYAiABKAlIAIgBARIZCgxjdXJyZW50X2hlYWQYAyABKAlIAYgBARIQCghhZG1pdHRlZBgEIAEoBBIPCgdyZWZ1c2VkGAUgASgEEhAKCGRlZmVycmVkGAYgASgEEhIKCmxvY2FsX29ubHkYByABKAgSDgoGcHVsbGVkGAggASgIEhAKCGRpdmVyZ2VkGAkgASgIEhoKEnJlY29ubmVjdF9yZXF1aXJlZBgKIAEoCBITCgtzdGlsbF9haGVhZBgLIAEoCBIPCgdvZmZsaW5lGAwgASgIEhMKC3B1c2hfZmFpbGVkGA0gASgIEh0KFWRpcmVjdF9vZmZlcl9kZWZlcnJlZBgOIAEoCBI1Cg5iaXJ0aF9vdXRjb21lcxgPIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5CaXJ0aE91dGNvbWUSGwoTYWRtaXR0ZWRfaW50ZW50X2lkcxgQIAMoCRIcChRjb252ZXJnZWRfaW50ZW50X2lkcxgRIAMoCRJCCgpwdXNoX2Vycm9yGBIgASgLMikubm9tb3MucnVudGltZS52Mi5SdW50aW1lVHJhbnNwb3J0RmFpbHVyZUgCiAEBEkcKD2Rpc2NvdmVyeV9lcnJvchgTIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVRyYW5zcG9ydEZhaWx1cmVIA4gBARIzCgd0aW1pbmdzGBQgASgLMiIubm9tb3MucnVudGltZS52Mi5TeW5jUGhhc2VUaW1pbmdzQhAKDl9wcmV2aW91c19oZWFkQg8KDV9jdXJyZW50X2hlYWRCDQoLX3B1c2hfZXJyb3JCEgoQX2Rpc2NvdmVyeV9lcnJvciJdChdSdW50aW1lVHJhbnNwb3J0RmFpbHVyZRIQCghlbmRwb2ludBgBIAEoCRIOCgZzdGF0dXMYAiABKBESDwoHcmVmdXNlZBgDIAEoCBIPCgdtZXNzYWdlGAQgASgJIrEBChBTeW5jUGhhc2VUaW1pbmdzEhMKC3B1c2hfbWlsbGlzGAEgASgBEhQKDGFkbWl0X21pbGxpcxgCIAEoARIXCg9wcmVmZXRjaF9taWxsaXMYAyABKAESFwoPY29udmVyZ2VfbWlsbGlzGAQgASgBEhIKCnB1c2hfYnl0ZXMYBSABKAQSFQoNc2VydmVyX21pbGxpcxgGIAEoARIVCg1vZmZlcl9pbl9wdXNoGAcgASgIIt8BChRTdGFydEF1dG9TeW5jUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhwKD2RlYm91bmNlX21pbGxpcxgCIAEoDUgAiAEBEhwKD2ZhbGxiYWNrX21pbGxpcxgDIAEoDUgBiAEBEhoKDXNpZ25hbF9taWxsaXMYBCABKA1IAogBARIWCglzaWduYWxfaWQYBSABKAlIA4gBAUISChBfZGVib3VuY2VfbWlsbGlzQhIKEF9mYWxsYmFja19taWxsaXNCEAoOX3NpZ25hbF9taWxsaXNCDAoKX3NpZ25hbF9pZCIiCg9BdXRvU3luY1N0YXJ0ZWQSDwoHc2Vzc2lvbhgBIAEoCSImChNTdG9wQXV0b1N5bmNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkiIgoPQXV0b1N5bmNTdG9wcGVkEg8KB3Nlc3Npb24YASABKAkiqgEKDFdhdGNoUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhcKD3N1YnNjcmlwdGlvbl9pZBgCIAEoCRIpCgRraW5kGAMgASgOMhsubm9tb3MucnVudGltZS52Mi5XYXRjaEtpbmQSLAoFcXVlcnkYBCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0EhcKD2ludGVydmFsX21pbGxpcxgFIAEoDSInCgxXYXRjaFN0YXJ0ZWQSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIikKDlVud2F0Y2hSZXF1ZXN0EhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCSInCgxXYXRjaFN0b3BwZWQSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJInUKFFByZXBhcmVEb21haW5SZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGZG9tYWluGAIgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAMgASgJEhYKCWRpcmVjdGl2ZRgEIAEoCUgAiAEBQgwKCl9kaXJlY3RpdmUiUgoORG9tYWluUHJlcGFyZWQSDgoGZG9tYWluGAEgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAIgASgJEhgKEGFscmVhZHlfcmVzaWRlbnQYAyABKAgi9gEKFU1vZGVsTGlmZWN5Y2xlUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEj0KBXN0YWdlGAogASgLMiwubm9tb3MucnVudGltZS52Mi5TdGFnZUdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAEj0KBWFkb3B0GAsgASgLMiwubm9tb3MucnVudGltZS52Mi5BZG9wdEdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAEkEKB3Jlc3RvcmUYDCABKAsyLi5ub21vcy5ydW50aW1lLnYyLlJlc3RvcmVHZW5lcmF0ZWRNb2RlbFJlcXVlc3RIAEILCglvcGVyYXRpb24ihgEKGlN0YWdlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIWCg5jYW5kaWRhdGVfaGFzaBgCIAEoCRIQCghsYXdfdXNkehgDIAEoDBIbCg5zb3VyY2Vfc2Vzc2lvbhgEIAEoCUgAiAEBQhEKD19zb3VyY2Vfc2Vzc2lvbiJ6ChpBZG9wdEdlbmVyYXRlZE1vZGVsUmVxdWVzdBIOCgZkb21haW4YASABKAkSFgoOY2FuZGlkYXRlX2hhc2gYAiABKAkSHgoRYWNjZXB0YW5jZV9yZWFzb24YAyABKAlIAIgBAUIUChJfYWNjZXB0YW5jZV9yZWFzb24iegocUmVzdG9yZUdlbmVyYXRlZE1vZGVsUmVxdWVzdBIOCgZkb21haW4YASABKAkSFAoMY3VycmVudF9oYXNoGAIgASgJEh4KEWFjY2VwdGFuY2VfcmVhc29uGAMgASgJSACIAQFCFAoSX2FjY2VwdGFuY2VfcmVhc29uIpMBCg9Nb2RlbERpZmZlcmVuY2USMwoEa2luZBgBIAEoDjIlLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxEaWZmZXJlbmNlS2luZBIRCgRhcmVhGAIgASgJSACIAQESEwoGYWN0aW9uGAMgASgJSAGIAQESDwoHc3VtbWFyeRgEIAEoCUIHCgVfYXJlYUIJCgdfYWN0aW9uIqUBCgtNb2RlbFJldmlldxIXCg9jaGVja2VkX2FjdGlvbnMYASABKAQSGQoRY2FuZGlkYXRlX2FjdGlvbnMYAiABKAQSGQoMc2FtZV9vdXRjb21lGAMgASgISACIAQESNgoLZGlmZmVyZW5jZXMYBCADKAsyIS5ub21vcy5ydW50aW1lLnYyLk1vZGVsRGlmZmVyZW5jZUIPCg1fc2FtZV9vdXRjb21lIoUCChZNb2RlbExpZmVjeWNsZVJlc3BvbnNlEhAKCGFjY2VwdGVkGAEgASgIEjQKBXN0YWdlGAIgASgOMiUubm9tb3MucnVudGltZS52Mi5Nb2RlbExpZmVjeWNsZVN0YWdlEhQKB21lc3NhZ2UYAyABKAlIAIgBARIRCgRoZWFkGAQgASgJSAGIAQESFwoKcmVjZWlwdF9pZBgFIAEoCUgCiAEBEjIKBnJldmlldxgGIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxSZXZpZXdIA4gBAUIKCghfbWVzc2FnZUIHCgVfaGVhZEINCgtfcmVjZWlwdF9pZEIJCgdfcmV2aWV3ImcKGlJlc29sdmVDdXN0b2R5QnJlYWtSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSOAoIZGVjaXNpb24YAiABKA4yJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha0RlY2lzaW9uImEKFEN1c3RvZHlCcmVha1Jlc29sdmVkEg8KB3Nlc3Npb24YASABKAkSOAoIZGVjaXNpb24YAiABKA4yJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha0RlY2lzaW9uIhMKEUNsb3NlUmVhbG1SZXF1ZXN0Ig0KC1JlYWxtQ2xvc2VkIuUBChFEZWFkTGV0dGVyUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEjgKBGxpc3QYCiABKAsyKC5ub21vcy5ydW50aW1lLnYyLkxpc3REZWFkTGV0dGVyc1JlcXVlc3RIABI5CgVyZXRyeRgLIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuUmV0cnlEZWFkTGV0dGVyUmVxdWVzdEgAEj0KB2Rpc2NhcmQYDCABKAsyKi5ub21vcy5ydW50aW1lLnYyLkRpc2NhcmREZWFkTGV0dGVyUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiIYChZMaXN0RGVhZExldHRlcnNSZXF1ZXN0IisKFlJldHJ5RGVhZExldHRlclJlcXVlc3QSEQoJaW50ZW50X2lkGAEgASgJIi0KGERpc2NhcmREZWFkTGV0dGVyUmVxdWVzdBIRCglpbnRlbnRfaWQYASABKAkivQEKEkRlYWRMZXR0ZXJSZXNwb25zZRIwCgRsaXN0GAogASgLMiAubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyTGlzdEgAEjIKBXJldHJ5GAsgASgLMiEubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmV0cnlIABI2CgdkaXNjYXJkGAwgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyRGlzY2FyZEgAQgkKB291dGNvbWUiRAoORGVhZExldHRlckxpc3QSMgoHZW50cmllcxgBIAMoCzIhLm5vbW9zLnJ1bnRpbWUudjIuRGVhZExldHRlckVudHJ5IrkBCg9EZWFkTGV0dGVyRW50cnkSDwoCaWQYASABKAlIAIgBARISCgpjb21taXRfb2lkGAIgASgJEg4KBnNvdXJjZRgDIAEoCRIPCgdtZXNzYWdlGAQgASgJEhMKBmRvbWFpbhgFIAEoCUgBiAEBEhYKCWRpcmVjdGl2ZRgGIAEoCUgCiAEBEhMKC3JlY29yZGVkX2F0GAcgASgJQgUKA19pZEIJCgdfZG9tYWluQgwKCl9kaXJlY3RpdmUieQoPRGVhZExldHRlclJldHJ5Eg8KB3JldHJpZWQYASABKAgSEQoEaGVhZBgCIAEoCUgAiAEBEhcKD2FscmVhZHlfb25fbWFpbhgDIAEoCBIUCgdtZXNzYWdlGAQgASgJSAGIAQFCBwoFX2hlYWRCCgoIX21lc3NhZ2UiJAoRRGVhZExldHRlckRpc2NhcmQSDwoHcmVtb3ZlZBgBIAEoBCLNBQoMUnVudGltZUV2ZW50EhAKCHNlcXVlbmNlGAEgASgEEhQKB3Nlc3Npb24YAiABKAlIAYgBARIvCgVyZWFkeRgKIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlYWR5SAASNwoNd2F0Y2hfY2hhbmdlZBgLIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hDaGFuZ2VkSAASOQoOc3luY19jb21wbGV0ZWQYDCABKAsyHy5ub21vcy5ydW50aW1lLnYyLlN5bmNDb21wbGV0ZWRIABI1CgxsaW5rX2NoYW5nZWQYDSABKAsyHS5ub21vcy5ydW50aW1lLnYyLkxpbmtDaGFuZ2VkSAASOQoOc2lnbmFsX2NoYW5nZWQYDiABKAsyHy5ub21vcy5ydW50aW1lLnYyLlNpZ25hbENoYW5nZWRIABI7Cg9jdXN0b2R5X2NoYW5nZWQYDyABKAsyIC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlDaGFuZ2VkSAASQgoTbG9jYWxfd29ya19yZWplY3RlZBgQIAEoCzIjLm5vbW9zLnJ1bnRpbWUudjIuTG9jYWxXb3JrUmVqZWN0ZWRIABIzCgtsYXdfY2hhbmdlZBgRIAEoCzIcLm5vbW9zLnJ1bnRpbWUudjIuTGF3Q2hhbmdlZEgAEkMKD2tlcm5lbF9wcm9ncmVzcxgSIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuS2VybmVsUHJvZ3Jlc3NPYnNlcnZlZEgAEi0KBHNwYW4YEyABKAsyHS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVTcGFuSAASPwoRdHJhbnNmZXJfcHJvZ3Jlc3MYFCABKAsyIi5ub21vcy5ydW50aW1lLnYyLlRyYW5zZmVyUHJvZ3Jlc3NIAEIHCgVldmVudEIKCghfc2Vzc2lvbiI+CgxSdW50aW1lUmVhZHkSFwoPcnVudGltZV92ZXJzaW9uGAEgASgJEhUKDWtlcm5lbF9zaGEyNTYYAiABKAwigAEKDFdhdGNoQ2hhbmdlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkSEwoLcmVzdWx0X3VzZGEYAiABKAwSNgoHZmFpbHVyZRgDIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIAIgBAUIKCghfZmFpbHVyZSKcAQoNU3luY0NvbXBsZXRlZBIOCgZyZWFzb24YASABKAkSNwoGcmVzdWx0GAIgASgLMicubm9tb3MucnVudGltZS52Mi5TeW5jV29ya3NwYWNlUmVzcG9uc2USNgoHZmFpbHVyZRgDIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIAIgBAUIKCghfZmFpbHVyZSI7CgtMaW5rQ2hhbmdlZBIsCgZzdGF0dXMYASABKA4yHC5ub21vcy5ydW50aW1lLnYyLkxpbmtTdGF0dXMiOAoNU2lnbmFsQ2hhbmdlZBIOCgZkb21haW4YASABKAkSFwoPcHJvamVjdGlvbl91c2RhGAIgASgMIvQBCg5DdXN0b2R5Q2hhbmdlZBIxCgRraW5kGAEgASgOMiMubm9tb3MucnVudGltZS52Mi5DdXN0b2R5Q2hhbmdlS2luZBI1Cg1jdXN0b2R5X2JyZWFrGAIgASgLMh4ubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QnJlYWsSFgoJb3BlcmF0aW9uGAMgASgJSACIAQESFQoIcmVjbG9uZWQYBCABKAhIAYgBARIbCg5wYXJrZWRfaW50ZW50cxgFIAEoBEgCiAEBQgwKCl9vcGVyYXRpb25CCwoJX3JlY2xvbmVkQhEKD19wYXJrZWRfaW50ZW50cyLhAQoRTG9jYWxXb3JrUmVqZWN0ZWQSEQoJd29ya3NwYWNlGAEgASgJEjYKB3JlZnVzZWQYAiADKAsyJS5ub21vcy5ydW50aW1lLnYyLlJlamVjdGVkTG9jYWxJbnRlbnQSDgoGcGFya2VkGAMgASgIEhUKCHJlc2V0X3RvGAQgASgJSACIAQESEQoJcmV0cnlhYmxlGAUgASgIEjoKBnNvdXJjZRgGIAEoDjIqLm5vbW9zLnJ1bnRpbWUudjIuTG9jYWxXb3JrUmVqZWN0aW9uU291cmNlQgsKCV9yZXNldF90byJjChNDdXN0b2R5U3VwZXJzZXNzaW9uEhoKDXN1cGVyc2VkZWRfYXQYASABKAlIAIgBARITCgZyZWFzb24YAiABKAlIAYgBAUIQCg5fc3VwZXJzZWRlZF9hdEIJCgdfcmVhc29uIrgCCgxDdXN0b2R5QnJlYWsSMAoEa2luZBgBIAEoDjIiLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrS2luZBIVCg1sb2NhbF9nZW5lc2lzGAIgASgJEhYKDnJlbW90ZV9nZW5lc2lzGAMgASgJEhoKEnJlbW90ZV9pbmNhcm5hdGlvbhgEIAEoCRJACgxzdXBlcnNlc3Npb24YBSABKAsyJS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTdXBlcnNlc3Npb25IAIgBARIaChJsb2NhbF9vbmx5X2ludGVudHMYBiABKAQSIgoVbGFzdF9zeW5jZWRfYXRfbWlsbGlzGAcgASgESAGIAQFCDwoNX3N1cGVyc2Vzc2lvbkIYChZfbGFzdF9zeW5jZWRfYXRfbWlsbGlzIs0BChNSZWplY3RlZExvY2FsSW50ZW50EhYKCWludGVudF9pZBgBIAEoCUgAiAEBEhcKCmNvbW1pdF9vaWQYAiABKAlIAYgBARITCgZkb21haW4YAyABKAlIAogBARIWCglkaXJlY3RpdmUYBCABKAlIA4gBARIPCgdtZXNzYWdlGAUgASgJEhEKCXJldHJ5YWJsZRgGIAEoCEIMCgpfaW50ZW50X2lkQg0KC19jb21taXRfb2lkQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSJQCgpMYXdDaGFuZ2VkEg4KBmRvbWFpbhgBIAEoCRIWCg5wYWNrYWdlX3NoYTI1NhgCIAEoCRIaChJjb21wYXRpYmlsaXR5X3VzZGEYAyABKAwi3QEKC1J1bnRpbWVTcGFuEhAKCHRyYWNlX2lkGAEgASgMEg8KB3NwYW5faWQYAiABKAwSGwoOcGFyZW50X3NwYW5faWQYAyABKAxIAIgBARIMCgRuYW1lGAQgASgJEhoKEnN0YXJ0ZWRfdW5peF9uYW5vcxgFIAEoBBIWCg5kdXJhdGlvbl9uYW5vcxgGIAEoBBI5CgphdHRyaWJ1dGVzGAcgAygLMiUubm9tb3MucnVudGltZS52Mi5EaWFnbm9zdGljQXR0cmlidXRlQhEKD19wYXJlbnRfc3Bhbl9pZCLqAQoWS2VybmVsUHJvZ3Jlc3NPYnNlcnZlZBI5CghzbmFwc2hvdBgBIAEoCzInLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxQcm9ncmVzc1NuYXBzaG90EiQKHGhvc3Rfb2JzZXJ2ZWRfZWxhcHNlZF9taWNyb3MYAiABKAQSKgoiaG9zdF9vYnNlcnZlZF9waGFzZV9lbGFwc2VkX21pY3JvcxgDIAEoBBIeChZwcm9jZXNzX3Jlc2lkZW50X2J5dGVzGAQgASgEEiMKG3Byb2Nlc3NfcGVha19yZXNpZGVudF9ieXRlcxgFIAEoBCKCAQoQVHJhbnNmZXJQcm9ncmVzcxIWCg5yZWNlaXZlZF9ieXRlcxgBIAEoBBIYCgt0b3RhbF9ieXRlcxgCIAEoBEgAiAEBEiwKBGtpbmQYAyABKA4yHi5ub21vcy5ydW50aW1lLnYyLlRyYW5zZmVyS2luZEIOCgxfdG90YWxfYnl0ZXMqmQEKEkN1c3RvZHlCcmVha1BvbGljeRIkCiBDVVNUT0RZX0JSRUFLX1BPTElDWV9VTlNQRUNJRklFRBAAEhwKGENVU1RPRFlfQlJFQUtfUE9MSUNZX0FTSxABEh4KGkNVU1RPRFlfQlJFQUtfUE9MSUNZX0FET1BUEAISHwobQ1VTVE9EWV9CUkVBS19QT0xJQ1lfUkVKRUNUEAMqoAEKEldvcmtzcGFjZVJlc2lkZW5jeRIjCh9XT1JLU1BBQ0VfUkVTSURFTkNZX1VOU1BFQ0lGSUVEEAASHwobV09SS1NQQUNFX1JFU0lERU5DWV9NT1VOVEVEEAESHgoaV09SS1NQQUNFX1JFU0lERU5DWV9QQVJLRUQQAhIkCiBXT1JLU1BBQ0VfUkVTSURFTkNZX0NVU1RPRFlfT05MWRADKo0BChRXb3Jrc3BhY2VTeW5jUG9zdHVyZRImCiJXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX1VOU1BFQ0lGSUVEEAASJQohV09SS1NQQUNFX1NZTkNfUE9TVFVSRV9MT0NBTF9PTkxZEAESJgoiV09SS1NQQUNFX1NZTkNfUE9TVFVSRV9DTE9VRF9CT1VORBACKqgBCglXYXRjaEtpbmQSGgoWV0FUQ0hfS0lORF9VTlNQRUNJRklFRBAAEhQKEFdBVENIX0tJTkRfUVVFUlkQARIUChBXQVRDSF9LSU5EX0JZX0lEEAISFgoSV0FUQ0hfS0lORF9TUEFUSUFMEAMSFwoTV0FUQ0hfS0lORF9BQ1RJVklUWRAEIgQIBRAFKhxXQVRDSF9LSU5EX1BFTkRJTkdfQ09ORkxJQ1RTKqQDChNNb2RlbExpZmVjeWNsZVN0YWdlEiUKIU1PREVMX0xJRkVDWUNMRV9TVEFHRV9VTlNQRUNJRklFRBAAEisKJ01PREVMX0xJRkVDWUNMRV9TVEFHRV9JREVOVElUWV9SRVFVSVJFRBABEioKJk1PREVMX0xJRkVDWUNMRV9TVEFHRV9TVEFHSU5HX1JFUVVJUkVEEAISIwofTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BSRUZMSUdIVBADEi0KKU1PREVMX0xJRkVDWUNMRV9TVEFHRV9BQ0NFUFRBTkNFX1JFUVVJUkVEEAQSIwofTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FETUlTU0lPThAFEiEKHU1PREVMX0xJRkVDWUNMRV9TVEFHRV9QRU5ESU5HEAYSIgoeTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BST01PVEVEEAcSIgoeTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1JFU1RPUkVEEAgSKQolTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FMUkVBRFlfQ1VSUkVOVBAJKqQBChNNb2RlbERpZmZlcmVuY2VLaW5kEiUKIU1PREVMX0RJRkZFUkVOQ0VfS0lORF9VTlNQRUNJRklFRBAAEh8KG01PREVMX0RJRkZFUkVOQ0VfS0lORF9SVUxFUxABEiEKHU1PREVMX0RJRkZFUkVOQ0VfS0lORF9PVVRDT01FEAISIgoeTU9ERUxfRElGRkVSRU5DRV9LSU5EX0VWSURFTkNFEAMqgwEKFEN1c3RvZHlCcmVha0RlY2lzaW9uEiYKIkNVU1RPRFlfQlJFQUtfREVDSVNJT05fVU5TUEVDSUZJRUQQABIgChxDVVNUT0RZX0JSRUFLX0RFQ0lTSU9OX0FET1BUEAESIQodQ1VTVE9EWV9CUkVBS19ERUNJU0lPTl9SRUpFQ1QQAipXCgpMaW5rU3RhdHVzEhsKF0xJTktfU1RBVFVTX1VOU1BFQ0lGSUVEEAASFAoQTElOS19TVEFUVVNfT1BFThABEhYKEkxJTktfU1RBVFVTX0NMT1NFRBACKuIBChFDdXN0b2R5Q2hhbmdlS2luZBIjCh9DVVNUT0RZX0NIQU5HRV9LSU5EX1VOU1BFQ0lGSUVEEAASIAocQ1VTVE9EWV9DSEFOR0VfS0lORF9ERVRFQ1RFRBABEiAKHENVU1RPRFlfQ0hBTkdFX0tJTkRfUkVKRUNURUQQAhIgChxDVVNUT0RZX0NIQU5HRV9LSU5EX0FET1BUSU5HEAMSJQohQ1VTVE9EWV9DSEFOR0VfS0lORF9BRE9QVF9SRUZVU0VEEAQSGwoXQ1VTVE9EWV9DSEFOR0VfS0lORF9BU0sQBSp6ChBDdXN0b2R5QnJlYWtLaW5kEiIKHkNVU1RPRFlfQlJFQUtfS0lORF9VTlNQRUNJRklFRBAAEiEKHUNVU1RPRFlfQlJFQUtfS0lORF9TVVBFUlNFREVEEAESHwobQ1VTVE9EWV9CUkVBS19LSU5EX0RJVkVSR0VEEAIqmAEKGExvY2FsV29ya1JlamVjdGlvblNvdXJjZRIrCidMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfVU5TUEVDSUZJRUQQABIpCiVMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfQURNSVNTSU9OEAESJAogTE9DQUxfV09SS19SRUpFQ1RJT05fU09VUkNFX1NZTkMQAip2CgxUcmFuc2ZlcktpbmQSHQoZVFJBTlNGRVJfS0lORF9VTlNQRUNJRklFRBAAEhcKE1RSQU5TRkVSX0tJTkRfREVMVEEQARIWChJUUkFOU0ZFUl9LSU5EX0ZVTEwQAhIWChJUUkFOU0ZFUl9LSU5EX1BVU0gQAzJkChNOb21vc1J1bnRpbWVTZXJ2aWNlEk0KBkludm9rZRIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlcXVlc3QaIS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVSZXNwb25zZWIGcHJvdG8z", [file_nomos_kernel_v1_kernel, file_nomos_kernel_v1_progress]);
|
|
6479
|
+
file_nomos_runtime_v2_runtime = /* @__PURE__ */ fileDesc4("Ch5ub21vcy9ydW50aW1lL3YyL3J1bnRpbWUucHJvdG8SEG5vbW9zLnJ1bnRpbWUudjIitwoKDlJ1bnRpbWVSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIyCgV0cmFjZRgDIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhY2VDb250ZXh0SAGIAQESOgoLa2VybmVsX2NhbGwYCiABKAsyIy5ub21vcy5ydW50aW1lLnYyLktlcm5lbENhbGxSZXF1ZXN0SAASMwoHY29ubmVjdBgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdFJlcXVlc3RIABJCCg9saXN0X3dvcmtzcGFjZXMYDCABKAsyJy5ub21vcy5ydW50aW1lLnYyLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdEgAEkgKEnNuYXBzaG90X3dvcmtzcGFjZRgNIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0SAASQAoOc3luY193b3Jrc3BhY2UYDiABKAsyJi5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXF1ZXN0SAASQQoPc3RhcnRfYXV0b19zeW5jGA8gASgLMiYubm9tb3MucnVudGltZS52Mi5TdGFydEF1dG9TeW5jUmVxdWVzdEgAEj8KDnN0b3BfYXV0b19zeW5jGBAgASgLMiUubm9tb3MucnVudGltZS52Mi5TdG9wQXV0b1N5bmNSZXF1ZXN0SAASLwoFd2F0Y2gYESABKAsyHi5ub21vcy5ydW50aW1lLnYyLldhdGNoUmVxdWVzdEgAEjMKB3Vud2F0Y2gYEiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlVud2F0Y2hSZXF1ZXN0SAASQAoOcHJlcGFyZV9kb21haW4YEyABKAsyJi5ub21vcy5ydW50aW1lLnYyLlByZXBhcmVEb21haW5SZXF1ZXN0SAASTQoVcmVzb2x2ZV9jdXN0b2R5X2JyZWFrGBQgASgLMiwubm9tb3MucnVudGltZS52Mi5SZXNvbHZlQ3VzdG9keUJyZWFrUmVxdWVzdEgAEjoKC2Nsb3NlX3JlYWxtGBUgASgLMiMubm9tb3MucnVudGltZS52Mi5DbG9zZVJlYWxtUmVxdWVzdEgAEjoKC2RlYWRfbGV0dGVyGBYgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVxdWVzdEgAEkAKDmhpc3RvcmljX3F1ZXJ5GBcgASgLMiYubm9tb3MucnVudGltZS52Mi5IaXN0b3JpY1F1ZXJ5UmVxdWVzdEgAEkIKD21vZGVsX2xpZmVjeWNsZRgYIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxMaWZlY3ljbGVSZXF1ZXN0SAASXQodZXN0YWJsaXNoX2FwcGxpY2F0aW9uX2N1c3RvZHkYGSABKAsyNC5ub21vcy5ydW50aW1lLnYyLkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3RIABJEChB3b3Jrc3BhY2Vfc3RhdHVzGBogASgLMigubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdGF0dXNSZXF1ZXN0SAASTwoWcmVtb3RlX2dlbmVyYXRlZF9vZmZlchgbIAEoCzItLm5vbW9zLnJ1bnRpbWUudjIuUmVtb3RlR2VuZXJhdGVkT2ZmZXJSZXF1ZXN0SABCCQoHY29tbWFuZEIICgZfdHJhY2UiUwoRS2VybmVsQ2FsbFJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRItCgdyZXF1ZXN0GAIgASgLMhwubm9tb3Mua2VybmVsLnYxLkNhbGxSZXF1ZXN0IvECCiJFc3RhYmxpc2hBcHBsaWNhdGlvbkN1c3RvZHlSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGcGFyZW50GAIgASgJEhEKCXByaW5jaXBhbBgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEhUKDWRldmljZV9zZWNyZXQYBSABKAwSFQoNZGV2aWNlX3B1YmxpYxgGIAEoDBISCgphdXRoX3Rva2VuGAcgASgJEhAKCGlkX3Rva2VuGAggASgJEhQKDHZlcmlmaWVkX3ZpYRgJIAEoCRIPCgdib3JuX2F0GAogASgJEjsKE2Vucm9sbF9maXJzdF9kZXZpY2UYCyABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbBI9ChViaXJ0aF9yZWNlaXZpbmdfZ3JvdXAYDCABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbBIPCgdjb25maXJtGA0gASgIIp8BCh1BcHBsaWNhdGlvbkN1c3RvZHlFc3RhYmxpc2hlZBIMCgRob21lGAEgASgJEhcKCmNoaWxkX2hlYWQYAiABKAlIAIgBARIQCgh2ZXJpZmllZBgDIAEoCBIfChJ2ZXJpZmljYXRpb25fZXJyb3IYBCABKAlIAYgBAUINCgtfY2hpbGRfaGVhZEIVChNfdmVyaWZpY2F0aW9uX2Vycm9yImUKFEhpc3RvcmljUXVlcnlSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGbW9tZW50GAIgASgJEiwKBXF1ZXJ5GAMgASgLMh0ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5UmVxdWVzdCLGCgoPUnVudGltZVJlc3BvbnNlEhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIzCgdmYWlsdXJlGAogASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAEjQKC2tlcm5lbF9jYWxsGAsgASgLMh0ubm9tb3Mua2VybmVsLnYxLkNhbGxSZXNwb25zZUgAEjAKCWNvbm5lY3RlZBgMIAEoCzIbLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdGVkSAASOQoOd29ya3NwYWNlX2xpc3QYDSABKAsyHy5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZUxpc3RIABJBChJ3b3Jrc3BhY2Vfc25hcHNob3QYDiABKAsyIy5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVNuYXBzaG90SAASQQoOc3luY193b3Jrc3BhY2UYDyABKAsyJy5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXNwb25zZUgAEj4KEWF1dG9fc3luY19zdGFydGVkGBAgASgLMiEubm9tb3MucnVudGltZS52Mi5BdXRvU3luY1N0YXJ0ZWRIABI+ChFhdXRvX3N5bmNfc3RvcHBlZBgRIAEoCzIhLm5vbW9zLnJ1bnRpbWUudjIuQXV0b1N5bmNTdG9wcGVkSAASNwoNd2F0Y2hfc3RhcnRlZBgSIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hTdGFydGVkSAASNwoNd2F0Y2hfc3RvcHBlZBgTIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hTdG9wcGVkSAASOwoPZG9tYWluX3ByZXBhcmVkGBQgASgLMiAubm9tb3MucnVudGltZS52Mi5Eb21haW5QcmVwYXJlZEgAEkgKFmN1c3RvZHlfYnJlYWtfcmVzb2x2ZWQYFSABKAsyJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha1Jlc29sdmVkSAASNQoMcmVhbG1fY2xvc2VkGBYgASgLMh0ubm9tb3MucnVudGltZS52Mi5SZWFsbUNsb3NlZEgAEjMKB2Jsb2NrZWQYFyABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVCbG9ja2VkSAASSAoWcmVtb3RlX29mZmVyX2FkbWlzc2lvbhgYIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuUmVtb3RlT2ZmZXJBZG1pc3Npb25IABI7CgtkZWFkX2xldHRlchgZIAEoCzIkLm5vbW9zLnJ1bnRpbWUudjIuRGVhZExldHRlclJlc3BvbnNlSAASQwoPbW9kZWxfbGlmZWN5Y2xlGBogASgLMigubm9tb3MucnVudGltZS52Mi5Nb2RlbExpZmVjeWNsZVJlc3BvbnNlSAASWgofYXBwbGljYXRpb25fY3VzdG9keV9lc3RhYmxpc2hlZBgbIAEoCzIvLm5vbW9zLnJ1bnRpbWUudjIuQXBwbGljYXRpb25DdXN0b2R5RXN0YWJsaXNoZWRIABI9ChB3b3Jrc3BhY2Vfc3RhdHVzGBwgASgLMiEubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdGF0dXNIABJQChZyZW1vdGVfZ2VuZXJhdGVkX29mZmVyGB0gASgLMi4ubm9tb3MucnVudGltZS52Mi5SZW1vdGVHZW5lcmF0ZWRPZmZlckFjY2VwdGVkSABCCQoHb3V0Y29tZSK3AQobUmVtb3RlR2VuZXJhdGVkT2ZmZXJSZXF1ZXN0EhYKDnNvdXJjZV9zZXNzaW9uGAEgASgJEhgKEHRhcmdldF93b3Jrc3BhY2UYAiABKAkSDQoFYWN0b3IYAyABKAkSFQoNYXV0aG9yX3NlY3JldBgEIAEoDBISCgphdXRoX3Rva2VuGAUgASgMEiwKBGNhbGwYBiABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbCI/ChxSZW1vdGVHZW5lcmF0ZWRPZmZlckFjY2VwdGVkEhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRoZWFkGAIgASgJIp8BCg5SdW50aW1lQmxvY2tlZBJBCgl3b3Jrc3BhY2UYASABKAsyLC5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVkSAASQAoIc2libGluZ3MYAiABKAsyLC5ub21vcy5ydW50aW1lLnYyLlNpYmxpbmdSZXNpZGVuY2llc1JlcXVpcmVkSABCCAoGcmVhc29uIi8KGldvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVkEhEKCXdvcmtzcGFjZRgBIAEoCSJVChhTaWJsaW5nUmVzaWRlbmN5UmVxdWlyZWQSEQoJd29ya3NwYWNlGAEgASgJEhMKC3NvdXJjZV9oZWFkGAIgASgJEhEKCWZvbGRfcm9vdBgDIAEoCSJdChpTaWJsaW5nUmVzaWRlbmNpZXNSZXF1aXJlZBI/CgtyZXNpZGVuY2llcxgBIAMoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU2libGluZ1Jlc2lkZW5jeVJlcXVpcmVkIoYCChRSZW1vdGVPZmZlckFkbWlzc2lvbhIRCgl3b3Jrc3BhY2UYASABKAkSDAoEbWFpbhgCIAEoCRIYCgtzZWFsZWRfbWFpbhgDIAEoCUgAiAEBEi8KB3ZlcmRpY3QYBCABKAsyHi5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXNwb25zZRIzCgxib3JuX2N1c3RvZHkYBSADKAsyHS5ub21vcy5ydW50aW1lLnYyLkJvcm5DdXN0b2R5EhMKC3Jlc3VsdF9wYWNrGAYgASgMEhgKC3Jlc3VsdF9iYXNlGAcgASgJSAGIAQFCDgoMX3NlYWxlZF9tYWluQg4KDF9yZXN1bHRfYmFzZSJKCgtCb3JuQ3VzdG9keRItCgVjaGlsZBgBIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5Cb3JuV29ya3NwYWNlEgwKBHBhY2sYAiABKAwi+QEKGEN1c3RvZHlPZmZlckJhdGNoUmVxdWVzdBIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSNwoGaW5saW5lGAMgASgLMiUubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW5saW5lT2ZmZXJzSAASRgoRc2Vzc2lvbl9jYW5kaWRhdGUYBCABKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTZXNzaW9uQ2FuZGlkYXRlSAASFgoJYmFzZV9oZWFkGAUgASgJSAGIAQFCCAoGc291cmNlQgwKCl9iYXNlX2hlYWQiTgoSQ3VzdG9keUludGVudE9mZmVyEg8KB3Nlc3Npb24YASABKAkSEgoKY29tbWl0X29pZBgCIAEoCRITCgtjaGFuZ2VfdXNkYRgDIAEoDCJLChNDdXN0b2R5SW5saW5lT2ZmZXJzEjQKBm9mZmVycxgBIAMoCzIkLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudE9mZmVyIiwKF0N1c3RvZHlTZXNzaW9uQ2FuZGlkYXRlEhEKCXJlZmVyZW5jZRgBIAEoCSL3AQoZQ3VzdG9keU9mZmVyQmF0Y2hSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSNwoJYWRtaXNzaW9uGAogASgLMiIubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QWRtaXNzaW9uSAASMwoHZmFpbHVyZRgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIABIzCgdibG9ja2VkGAwgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lQmxvY2tlZEgAQgkKB291dGNvbWUi7gIKEEN1c3RvZHlBZG1pc3Npb24SDAoEbWFpbhgBIAEoCRIYCgtzZWFsZWRfbWFpbhgCIAEoCUgAiAEBEjsKCHNlc3Npb25zGAMgAygLMikubm9tb3MucnVudGltZS52Mi5DdXN0b2R5U2Vzc2lvbkFkbWlzc2lvbhI1Cg5iaXJ0aF9vdXRjb21lcxgEIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5CaXJ0aE91dGNvbWUSMwoMYm9ybl9jdXN0b2R5GAUgAygLMh0ubm9tb3MucnVudGltZS52Mi5Cb3JuQ3VzdG9keRITCgtyZXN1bHRfcGFjaxgGIAEoDBIYCgtyZXN1bHRfYmFzZRgHIAEoCUgBiAEBEjoKB3RpbWluZ3MYCCABKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlBZG1pc3Npb25UaW1pbmdzQg4KDF9zZWFsZWRfbWFpbkIOCgxfcmVzdWx0X2Jhc2UiZQoXQ3VzdG9keVNlc3Npb25BZG1pc3Npb24SDwoHc2Vzc2lvbhgBIAEoCRI5CgdpbnRlbnRzGAIgAygLMigubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50QWRtaXNzaW9uIpACChZDdXN0b2R5SW50ZW50QWRtaXNzaW9uEhIKCmNvbW1pdF9vaWQYASABKAkSFgoJaW50ZW50X2lkGAIgASgJSAGIAQESOwoIYWRtaXR0ZWQYCiABKAsyJy5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRBZG1pdHRlZEgAEjkKB3NraXBwZWQYCyABKAsyJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRTa2lwcGVkSAASOQoHcmVmdXNlZBgMIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudFJlZnVzZWRIAEIJCgdvdXRjb21lQgwKCl9pbnRlbnRfaWQikAEKFUN1c3RvZHlJbnRlbnRBZG1pdHRlZBIMCgRoZWFkGAEgASgJEjMKB2NyZWF0ZWQYAiADKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJBZ2dyZWdhdGVSZWYSNAoIYWZmZWN0ZWQYAyADKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJBZ2dyZWdhdGVSZWYiLwoUQ3VzdG9keUludGVudFNraXBwZWQSFwoPYWxyZWFkeV9vbl9tYWluGAEgASgIIloKFEN1c3RvZHlJbnRlbnRSZWZ1c2VkEg8KB21lc3NhZ2UYASABKAkSFQoNZGVhZF9sZXR0ZXJlZBgCIAEoCBIRCgRoaW50GAMgASgJSACIAQFCBwoFX2hpbnQi7QEKF0N1c3RvZHlBZG1pc3Npb25UaW1pbmdzEhQKDHRvdGFsX21pbGxpcxgBIAEoARITCgtzY2FuX21pbGxpcxgCIAEoARIUCgxmZXRjaF9taWxsaXMYAyABKAESEwoLc2VhbF9taWxsaXMYBCABKAESGAoQZ2F0ZV9mb2xkX21pbGxpcxgFIAEoARIUCgxpbnRlbnRfY291bnQYBiABKA0SFQoNc2Vzc2lvbl9jb3VudBgHIAEoDRI1CgVzcGFucxgIIAMoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUFkbWlzc2lvblNwYW4ilwEKFEN1c3RvZHlBZG1pc3Npb25TcGFuEgoKAmlkGAEgASgJEg0KBXRyYWNrGAIgASgJEgwKBG5hbWUYAyABKAkSDAoEa2luZBgEIAEoCRINCgVkZXB0aBgFIAEoDRIbChNzdGFydGVkX3VuaXhfbWlsbGlzGAYgASgBEhwKFGZpbmlzaGVkX3VuaXhfbWlsbGlzGAcgASgBIkIKDFRyYWNlQ29udGV4dBIQCgh0cmFjZV9pZBgBIAEoDBIPCgdzcGFuX2lkGAIgASgMEg8KB3NhbXBsZWQYAyABKAgi6QEKDlJ1bnRpbWVGYWlsdXJlEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIRCgljb21wb25lbnQYAyABKAkSFgoJd29ya3NwYWNlGAQgASgJSACIAQESEwoGZG9tYWluGAUgASgJSAGIAQESFgoJZGlyZWN0aXZlGAYgASgJSAKIAQESOQoKYXR0cmlidXRlcxgHIAMoCzIlLm5vbW9zLnJ1bnRpbWUudjIuRGlhZ25vc3RpY0F0dHJpYnV0ZUIMCgpfd29ya3NwYWNlQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSKlAQoTRGlhZ25vc3RpY0F0dHJpYnV0ZRIMCgRuYW1lGAEgASgJEhYKDHN0cmluZ192YWx1ZRgCIAEoCUgAEhcKDWludGVnZXJfdmFsdWUYAyABKBJIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIXCg1ib29sZWFuX3ZhbHVlGAUgASgISAASFQoLYnl0ZXNfdmFsdWUYBiABKAxIAEIHCgV2YWx1ZSLNAgoOQ29ubmVjdFJlcXVlc3QSEQoJd29ya3NwYWNlGAEgASgJEhEKCWNsaWVudF9pZBgCIAEoCRIUCgdzZXNzaW9uGAMgASgJSACIAQESEgoFY2xvdWQYBCABKAlIAYgBARISCgphdXRoX3Rva2VuGAUgASgMEhUKDWF1dGhvcl9zZWNyZXQYBiABKAwSIgoabWF4aW11bV9tb3VudGVkX3dvcmtzcGFjZXMYByABKA0SFAoMYWxsb3dfdW5ib3JuGAggASgIEg8KB3JlY292ZXIYCSABKAgSQgoUY3VzdG9keV9icmVha19wb2xpY3kYCiABKA4yJC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha1BvbGljeRIbChNoYXNfcmVzdG9yZV9jdXN0b2R5GAsgASgIQgoKCF9zZXNzaW9uQggKBl9jbG91ZCKLAQoJQ29ubmVjdGVkEhEKCXdvcmtzcGFjZRgBIAEoCRIPCgdzZXNzaW9uGAIgASgJEhMKC2Nsb3VkX2JvdW5kGAMgASgIEjgKCHJlY292ZXJ5GAQgASgLMiEubm9tb3MucnVudGltZS52Mi5DdXN0b2R5UmVjb3ZlcnlIAIgBAUILCglfcmVjb3ZlcnkiWwoPQ3VzdG9keVJlY292ZXJ5EhUKDXByZXZpb3VzX2hlYWQYASABKAkSFgoOcmVjb3ZlcmVkX2hlYWQYAiABKAkSGQoRcmVjb3ZlcmVkX2ludGVudHMYAyABKAQiFwoVTGlzdFdvcmtzcGFjZXNSZXF1ZXN0Iq0BChBXb3Jrc3BhY2VTdW1tYXJ5Eg8KB3Nlc3Npb24YASABKAkSEQoJd29ya3NwYWNlGAIgASgJEjcKCXJlc2lkZW5jeRgDIAEoDjIkLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlUmVzaWRlbmN5EjwKDHN5bmNfcG9zdHVyZRgEIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlU3luY1Bvc3R1cmUiRwoNV29ya3NwYWNlTGlzdBI2Cgp3b3Jrc3BhY2VzGAEgAygLMiIubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdW1tYXJ5IikKFldvcmtzcGFjZVN0YXR1c1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCSJACg9Xb3Jrc3BhY2VTdGF0dXMSEQoJd29ya3NwYWNlGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBAUIHCgVfaGVhZCJNChhTbmFwc2hvdFdvcmtzcGFjZVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIUCgdpZl9oZWFkGAIgASgJSACIAQFCCgoIX2lmX2hlYWQiXAoRV29ya3NwYWNlU25hcHNob3QSEQoJd29ya3NwYWNlGAEgASgJEgwKBGhlYWQYAiABKAkSEQoJdW5jaGFuZ2VkGAMgASgIEhMKC2hhc19jdXN0b2R5GAQgASgIIjYKFFN5bmNXb3Jrc3BhY2VSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDQoFYWRtaXQYAiABKAgivAUKFVN5bmNXb3Jrc3BhY2VSZXNwb25zZRIRCgl3b3Jrc3BhY2UYASABKAkSGgoNcHJldmlvdXNfaGVhZBgCIAEoCUgAiAEBEhkKDGN1cnJlbnRfaGVhZBgDIAEoCUgBiAEBEhAKCGFkbWl0dGVkGAQgASgEEg8KB3JlZnVzZWQYBSABKAQSEAoIZGVmZXJyZWQYBiABKAQSEgoKbG9jYWxfb25seRgHIAEoCBIOCgZwdWxsZWQYCCABKAgSEAoIZGl2ZXJnZWQYCSABKAgSGgoScmVjb25uZWN0X3JlcXVpcmVkGAogASgIEhMKC3N0aWxsX2FoZWFkGAsgASgIEg8KB29mZmxpbmUYDCABKAgSEwoLcHVzaF9mYWlsZWQYDSABKAgSHQoVZGlyZWN0X29mZmVyX2RlZmVycmVkGA4gASgIEjUKDmJpcnRoX291dGNvbWVzGA8gAygLMh0ubm9tb3Mua2VybmVsLnYxLkJpcnRoT3V0Y29tZRIbChNhZG1pdHRlZF9pbnRlbnRfaWRzGBAgAygJEhwKFGNvbnZlcmdlZF9pbnRlbnRfaWRzGBEgAygJEkIKCnB1c2hfZXJyb3IYEiABKAsyKS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVUcmFuc3BvcnRGYWlsdXJlSAKIAQESRwoPZGlzY292ZXJ5X2Vycm9yGBMgASgLMikubm9tb3MucnVudGltZS52Mi5SdW50aW1lVHJhbnNwb3J0RmFpbHVyZUgDiAEBEjMKB3RpbWluZ3MYFCABKAsyIi5ub21vcy5ydW50aW1lLnYyLlN5bmNQaGFzZVRpbWluZ3NCEAoOX3ByZXZpb3VzX2hlYWRCDwoNX2N1cnJlbnRfaGVhZEINCgtfcHVzaF9lcnJvckISChBfZGlzY292ZXJ5X2Vycm9yIl0KF1J1bnRpbWVUcmFuc3BvcnRGYWlsdXJlEhAKCGVuZHBvaW50GAEgASgJEg4KBnN0YXR1cxgCIAEoERIPCgdyZWZ1c2VkGAMgASgIEg8KB21lc3NhZ2UYBCABKAkisQEKEFN5bmNQaGFzZVRpbWluZ3MSEwoLcHVzaF9taWxsaXMYASABKAESFAoMYWRtaXRfbWlsbGlzGAIgASgBEhcKD3ByZWZldGNoX21pbGxpcxgDIAEoARIXCg9jb252ZXJnZV9taWxsaXMYBCABKAESEgoKcHVzaF9ieXRlcxgFIAEoBBIVCg1zZXJ2ZXJfbWlsbGlzGAYgASgBEhUKDW9mZmVyX2luX3B1c2gYByABKAgi3wEKFFN0YXJ0QXV0b1N5bmNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSHAoPZGVib3VuY2VfbWlsbGlzGAIgASgNSACIAQESHAoPZmFsbGJhY2tfbWlsbGlzGAMgASgNSAGIAQESGgoNc2lnbmFsX21pbGxpcxgEIAEoDUgCiAEBEhYKCXNpZ25hbF9pZBgFIAEoCUgDiAEBQhIKEF9kZWJvdW5jZV9taWxsaXNCEgoQX2ZhbGxiYWNrX21pbGxpc0IQCg5fc2lnbmFsX21pbGxpc0IMCgpfc2lnbmFsX2lkIiIKD0F1dG9TeW5jU3RhcnRlZBIPCgdzZXNzaW9uGAEgASgJIiYKE1N0b3BBdXRvU3luY1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCSIiCg9BdXRvU3luY1N0b3BwZWQSDwoHc2Vzc2lvbhgBIAEoCSKqAQoMV2F0Y2hSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFwoPc3Vic2NyaXB0aW9uX2lkGAIgASgJEikKBGtpbmQYAyABKA4yGy5ub21vcy5ydW50aW1lLnYyLldhdGNoS2luZBIsCgVxdWVyeRgEIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5RdWVyeVJlcXVlc3QSFwoPaW50ZXJ2YWxfbWlsbGlzGAUgASgNIicKDFdhdGNoU3RhcnRlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkiKQoOVW53YXRjaFJlcXVlc3QSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIicKDFdhdGNoU3RvcHBlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkidQoUUHJlcGFyZURvbWFpblJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZkb21haW4YAiABKAkSFgoOcGFja2FnZV9zaGEyNTYYAyABKAkSFgoJZGlyZWN0aXZlGAQgASgJSACIAQFCDAoKX2RpcmVjdGl2ZSJSCg5Eb21haW5QcmVwYXJlZBIOCgZkb21haW4YASABKAkSFgoOcGFja2FnZV9zaGEyNTYYAiABKAkSGAoQYWxyZWFkeV9yZXNpZGVudBgDIAEoCCL2AQoVTW9kZWxMaWZlY3ljbGVSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSPQoFc3RhZ2UYCiABKAsyLC5ub21vcy5ydW50aW1lLnYyLlN0YWdlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0SAASPQoFYWRvcHQYCyABKAsyLC5ub21vcy5ydW50aW1lLnYyLkFkb3B0R2VuZXJhdGVkTW9kZWxSZXF1ZXN0SAASQQoHcmVzdG9yZRgMIAEoCzIuLm5vbW9zLnJ1bnRpbWUudjIuUmVzdG9yZUdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiKGAQoaU3RhZ2VHZW5lcmF0ZWRNb2RlbFJlcXVlc3QSDgoGZG9tYWluGAEgASgJEhYKDmNhbmRpZGF0ZV9oYXNoGAIgASgJEhAKCGxhd191c2R6GAMgASgMEhsKDnNvdXJjZV9zZXNzaW9uGAQgASgJSACIAQFCEQoPX3NvdXJjZV9zZXNzaW9uInoKGkFkb3B0R2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIWCg5jYW5kaWRhdGVfaGFzaBgCIAEoCRIeChFhY2NlcHRhbmNlX3JlYXNvbhgDIAEoCUgAiAEBQhQKEl9hY2NlcHRhbmNlX3JlYXNvbiJ6ChxSZXN0b3JlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIUCgxjdXJyZW50X2hhc2gYAiABKAkSHgoRYWNjZXB0YW5jZV9yZWFzb24YAyABKAlIAIgBAUIUChJfYWNjZXB0YW5jZV9yZWFzb24ikwEKD01vZGVsRGlmZmVyZW5jZRIzCgRraW5kGAEgASgOMiUubm9tb3MucnVudGltZS52Mi5Nb2RlbERpZmZlcmVuY2VLaW5kEhEKBGFyZWEYAiABKAlIAIgBARITCgZhY3Rpb24YAyABKAlIAYgBARIPCgdzdW1tYXJ5GAQgASgJQgcKBV9hcmVhQgkKB19hY3Rpb24ipQEKC01vZGVsUmV2aWV3EhcKD2NoZWNrZWRfYWN0aW9ucxgBIAEoBBIZChFjYW5kaWRhdGVfYWN0aW9ucxgCIAEoBBIZCgxzYW1lX291dGNvbWUYAyABKAhIAIgBARI2CgtkaWZmZXJlbmNlcxgEIAMoCzIhLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxEaWZmZXJlbmNlQg8KDV9zYW1lX291dGNvbWUihQIKFk1vZGVsTGlmZWN5Y2xlUmVzcG9uc2USEAoIYWNjZXB0ZWQYASABKAgSNAoFc3RhZ2UYAiABKA4yJS5ub21vcy5ydW50aW1lLnYyLk1vZGVsTGlmZWN5Y2xlU3RhZ2USFAoHbWVzc2FnZRgDIAEoCUgAiAEBEhEKBGhlYWQYBCABKAlIAYgBARIXCgpyZWNlaXB0X2lkGAUgASgJSAKIAQESMgoGcmV2aWV3GAYgASgLMh0ubm9tb3MucnVudGltZS52Mi5Nb2RlbFJldmlld0gDiAEBQgoKCF9tZXNzYWdlQgcKBV9oZWFkQg0KC19yZWNlaXB0X2lkQgkKB19yZXZpZXciZwoaUmVzb2x2ZUN1c3RvZHlCcmVha1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRI4CghkZWNpc2lvbhgCIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrRGVjaXNpb24iYQoUQ3VzdG9keUJyZWFrUmVzb2x2ZWQSDwoHc2Vzc2lvbhgBIAEoCRI4CghkZWNpc2lvbhgCIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrRGVjaXNpb24iEwoRQ2xvc2VSZWFsbVJlcXVlc3QiDQoLUmVhbG1DbG9zZWQi5QEKEURlYWRMZXR0ZXJSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSOAoEbGlzdBgKIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuTGlzdERlYWRMZXR0ZXJzUmVxdWVzdEgAEjkKBXJldHJ5GAsgASgLMigubm9tb3MucnVudGltZS52Mi5SZXRyeURlYWRMZXR0ZXJSZXF1ZXN0SAASPQoHZGlzY2FyZBgMIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuRGlzY2FyZERlYWRMZXR0ZXJSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIhgKFkxpc3REZWFkTGV0dGVyc1JlcXVlc3QiKwoWUmV0cnlEZWFkTGV0dGVyUmVxdWVzdBIRCglpbnRlbnRfaWQYASABKAkiLQoYRGlzY2FyZERlYWRMZXR0ZXJSZXF1ZXN0EhEKCWludGVudF9pZBgBIAEoCSK9AQoSRGVhZExldHRlclJlc3BvbnNlEjAKBGxpc3QYCiABKAsyIC5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJMaXN0SAASMgoFcmV0cnkYCyABKAsyIS5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJSZXRyeUgAEjYKB2Rpc2NhcmQYDCABKAsyIy5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJEaXNjYXJkSABCCQoHb3V0Y29tZSJECg5EZWFkTGV0dGVyTGlzdBIyCgdlbnRyaWVzGAEgAygLMiEubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyRW50cnkiuQEKD0RlYWRMZXR0ZXJFbnRyeRIPCgJpZBgBIAEoCUgAiAEBEhIKCmNvbW1pdF9vaWQYAiABKAkSDgoGc291cmNlGAMgASgJEg8KB21lc3NhZ2UYBCABKAkSEwoGZG9tYWluGAUgASgJSAGIAQESFgoJZGlyZWN0aXZlGAYgASgJSAKIAQESEwoLcmVjb3JkZWRfYXQYByABKAlCBQoDX2lkQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSJ5Cg9EZWFkTGV0dGVyUmV0cnkSDwoHcmV0cmllZBgBIAEoCBIRCgRoZWFkGAIgASgJSACIAQESFwoPYWxyZWFkeV9vbl9tYWluGAMgASgIEhQKB21lc3NhZ2UYBCABKAlIAYgBAUIHCgVfaGVhZEIKCghfbWVzc2FnZSIkChFEZWFkTGV0dGVyRGlzY2FyZBIPCgdyZW1vdmVkGAEgASgEIs0FCgxSdW50aW1lRXZlbnQSEAoIc2VxdWVuY2UYASABKAQSFAoHc2Vzc2lvbhgCIAEoCUgBiAEBEi8KBXJlYWR5GAogASgLMh4ubm9tb3MucnVudGltZS52Mi5SdW50aW1lUmVhZHlIABI3Cg13YXRjaF9jaGFuZ2VkGAsgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaENoYW5nZWRIABI5Cg5zeW5jX2NvbXBsZXRlZBgMIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuU3luY0NvbXBsZXRlZEgAEjUKDGxpbmtfY2hhbmdlZBgNIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuTGlua0NoYW5nZWRIABI5Cg5zaWduYWxfY2hhbmdlZBgOIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuU2lnbmFsQ2hhbmdlZEgAEjsKD2N1c3RvZHlfY2hhbmdlZBgPIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUNoYW5nZWRIABJCChNsb2NhbF93b3JrX3JlamVjdGVkGBAgASgLMiMubm9tb3MucnVudGltZS52Mi5Mb2NhbFdvcmtSZWplY3RlZEgAEjMKC2xhd19jaGFuZ2VkGBEgASgLMhwubm9tb3MucnVudGltZS52Mi5MYXdDaGFuZ2VkSAASQwoPa2VybmVsX3Byb2dyZXNzGBIgASgLMigubm9tb3MucnVudGltZS52Mi5LZXJuZWxQcm9ncmVzc09ic2VydmVkSAASLQoEc3BhbhgTIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVNwYW5IABI/ChF0cmFuc2Zlcl9wcm9ncmVzcxgUIAEoCzIiLm5vbW9zLnJ1bnRpbWUudjIuVHJhbnNmZXJQcm9ncmVzc0gAQgcKBWV2ZW50QgoKCF9zZXNzaW9uIj4KDFJ1bnRpbWVSZWFkeRIXCg9ydW50aW1lX3ZlcnNpb24YASABKAkSFQoNa2VybmVsX3NoYTI1NhgCIAEoDCKAAQoMV2F0Y2hDaGFuZ2VkEhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCRITCgtyZXN1bHRfdXNkYRgCIAEoDBI2CgdmYWlsdXJlGAMgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAiAEBQgoKCF9mYWlsdXJlIpwBCg1TeW5jQ29tcGxldGVkEg4KBnJlYXNvbhgBIAEoCRI3CgZyZXN1bHQYAiABKAsyJy5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXNwb25zZRI2CgdmYWlsdXJlGAMgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAiAEBQgoKCF9mYWlsdXJlIjsKC0xpbmtDaGFuZ2VkEiwKBnN0YXR1cxgBIAEoDjIcLm5vbW9zLnJ1bnRpbWUudjIuTGlua1N0YXR1cyI4Cg1TaWduYWxDaGFuZ2VkEg4KBmRvbWFpbhgBIAEoCRIXCg9wcm9qZWN0aW9uX3VzZGEYAiABKAwi9AEKDkN1c3RvZHlDaGFuZ2VkEjEKBGtpbmQYASABKA4yIy5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlDaGFuZ2VLaW5kEjUKDWN1c3RvZHlfYnJlYWsYAiABKAsyHi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVhaxIWCglvcGVyYXRpb24YAyABKAlIAIgBARIVCghyZWNsb25lZBgEIAEoCEgBiAEBEhsKDnBhcmtlZF9pbnRlbnRzGAUgASgESAKIAQFCDAoKX29wZXJhdGlvbkILCglfcmVjbG9uZWRCEQoPX3BhcmtlZF9pbnRlbnRzIuEBChFMb2NhbFdvcmtSZWplY3RlZBIRCgl3b3Jrc3BhY2UYASABKAkSNgoHcmVmdXNlZBgCIAMoCzIlLm5vbW9zLnJ1bnRpbWUudjIuUmVqZWN0ZWRMb2NhbEludGVudBIOCgZwYXJrZWQYAyABKAgSFQoIcmVzZXRfdG8YBCABKAlIAIgBARIRCglyZXRyeWFibGUYBSABKAgSOgoGc291cmNlGAYgASgOMioubm9tb3MucnVudGltZS52Mi5Mb2NhbFdvcmtSZWplY3Rpb25Tb3VyY2VCCwoJX3Jlc2V0X3RvImMKE0N1c3RvZHlTdXBlcnNlc3Npb24SGgoNc3VwZXJzZWRlZF9hdBgBIAEoCUgAiAEBEhMKBnJlYXNvbhgCIAEoCUgBiAEBQhAKDl9zdXBlcnNlZGVkX2F0QgkKB19yZWFzb24iuAIKDEN1c3RvZHlCcmVhaxIwCgRraW5kGAEgASgOMiIubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QnJlYWtLaW5kEhUKDWxvY2FsX2dlbmVzaXMYAiABKAkSFgoOcmVtb3RlX2dlbmVzaXMYAyABKAkSGgoScmVtb3RlX2luY2FybmF0aW9uGAQgASgJEkAKDHN1cGVyc2Vzc2lvbhgFIAEoCzIlLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keVN1cGVyc2Vzc2lvbkgAiAEBEhoKEmxvY2FsX29ubHlfaW50ZW50cxgGIAEoBBIiChVsYXN0X3N5bmNlZF9hdF9taWxsaXMYByABKARIAYgBAUIPCg1fc3VwZXJzZXNzaW9uQhgKFl9sYXN0X3N5bmNlZF9hdF9taWxsaXMizQEKE1JlamVjdGVkTG9jYWxJbnRlbnQSFgoJaW50ZW50X2lkGAEgASgJSACIAQESFwoKY29tbWl0X29pZBgCIAEoCUgBiAEBEhMKBmRvbWFpbhgDIAEoCUgCiAEBEhYKCWRpcmVjdGl2ZRgEIAEoCUgDiAEBEg8KB21lc3NhZ2UYBSABKAkSEQoJcmV0cnlhYmxlGAYgASgIQgwKCl9pbnRlbnRfaWRCDQoLX2NvbW1pdF9vaWRCCQoHX2RvbWFpbkIMCgpfZGlyZWN0aXZlIlAKCkxhd0NoYW5nZWQSDgoGZG9tYWluGAEgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAIgASgJEhoKEmNvbXBhdGliaWxpdHlfdXNkYRgDIAEoDCLdAQoLUnVudGltZVNwYW4SEAoIdHJhY2VfaWQYASABKAwSDwoHc3Bhbl9pZBgCIAEoDBIbCg5wYXJlbnRfc3Bhbl9pZBgDIAEoDEgAiAEBEgwKBG5hbWUYBCABKAkSGgoSc3RhcnRlZF91bml4X25hbm9zGAUgASgEEhYKDmR1cmF0aW9uX25hbm9zGAYgASgEEjkKCmF0dHJpYnV0ZXMYByADKAsyJS5ub21vcy5ydW50aW1lLnYyLkRpYWdub3N0aWNBdHRyaWJ1dGVCEQoPX3BhcmVudF9zcGFuX2lkIuoBChZLZXJuZWxQcm9ncmVzc09ic2VydmVkEjkKCHNuYXBzaG90GAEgASgLMicubm9tb3Mua2VybmVsLnYxLktlcm5lbFByb2dyZXNzU25hcHNob3QSJAocaG9zdF9vYnNlcnZlZF9lbGFwc2VkX21pY3JvcxgCIAEoBBIqCiJob3N0X29ic2VydmVkX3BoYXNlX2VsYXBzZWRfbWljcm9zGAMgASgEEh4KFnByb2Nlc3NfcmVzaWRlbnRfYnl0ZXMYBCABKAQSIwobcHJvY2Vzc19wZWFrX3Jlc2lkZW50X2J5dGVzGAUgASgEIoIBChBUcmFuc2ZlclByb2dyZXNzEhYKDnJlY2VpdmVkX2J5dGVzGAEgASgEEhgKC3RvdGFsX2J5dGVzGAIgASgESACIAQESLAoEa2luZBgDIAEoDjIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhbnNmZXJLaW5kQg4KDF90b3RhbF9ieXRlcyqZAQoSQ3VzdG9keUJyZWFrUG9saWN5EiQKIENVU1RPRFlfQlJFQUtfUE9MSUNZX1VOU1BFQ0lGSUVEEAASHAoYQ1VTVE9EWV9CUkVBS19QT0xJQ1lfQVNLEAESHgoaQ1VTVE9EWV9CUkVBS19QT0xJQ1lfQURPUFQQAhIfChtDVVNUT0RZX0JSRUFLX1BPTElDWV9SRUpFQ1QQAyqgAQoSV29ya3NwYWNlUmVzaWRlbmN5EiMKH1dPUktTUEFDRV9SRVNJREVOQ1lfVU5TUEVDSUZJRUQQABIfChtXT1JLU1BBQ0VfUkVTSURFTkNZX01PVU5URUQQARIeChpXT1JLU1BBQ0VfUkVTSURFTkNZX1BBUktFRBACEiQKIFdPUktTUEFDRV9SRVNJREVOQ1lfQ1VTVE9EWV9PTkxZEAMqjQEKFFdvcmtzcGFjZVN5bmNQb3N0dXJlEiYKIldPUktTUEFDRV9TWU5DX1BPU1RVUkVfVU5TUEVDSUZJRUQQABIlCiFXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX0xPQ0FMX09OTFkQARImCiJXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX0NMT1VEX0JPVU5EEAIqqAEKCVdhdGNoS2luZBIaChZXQVRDSF9LSU5EX1VOU1BFQ0lGSUVEEAASFAoQV0FUQ0hfS0lORF9RVUVSWRABEhQKEFdBVENIX0tJTkRfQllfSUQQAhIWChJXQVRDSF9LSU5EX1NQQVRJQUwQAxIXChNXQVRDSF9LSU5EX0FDVElWSVRZEAQiBAgFEAUqHFdBVENIX0tJTkRfUEVORElOR19DT05GTElDVFMqpAMKE01vZGVsTGlmZWN5Y2xlU3RhZ2USJQohTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1VOU1BFQ0lGSUVEEAASKwonTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0lERU5USVRZX1JFUVVJUkVEEAESKgomTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1NUQUdJTkdfUkVRVUlSRUQQAhIjCh9NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUFJFRkxJR0hUEAMSLQopTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FDQ0VQVEFOQ0VfUkVRVUlSRUQQBBIjCh9NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfQURNSVNTSU9OEAUSIQodTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BFTkRJTkcQBhIiCh5NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUFJPTU9URUQQBxIiCh5NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUkVTVE9SRUQQCBIpCiVNT0RFTF9MSUZFQ1lDTEVfU1RBR0VfQUxSRUFEWV9DVVJSRU5UEAkqpAEKE01vZGVsRGlmZmVyZW5jZUtpbmQSJQohTU9ERUxfRElGRkVSRU5DRV9LSU5EX1VOU1BFQ0lGSUVEEAASHwobTU9ERUxfRElGRkVSRU5DRV9LSU5EX1JVTEVTEAESIQodTU9ERUxfRElGRkVSRU5DRV9LSU5EX09VVENPTUUQAhIiCh5NT0RFTF9ESUZGRVJFTkNFX0tJTkRfRVZJREVOQ0UQAyqDAQoUQ3VzdG9keUJyZWFrRGVjaXNpb24SJgoiQ1VTVE9EWV9CUkVBS19ERUNJU0lPTl9VTlNQRUNJRklFRBAAEiAKHENVU1RPRFlfQlJFQUtfREVDSVNJT05fQURPUFQQARIhCh1DVVNUT0RZX0JSRUFLX0RFQ0lTSU9OX1JFSkVDVBACKlcKCkxpbmtTdGF0dXMSGwoXTElOS19TVEFUVVNfVU5TUEVDSUZJRUQQABIUChBMSU5LX1NUQVRVU19PUEVOEAESFgoSTElOS19TVEFUVVNfQ0xPU0VEEAIq4gEKEUN1c3RvZHlDaGFuZ2VLaW5kEiMKH0NVU1RPRFlfQ0hBTkdFX0tJTkRfVU5TUEVDSUZJRUQQABIgChxDVVNUT0RZX0NIQU5HRV9LSU5EX0RFVEVDVEVEEAESIAocQ1VTVE9EWV9DSEFOR0VfS0lORF9SRUpFQ1RFRBACEiAKHENVU1RPRFlfQ0hBTkdFX0tJTkRfQURPUFRJTkcQAxIlCiFDVVNUT0RZX0NIQU5HRV9LSU5EX0FET1BUX1JFRlVTRUQQBBIbChdDVVNUT0RZX0NIQU5HRV9LSU5EX0FTSxAFKnoKEEN1c3RvZHlCcmVha0tpbmQSIgoeQ1VTVE9EWV9CUkVBS19LSU5EX1VOU1BFQ0lGSUVEEAASIQodQ1VTVE9EWV9CUkVBS19LSU5EX1NVUEVSU0VERUQQARIfChtDVVNUT0RZX0JSRUFLX0tJTkRfRElWRVJHRUQQAiqYAQoYTG9jYWxXb3JrUmVqZWN0aW9uU291cmNlEisKJ0xPQ0FMX1dPUktfUkVKRUNUSU9OX1NPVVJDRV9VTlNQRUNJRklFRBAAEikKJUxPQ0FMX1dPUktfUkVKRUNUSU9OX1NPVVJDRV9BRE1JU1NJT04QARIkCiBMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfU1lOQxACKnYKDFRyYW5zZmVyS2luZBIdChlUUkFOU0ZFUl9LSU5EX1VOU1BFQ0lGSUVEEAASFwoTVFJBTlNGRVJfS0lORF9ERUxUQRABEhYKElRSQU5TRkVSX0tJTkRfRlVMTBACEhYKElRSQU5TRkVSX0tJTkRfUFVTSBADMmQKE05vbW9zUnVudGltZVNlcnZpY2USTQoGSW52b2tlEiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lUmVxdWVzdBohLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlc3BvbnNlYgZwcm90bzM", [file_nomos_kernel_v1_kernel, file_nomos_kernel_v1_progress]);
|
|
6388
6480
|
RuntimeRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 0);
|
|
6389
6481
|
KernelCallRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 1);
|
|
6390
6482
|
RuntimeResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 5);
|
|
6391
|
-
CustodyOfferBatchRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6392
|
-
CustodyIntentOfferSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6393
|
-
CustodyInlineOffersSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6394
|
-
CustodySessionCandidateSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6395
|
-
CustodyOfferBatchResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6396
|
-
DeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6397
|
-
ListDeadLettersRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6398
|
-
RetryDeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6399
|
-
DiscardDeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6483
|
+
CustodyOfferBatchRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 14);
|
|
6484
|
+
CustodyIntentOfferSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 15);
|
|
6485
|
+
CustodyInlineOffersSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 16);
|
|
6486
|
+
CustodySessionCandidateSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 17);
|
|
6487
|
+
CustodyOfferBatchResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 18);
|
|
6488
|
+
DeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 65);
|
|
6489
|
+
ListDeadLettersRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 66);
|
|
6490
|
+
RetryDeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 67);
|
|
6491
|
+
DiscardDeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 68);
|
|
6400
6492
|
}
|
|
6401
6493
|
});
|
|
6402
6494
|
|
|
@@ -6446,7 +6538,7 @@ function presentCanonicalCustodyConvergence(convergence, context) {
|
|
|
6446
6538
|
endpoint: `/v2/workspaces/${context.workspace}`,
|
|
6447
6539
|
status: 0,
|
|
6448
6540
|
refused: false,
|
|
6449
|
-
error: String(convergence.error instanceof Error ? convergence.error.message : convergence.error).slice(0,
|
|
6541
|
+
error: String(convergence.error instanceof Error ? convergence.error.message : convergence.error).slice(0, 1200)
|
|
6450
6542
|
};
|
|
6451
6543
|
return {
|
|
6452
6544
|
result: {
|
|
@@ -6524,7 +6616,10 @@ async function convergeCanonicalCustody(options) {
|
|
|
6524
6616
|
return { kind: "custodyBreak", custodyBreak: converged.custodyBreak };
|
|
6525
6617
|
}
|
|
6526
6618
|
pulled = converged.upToDate !== true;
|
|
6527
|
-
} catch {
|
|
6619
|
+
} catch (error) {
|
|
6620
|
+
console.error(
|
|
6621
|
+
`[nomos-sync-convergence] remote=${remoteHead} base=${syncedBase ?? "none"}: ` + (error instanceof Error ? error.message : String(error))
|
|
6622
|
+
);
|
|
6528
6623
|
diverged = true;
|
|
6529
6624
|
}
|
|
6530
6625
|
}
|
|
@@ -6984,6 +7079,16 @@ function prepareManagedPromotion(report, candidateHash, domain, opts = {}) {
|
|
|
6984
7079
|
error: `the package-wide report does not cover the generated business area '${domain}'`
|
|
6985
7080
|
};
|
|
6986
7081
|
}
|
|
7082
|
+
const dispositions2 = report.dispositions;
|
|
7083
|
+
const changesStableIdentity = dispositions2 !== void 0 && (dispositions2.retired.length > 0 || Object.keys(dispositions2.retyped).length > 0 || Object.keys(dispositions2.rebinds).length > 0);
|
|
7084
|
+
if (changesStableIdentity && !acceptanceReason) {
|
|
7085
|
+
return {
|
|
7086
|
+
ok: false,
|
|
7087
|
+
stage: "acceptance",
|
|
7088
|
+
report,
|
|
7089
|
+
error: "the current-frontier transition changes stable business identities and needs an attributed acceptance reason"
|
|
7090
|
+
};
|
|
7091
|
+
}
|
|
6987
7092
|
const preflight = {
|
|
6988
7093
|
candidateHash,
|
|
6989
7094
|
// A package may be reached through any one of its generated domain clients. The
|
|
@@ -7821,8 +7926,24 @@ function firstDeviceDelegationPayload(route, certificate, typedPayload) {
|
|
|
7821
7926
|
if (declared.has("delegationCertificate")) {
|
|
7822
7927
|
return { delegationCertificate: typedPayload };
|
|
7823
7928
|
}
|
|
7824
|
-
throw new
|
|
7825
|
-
`Nomos application route '${route.domain}${route.path}' does not declare the typed 'delegationCertificate' contract
|
|
7929
|
+
throw new NomosClientError(
|
|
7930
|
+
`Nomos application route '${route.domain}${route.path}' does not declare the typed 'delegationCertificate' contract`,
|
|
7931
|
+
{
|
|
7932
|
+
code: "nomos.application.contract_missing",
|
|
7933
|
+
operation: "enrollFirstDevice",
|
|
7934
|
+
recommendedAction: NomosRecommendedAction.redeployLaw,
|
|
7935
|
+
info: {
|
|
7936
|
+
code: "nomos.application.contract_missing",
|
|
7937
|
+
message: `Nomos application route '${route.domain}${route.path}' does not declare the typed 'delegationCertificate' contract`,
|
|
7938
|
+
component: "nomos.application",
|
|
7939
|
+
domain: route.domain,
|
|
7940
|
+
operation: "enrollFirstDevice",
|
|
7941
|
+
attributes: {
|
|
7942
|
+
"nomos.application.missing_contract": "delegationCertificate",
|
|
7943
|
+
"nomos.recovery.action": "repeat-parent-authorized-birth"
|
|
7944
|
+
}
|
|
7945
|
+
}
|
|
7946
|
+
}
|
|
7826
7947
|
);
|
|
7827
7948
|
}
|
|
7828
7949
|
function jwtClaimOf(token, claim) {
|
|
@@ -7839,7 +7960,7 @@ function jwtClaimOf(token, claim) {
|
|
|
7839
7960
|
}
|
|
7840
7961
|
}
|
|
7841
7962
|
function createGovernanceOffers(ctx) {
|
|
7842
|
-
const { offerDirective, offerCall, offerModelLifecycle, serialize, queryById, queryRows, attestationSignKernel, _fetch, base, workspace, deviceSecret, authHeaders, receivingGroupNameOf: receivingGroupNameOf2, sha256hexBytes: sha256hexBytes2, bytesUnb64: bytesUnb642, birthCertificateLawPayload: birthCertificateLawPayload2, actorForShareQuote: actorForShareQuote2, installedInterfaceInner, mintKeylessDelegation: mintKeylessDelegation2, signWorkspaceOffer, resolveFrameworkRoute } = ctx;
|
|
7963
|
+
const { offerDirective, offerCall, offerModelLifecycle, serialize, queryById, queryRows, attestationSignKernel, _fetch, base, workspace, deviceSecret, authHeaders, connectionAuthToken, connectionFrameworkCalls, receivingGroupNameOf: receivingGroupNameOf2, sha256hexBytes: sha256hexBytes2, bytesUnb64: bytesUnb642, birthCertificateLawPayload: birthCertificateLawPayload2, actorForShareQuote: actorForShareQuote2, installedInterfaceInner, mintKeylessDelegation: mintKeylessDelegation2, signWorkspaceOffer, resolveFrameworkRoute } = ctx;
|
|
7843
7964
|
const g = {
|
|
7844
7965
|
/**
|
|
7845
7966
|
* AUTHOR a SIGNED governance/framework intent locally and return the sealed offer bytes (base64) ready to
|
|
@@ -7944,6 +8065,54 @@ function createGovernanceOffers(ctx) {
|
|
|
7944
8065
|
});
|
|
7945
8066
|
return g.postGovernanceOffer({ directiveId: call.directive, intentBytes: sealed.intentBytes, ws: parent, authToken, domain: call.domain });
|
|
7946
8067
|
},
|
|
8068
|
+
/**
|
|
8069
|
+
* Offer one exact compiler-generated call to another workspace without
|
|
8070
|
+
* mounting or replaying that target locally. The source holon's kernel
|
|
8071
|
+
* signs only the target-kernel-prepared USDA; the host receives neither a
|
|
8072
|
+
* tenant object nor authority to invent an operation.
|
|
8073
|
+
*/
|
|
8074
|
+
offerRemoteGeneratedCall: async ({
|
|
8075
|
+
call,
|
|
8076
|
+
target,
|
|
8077
|
+
actor,
|
|
8078
|
+
authorSecret,
|
|
8079
|
+
authToken
|
|
8080
|
+
}) => {
|
|
8081
|
+
const signingSecret = authorSecret || deviceSecret;
|
|
8082
|
+
if (!target) throw new TypeError("a remote generated offer requires its target workspace");
|
|
8083
|
+
if (!actor) throw new TypeError("a remote generated offer requires its attributable actor");
|
|
8084
|
+
if (!signingSecret) throw new TypeError("a remote generated offer requires an enrolled device key");
|
|
8085
|
+
const sealed = await signWorkspaceOffer({
|
|
8086
|
+
target,
|
|
8087
|
+
call,
|
|
8088
|
+
actor,
|
|
8089
|
+
authorSecret: signingSecret,
|
|
8090
|
+
authToken
|
|
8091
|
+
});
|
|
8092
|
+
const verdict = await g.postGovernanceOffer({
|
|
8093
|
+
directiveId: call.directive,
|
|
8094
|
+
intentBytes: sealed.intentBytes,
|
|
8095
|
+
ws: target,
|
|
8096
|
+
authToken,
|
|
8097
|
+
domain: call.domain
|
|
8098
|
+
});
|
|
8099
|
+
if (!verdict.ok || verdict.body && typeof verdict.body === "object" && (verdict.body.ok === false || verdict.body.refused)) {
|
|
8100
|
+
const detail = typeof verdict.body === "string" ? verdict.body : JSON.stringify(verdict.body ?? "remote offer refused");
|
|
8101
|
+
throw new NomosClientError(
|
|
8102
|
+
`Remote generated call '${call.domain}/${call.directive}' was refused by '${target}': ${detail.slice(0, 500)}`,
|
|
8103
|
+
{
|
|
8104
|
+
code: "nomos.offer.remote_refused",
|
|
8105
|
+
workspace: target,
|
|
8106
|
+
operation: call.directive,
|
|
8107
|
+
recommendedAction: NomosRecommendedAction.retry,
|
|
8108
|
+
info: verdict.errorInfo
|
|
8109
|
+
}
|
|
8110
|
+
);
|
|
8111
|
+
}
|
|
8112
|
+
const body = verdict.body && typeof verdict.body === "object" ? verdict.body : void 0;
|
|
8113
|
+
const head = verdict.head ?? (typeof body?.head === "string" ? body.head : "");
|
|
8114
|
+
return { workspace: target, head };
|
|
8115
|
+
},
|
|
7947
8116
|
/**
|
|
7948
8117
|
* Derive the device key's base64 PUBLIC half from its base64 SECRET seed, IN the local wasm (the
|
|
7949
8118
|
* kernel `attestation_sign` op returns the public half; the secret never leaves this process).
|
|
@@ -8130,7 +8299,10 @@ function createGovernanceOffers(ctx) {
|
|
|
8130
8299
|
*/
|
|
8131
8300
|
ensureParentSignerEnrollment: async (args = {}) => {
|
|
8132
8301
|
const { parent, device, domain, grantedAt, authToken, idToken, signIn, verifiedVia, validFromEpoch = 0, frameworkCalls } = args;
|
|
8133
|
-
const
|
|
8302
|
+
const effectiveAuthToken = authToken || connectionAuthToken();
|
|
8303
|
+
const effectiveIdToken = idToken || effectiveAuthToken;
|
|
8304
|
+
const effectiveFrameworkCalls = frameworkCalls ?? connectionFrameworkCalls;
|
|
8305
|
+
const keyless = !!(effectiveIdToken || typeof signIn === "function");
|
|
8134
8306
|
const directiveId = args.directiveId || (keyless ? "enrollFirstDevice" : "enrollSigner");
|
|
8135
8307
|
const principal = canonicalPrincipal(args.principal);
|
|
8136
8308
|
let publicKey = device && device.public || args.publicKey;
|
|
@@ -8140,13 +8312,13 @@ function createGovernanceOffers(ctx) {
|
|
|
8140
8312
|
if (!publicKey && authorSecret) publicKey = await g.devicePublicOf(authorSecret);
|
|
8141
8313
|
if (!publicKey) throw new Error("ensureParentSignerEnrollment requires the device `publicKey` (pass `device`/`publicKey`, or a secret it can be derived from)");
|
|
8142
8314
|
const keyHash = await sha256hexBytes2(bytesUnb642(publicKey));
|
|
8143
|
-
const posture = await g.parentSignerEnrollment({ parent, principal, keyHash, authToken });
|
|
8315
|
+
const posture = await g.parentSignerEnrollment({ parent, principal, keyHash, authToken: effectiveAuthToken });
|
|
8144
8316
|
if (posture.enrolled) return { parent, principal, keyHash, enrolled: true, repaired: false, checkedAt: posture.checkedAt };
|
|
8145
8317
|
if (posture.revoked) {
|
|
8146
8318
|
throw new Error(`ensureParentSignerEnrollment: key ${keyHash.slice(0, 16)}\u2026 was REVOKED on ${parent} (${signerObjectOf(principal)}#signer is remove-wins) \u2014 mint a new device key and enroll it; a revoked key cannot be lawfully re-enrolled [nomos.authz.signer_revoked]`);
|
|
8147
8319
|
}
|
|
8148
8320
|
if (!authorSecret) throw new Error("ensureParentSignerEnrollment: the signer tuple is absent on the parent and no `authorSecret`/`device.secret` was supplied to lawfully re-enroll it");
|
|
8149
|
-
const token = keyless ? typeof signIn === "function" ? await signIn(keyHash) :
|
|
8321
|
+
const token = keyless ? typeof signIn === "function" ? await signIn(keyHash) : effectiveIdToken : null;
|
|
8150
8322
|
let resolved = domain ? { domain, directiveId } : null;
|
|
8151
8323
|
let enrollmentRoute;
|
|
8152
8324
|
if (!resolved && parent === workspace && typeof installedInterfaceInner === "function") {
|
|
@@ -8171,7 +8343,7 @@ function createGovernanceOffers(ctx) {
|
|
|
8171
8343
|
}
|
|
8172
8344
|
resolved = { domain: enrollmentRoute.domain, directiveId };
|
|
8173
8345
|
}
|
|
8174
|
-
if (!resolved) resolved = await g.discoverDirectiveDomain({ ws: parent, directiveId, authToken });
|
|
8346
|
+
if (!resolved) resolved = await g.discoverDirectiveDomain({ ws: parent, directiveId, authToken: effectiveAuthToken });
|
|
8175
8347
|
let delegationPayload;
|
|
8176
8348
|
if (keyless) {
|
|
8177
8349
|
if (typeof mintKeylessDelegation2 !== "function") throw new Error("ensureParentSignerEnrollment: the keyless lane needs a signing holon (mintKeylessDelegation) to build the delegation cert \u2014 open the holon with a device key");
|
|
@@ -8193,12 +8365,29 @@ function createGovernanceOffers(ctx) {
|
|
|
8193
8365
|
}
|
|
8194
8366
|
const issuerClaim = verifiedVia || (token ? jwtClaimOf(token, "iss") : void 0);
|
|
8195
8367
|
const payload = keyless ? { keyHash, verifiedVia: issuerClaim, validFromEpoch, grantedAt: (/* @__PURE__ */ new Date()).toISOString(), idpToken: token, ...delegationPayload ?? {} } : { keyHash, grantedBy: principal, grantedAt: typeof grantedAt === "number" ? grantedAt : Date.now() };
|
|
8196
|
-
if (
|
|
8197
|
-
|
|
8368
|
+
if (effectiveFrameworkCalls === void 0) {
|
|
8369
|
+
const message = "The installed client cannot author the typed enrollFirstDevice call required to seat this device";
|
|
8370
|
+
throw new NomosClientError(message, {
|
|
8371
|
+
code: "nomos.application.contract_missing",
|
|
8372
|
+
workspace: parent,
|
|
8373
|
+
operation: "enrollFirstDevice",
|
|
8374
|
+
recommendedAction: NomosRecommendedAction.redeployLaw,
|
|
8375
|
+
info: {
|
|
8376
|
+
code: "nomos.application.contract_missing",
|
|
8377
|
+
message,
|
|
8378
|
+
component: "nomos.application",
|
|
8379
|
+
workspace: parent,
|
|
8380
|
+
operation: "enrollFirstDevice",
|
|
8381
|
+
attributes: {
|
|
8382
|
+
"nomos.application.missing_contract": "generatedFrameworkCalls.identity.enrollFirstDevice",
|
|
8383
|
+
"nomos.recovery.action": "request-parent-authorized-device-recovery"
|
|
8384
|
+
}
|
|
8385
|
+
}
|
|
8386
|
+
});
|
|
8198
8387
|
}
|
|
8199
8388
|
const call = keyless ? (() => {
|
|
8200
8389
|
if (typeof issuerClaim !== "string" || !issuerClaim || !token) throw new Error("verified first-device enrollment needs its typed issuer and identity proof");
|
|
8201
|
-
return
|
|
8390
|
+
return effectiveFrameworkCalls.identity.enrollFirstDevice({
|
|
8202
8391
|
domain: resolved.domain,
|
|
8203
8392
|
workspace: parent,
|
|
8204
8393
|
keyHash,
|
|
@@ -8208,7 +8397,7 @@ function createGovernanceOffers(ctx) {
|
|
|
8208
8397
|
idpToken: token,
|
|
8209
8398
|
...delegationPayload ?? {}
|
|
8210
8399
|
});
|
|
8211
|
-
})() :
|
|
8400
|
+
})() : effectiveFrameworkCalls.identity.enrollSigner({
|
|
8212
8401
|
domain: resolved.domain,
|
|
8213
8402
|
workspace: parent,
|
|
8214
8403
|
keyHash,
|
|
@@ -8220,7 +8409,7 @@ function createGovernanceOffers(ctx) {
|
|
|
8220
8409
|
const res = await offerCall(call, { actor: principal, signWith: authorSecret });
|
|
8221
8410
|
verdict = { ok: true, status: 200, body: res };
|
|
8222
8411
|
} else {
|
|
8223
|
-
const bearer =
|
|
8412
|
+
const bearer = effectiveAuthToken || token;
|
|
8224
8413
|
const sealed = await signWorkspaceOffer({
|
|
8225
8414
|
target: parent,
|
|
8226
8415
|
call,
|
|
@@ -8592,23 +8781,46 @@ function connectRemote(opts) {
|
|
|
8592
8781
|
}
|
|
8593
8782
|
const entropy = new Uint32Array(16);
|
|
8594
8783
|
crypto.getRandomValues(entropy);
|
|
8595
|
-
const
|
|
8596
|
-
|
|
8597
|
-
{
|
|
8598
|
-
|
|
8599
|
-
|
|
8600
|
-
|
|
8601
|
-
|
|
8602
|
-
|
|
8603
|
-
|
|
8604
|
-
|
|
8784
|
+
const target = { repo: `/work/ws/${workspace}`, workspace, branch: "main" };
|
|
8785
|
+
const capturedPorts = {
|
|
8786
|
+
clock: { physical: Date.now(), logical: 0, replica: entropy[0] ?? 0 },
|
|
8787
|
+
rng: [...entropy].map((value) => value / 4294967296)
|
|
8788
|
+
};
|
|
8789
|
+
const actor = o?.actor ?? principal ?? "";
|
|
8790
|
+
const preparedRequest = o?.modelLifecycle === void 0 ? createDirectiveOfferRequest(target, {
|
|
8791
|
+
domain,
|
|
8792
|
+
directiveId,
|
|
8793
|
+
payload: callUsda,
|
|
8794
|
+
capturedPorts,
|
|
8795
|
+
sequence: requestSequence + 1n,
|
|
8796
|
+
actor,
|
|
8797
|
+
authToken: opts.authToken && !opts.authorSecret ? opts.authToken : void 0,
|
|
8798
|
+
spans: true,
|
|
8799
|
+
prepareOnly: true,
|
|
8800
|
+
lawUsdz: o?.lawUsdz,
|
|
8801
|
+
domainHash: o?.domainHash
|
|
8802
|
+
}) : createModelLifecycleOfferRequest(
|
|
8803
|
+
target,
|
|
8804
|
+
o.modelLifecycle.operation === "stage" ? {
|
|
8805
|
+
operation: ModelLifecycleOperation.STAGE,
|
|
8806
|
+
installedBy: o.modelLifecycle.installedBy,
|
|
8807
|
+
supersedes: o.modelLifecycle.supersedes,
|
|
8808
|
+
lawUsdz: o.lawUsdz ?? new Uint8Array(),
|
|
8809
|
+
capturedPorts,
|
|
8605
8810
|
sequence: requestSequence + 1n,
|
|
8606
|
-
actor
|
|
8607
|
-
authToken: opts.authToken && !opts.authorSecret ? opts.authToken : void 0,
|
|
8811
|
+
actor,
|
|
8608
8812
|
spans: true,
|
|
8609
|
-
prepareOnly: true
|
|
8610
|
-
|
|
8611
|
-
|
|
8813
|
+
prepareOnly: true
|
|
8814
|
+
} : {
|
|
8815
|
+
operation: ModelLifecycleOperation.PROMOTE,
|
|
8816
|
+
transition: o.modelLifecycle.transition,
|
|
8817
|
+
replaces: o.modelLifecycle.replaces,
|
|
8818
|
+
acceptanceReason: o.modelLifecycle.acceptanceReason,
|
|
8819
|
+
capturedPorts,
|
|
8820
|
+
sequence: requestSequence + 1n,
|
|
8821
|
+
actor,
|
|
8822
|
+
spans: true,
|
|
8823
|
+
prepareOnly: true
|
|
8612
8824
|
}
|
|
8613
8825
|
);
|
|
8614
8826
|
const offerRequest2 = toBinary4(OfferRequestSchema, preparedRequest);
|
|
@@ -8765,6 +8977,39 @@ function connectRemote(opts) {
|
|
|
8765
8977
|
const call = requireGeneratedCall(value, "remote offerCall");
|
|
8766
8978
|
return offerDirective(call.domain, call.directive, call.canonicalUsda, o);
|
|
8767
8979
|
}
|
|
8980
|
+
const offerModelLifecycle = (lifecycle) => offerDirective("nomos", "", new Uint8Array(), {
|
|
8981
|
+
actor: lifecycle.actor,
|
|
8982
|
+
lawUsdz: lifecycle.operation === "stage" ? lifecycle.lawUsdz : void 0,
|
|
8983
|
+
modelLifecycle: lifecycle
|
|
8984
|
+
});
|
|
8985
|
+
const frontierTransition2 = async (request) => {
|
|
8986
|
+
const response = await kernelRuntime({
|
|
8987
|
+
case: "query",
|
|
8988
|
+
value: create5(QueryRequestSchema, {
|
|
8989
|
+
target: create5(WorkspaceTargetSchema, {
|
|
8990
|
+
repo: `/work/ws/${workspace}`,
|
|
8991
|
+
workspace,
|
|
8992
|
+
branch: "main"
|
|
8993
|
+
}),
|
|
8994
|
+
query: {
|
|
8995
|
+
case: "frontierTransition",
|
|
8996
|
+
value: create5(FrontierTransitionRequestSchema, {
|
|
8997
|
+
domain: request.domain,
|
|
8998
|
+
candidateHash: request.candidateHash,
|
|
8999
|
+
atHash: request.atHash,
|
|
9000
|
+
acknowledgementPrincipal: request.acknowledgementPrincipal ?? principal ?? "",
|
|
9001
|
+
restorePreviousOf: request.restorePreviousOf
|
|
9002
|
+
})
|
|
9003
|
+
}
|
|
9004
|
+
})
|
|
9005
|
+
});
|
|
9006
|
+
if (response.outcome.case !== "query" || response.outcome.value.result.case !== "frontierTransition") {
|
|
9007
|
+
throw new Error(
|
|
9008
|
+
`kernel returned '${response.outcome.case || "empty"}' for frontier transition`
|
|
9009
|
+
);
|
|
9010
|
+
}
|
|
9011
|
+
return response.outcome.value.result.value;
|
|
9012
|
+
};
|
|
8768
9013
|
const query3 = async (queryId, params) => {
|
|
8769
9014
|
const response = await kernelRuntime({
|
|
8770
9015
|
case: "query",
|
|
@@ -9098,6 +9343,8 @@ function connectRemote(opts) {
|
|
|
9098
9343
|
cloud: base,
|
|
9099
9344
|
principal,
|
|
9100
9345
|
offerCall,
|
|
9346
|
+
__nomosOfferModelLifecycle: offerModelLifecycle,
|
|
9347
|
+
__nomosFrontierTransition: frontierTransition2,
|
|
9101
9348
|
head,
|
|
9102
9349
|
query: query3,
|
|
9103
9350
|
queryById,
|
|
@@ -9368,13 +9615,17 @@ function installedLawOfRows(rows) {
|
|
|
9368
9615
|
}
|
|
9369
9616
|
return out15;
|
|
9370
9617
|
}
|
|
9371
|
-
function lawStatusOf(installed, clientHash) {
|
|
9618
|
+
function lawStatusOf(installed, clientHash, current) {
|
|
9372
9619
|
const known = Array.isArray(installed);
|
|
9373
9620
|
const list = known ? installed : [];
|
|
9621
|
+
const currentSupplied = current !== void 0;
|
|
9622
|
+
const currentKnown = currentSupplied ? Array.isArray(current) : known;
|
|
9623
|
+
const serving = currentSupplied ? Array.isArray(current) ? current : [] : list;
|
|
9374
9624
|
return {
|
|
9375
9625
|
installed: list,
|
|
9376
9626
|
...clientHash !== void 0 ? { clientHash } : {},
|
|
9377
|
-
|
|
9627
|
+
...currentSupplied ? { current } : {},
|
|
9628
|
+
drifted: !!(clientHash !== void 0 && currentKnown && !serving.includes(clientHash))
|
|
9378
9629
|
};
|
|
9379
9630
|
}
|
|
9380
9631
|
function lawDriftMessage({
|
|
@@ -9663,6 +9914,25 @@ ${String(commit).toLowerCase()}`;
|
|
|
9663
9914
|
}
|
|
9664
9915
|
};
|
|
9665
9916
|
};
|
|
9917
|
+
if (!restoreFrom && !mountInPlace && !localOnly && !salvageOnly && !recover) {
|
|
9918
|
+
const _coldSnapshot = span(
|
|
9919
|
+
"receive",
|
|
9920
|
+
"boot: fetch checkpointed custody snapshot",
|
|
9921
|
+
"cfetch"
|
|
9922
|
+
);
|
|
9923
|
+
try {
|
|
9924
|
+
const response = await _fetch(
|
|
9925
|
+
`${base}/v2/workspaces/${workspace}/snapshot`,
|
|
9926
|
+
{ headers: authHeaders }
|
|
9927
|
+
);
|
|
9928
|
+
if (response.ok && response.headers.get("x-nomos-layout") === "local-custody-v3") {
|
|
9929
|
+
restoreFrom = new Uint8Array(await response.arrayBuffer());
|
|
9930
|
+
}
|
|
9931
|
+
} catch {
|
|
9932
|
+
} finally {
|
|
9933
|
+
_coldSnapshot.end({ restored: !!restoreFrom });
|
|
9934
|
+
}
|
|
9935
|
+
}
|
|
9666
9936
|
const repoArg = `/work/ws/${workspace}`;
|
|
9667
9937
|
const provider = kernelProvider || createWasmKernelProvider({ span });
|
|
9668
9938
|
const readRemoteInfo = async () => ({
|
|
@@ -9932,10 +10202,12 @@ ${String(commit).toLowerCase()}`;
|
|
|
9932
10202
|
const watchStops = /* @__PURE__ */ new Set();
|
|
9933
10203
|
let installedLawRowsCache;
|
|
9934
10204
|
let installedLawCurrentCache;
|
|
10205
|
+
let installedLawCurrentError = "";
|
|
9935
10206
|
let installedInterfaceCache;
|
|
9936
10207
|
const invalidateInstalledLawMetadata = () => {
|
|
9937
10208
|
installedLawRowsCache = void 0;
|
|
9938
10209
|
installedLawCurrentCache = void 0;
|
|
10210
|
+
installedLawCurrentError = "";
|
|
9939
10211
|
installedInterfaceCache = void 0;
|
|
9940
10212
|
};
|
|
9941
10213
|
let _disposed = false;
|
|
@@ -9982,17 +10254,19 @@ ${String(commit).toLowerCase()}`;
|
|
|
9982
10254
|
scheduleMaintenanceSoon();
|
|
9983
10255
|
};
|
|
9984
10256
|
const prepareDomainReady = async (domain, packageHash, directiveId) => {
|
|
9985
|
-
|
|
10257
|
+
const currentPackage = currentLawInner()?.[domain];
|
|
10258
|
+
const servingPackage = typeof currentPackage === "string" && currentPackage.length > 0 ? currentPackage : packageHash;
|
|
10259
|
+
requestDomainMaintenance(domain, servingPackage, directiveId);
|
|
9986
10260
|
const readiness2 = await prepareDomainUntilReady({
|
|
9987
10261
|
domain,
|
|
9988
|
-
packageHash,
|
|
10262
|
+
packageHash: servingPackage,
|
|
9989
10263
|
directiveId,
|
|
9990
10264
|
warm: () => serialize(
|
|
9991
10265
|
async () => namedQueryTyped(QueryOperation.WARM, {
|
|
9992
10266
|
interactiveOnly: true,
|
|
9993
10267
|
requestedDomain: domain,
|
|
9994
10268
|
...directiveId ? { requestedDirective: directiveId } : {},
|
|
9995
|
-
requestedPackage:
|
|
10269
|
+
requestedPackage: servingPackage
|
|
9996
10270
|
}),
|
|
9997
10271
|
"prepare generated domain",
|
|
9998
10272
|
false
|
|
@@ -10005,7 +10279,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
10005
10279
|
});
|
|
10006
10280
|
if (readiness2.prepared) {
|
|
10007
10281
|
const index = _maintenanceTargets.findIndex(
|
|
10008
|
-
(target) => target.domain === domain && target.packageHash ===
|
|
10282
|
+
(target) => target.domain === domain && target.packageHash === servingPackage && target.directiveId === directiveId
|
|
10009
10283
|
);
|
|
10010
10284
|
if (index >= 0) _maintenanceTargets.splice(index, 1);
|
|
10011
10285
|
}
|
|
@@ -10680,7 +10954,9 @@ ${String(commit).toLowerCase()}`;
|
|
|
10680
10954
|
const answer = namedQueryTyped(QueryOperation.INSTALLED_LAW);
|
|
10681
10955
|
if (Array.isArray(answer?.domains)) {
|
|
10682
10956
|
const currentLaw2 = answer?.currentLaw;
|
|
10683
|
-
|
|
10957
|
+
if (currentLaw2 && typeof currentLaw2 === "object" && !Array.isArray(currentLaw2)) {
|
|
10958
|
+
installedLawCurrentCache = currentLaw2;
|
|
10959
|
+
}
|
|
10684
10960
|
installedLawRowsCache = answer.domains.map(
|
|
10685
10961
|
(domain) => ({
|
|
10686
10962
|
id: domain.installationId,
|
|
@@ -10724,21 +11000,36 @@ ${String(commit).toLowerCase()}`;
|
|
|
10724
11000
|
return installedLawRowsCache;
|
|
10725
11001
|
};
|
|
10726
11002
|
const currentLawInner = () => {
|
|
10727
|
-
installRowsInner();
|
|
10728
11003
|
if (installedLawCurrentCache !== void 0) return installedLawCurrentCache;
|
|
10729
11004
|
try {
|
|
10730
11005
|
const answer = namedQueryTyped(QueryOperation.CURRENT_LAW);
|
|
10731
11006
|
const current = answer?.keyMap ?? answer?.currentLaw ?? answer;
|
|
10732
|
-
|
|
10733
|
-
|
|
10734
|
-
|
|
11007
|
+
if (current && typeof current === "object" && !Array.isArray(current)) {
|
|
11008
|
+
installedLawCurrentError = "";
|
|
11009
|
+
installedLawCurrentCache = current;
|
|
11010
|
+
return installedLawCurrentCache;
|
|
11011
|
+
}
|
|
11012
|
+
installedLawCurrentError = "kernel current-law read returned no typed domain map";
|
|
11013
|
+
} catch (error) {
|
|
11014
|
+
installedLawCurrentError = String(
|
|
11015
|
+
error?.message || error || "kernel current-law read failed"
|
|
11016
|
+
);
|
|
10735
11017
|
}
|
|
10736
|
-
return
|
|
11018
|
+
return null;
|
|
10737
11019
|
};
|
|
10738
11020
|
const installedLawInner = () => {
|
|
10739
11021
|
const rows = installRowsInner();
|
|
10740
11022
|
return rows === null ? null : installedLawOfRows(rows);
|
|
10741
11023
|
};
|
|
11024
|
+
const currentLawHashesInner = () => {
|
|
11025
|
+
const current = currentLawInner();
|
|
11026
|
+
if (current === null) return null;
|
|
11027
|
+
return [...new Set(
|
|
11028
|
+
Object.values(current).filter(
|
|
11029
|
+
(identity) => typeof identity === "string" && identity.length > 0
|
|
11030
|
+
)
|
|
11031
|
+
)];
|
|
11032
|
+
};
|
|
10742
11033
|
const recomputeCompat = ({ silent = false } = {}) => {
|
|
10743
11034
|
if (!compatState) return null;
|
|
10744
11035
|
const installRows = installRowsInner();
|
|
@@ -10892,16 +11183,28 @@ ${String(commit).toLowerCase()}`;
|
|
|
10892
11183
|
);
|
|
10893
11184
|
}
|
|
10894
11185
|
let pack = null;
|
|
11186
|
+
const packErrors = [];
|
|
10895
11187
|
for (const base2 of bases) {
|
|
10896
11188
|
try {
|
|
10897
11189
|
pack = provider.packDelta(base2, head);
|
|
10898
|
-
} catch {
|
|
11190
|
+
} catch (error) {
|
|
11191
|
+
packErrors.push(`${base2 ?? "<full>"}: ${String(error)}`);
|
|
10899
11192
|
pack = null;
|
|
10900
11193
|
}
|
|
10901
11194
|
if (pack) break;
|
|
10902
11195
|
}
|
|
10903
|
-
if (!pack)
|
|
10904
|
-
|
|
11196
|
+
if (!pack) {
|
|
11197
|
+
const missingOid = packErrors.join(" ").match(/(?:object with id|find commit) ([0-9a-f]{40})/i)?.[1];
|
|
11198
|
+
const objectBytes = (oid) => ["nomos.git/objects", "objects", ".git/objects"].map((root) => {
|
|
11199
|
+
const bytes = provider.readWsFile(
|
|
11200
|
+
`${root}/${oid.slice(0, 2)}/${oid.slice(2)}`
|
|
11201
|
+
);
|
|
11202
|
+
return `${root}=${bytes?.byteLength ?? 0}B`;
|
|
11203
|
+
}).join(",");
|
|
11204
|
+
throw new Error(
|
|
11205
|
+
`the kernel could not build the candidate custody pack${packErrors.length === 0 ? "" : ` (${packErrors[0]})`}; head[${objectBytes(head)}]${missingOid ? `; missing[${objectBytes(missingOid)}]` : ""}`
|
|
11206
|
+
);
|
|
11207
|
+
}
|
|
10905
11208
|
await pushPack(
|
|
10906
11209
|
remote,
|
|
10907
11210
|
authHeaders,
|
|
@@ -12049,6 +12352,10 @@ ${String(commit).toLowerCase()}`;
|
|
|
12049
12352
|
error: "the generated model identity is missing"
|
|
12050
12353
|
};
|
|
12051
12354
|
}
|
|
12355
|
+
const currentHash = String(currentLawInner()?.[domain] ?? "");
|
|
12356
|
+
if (currentHash === candidateHash) {
|
|
12357
|
+
return { ok: true, stage: "already-current" };
|
|
12358
|
+
}
|
|
12052
12359
|
const candidateInstallation = (installRowsInner() ?? []).find(
|
|
12053
12360
|
(row) => row?.id === `domain-installation:${candidateHash}`
|
|
12054
12361
|
);
|
|
@@ -12062,23 +12369,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
12062
12369
|
error: candidatePhase.length === 0 ? `model '${candidateHash}' is not staged in this workspace; deploy the generated USDA package before opening this application` : `model '${candidateHash}' is '${candidatePhase}', so it cannot become current`
|
|
12063
12370
|
};
|
|
12064
12371
|
}
|
|
12065
|
-
const currentHash = String(currentLawInner()?.[domain] ?? "");
|
|
12066
12372
|
if (candidatePhase === "Active") {
|
|
12067
|
-
|
|
12068
|
-
const readiness2 = await prepareDomainReady(domain, candidateHash);
|
|
12069
|
-
if (readiness2.prepared !== true) {
|
|
12070
|
-
throw new Error(
|
|
12071
|
-
`the admitted model '${candidateHash}' authenticated '${domain}' USDA slice did not become ready (${readiness2.reason} after ${readiness2.quanta} maintenance quanta)`
|
|
12072
|
-
);
|
|
12073
|
-
}
|
|
12074
|
-
return { ok: true, stage: "already-current" };
|
|
12075
|
-
} catch (error) {
|
|
12076
|
-
return {
|
|
12077
|
-
ok: false,
|
|
12078
|
-
stage: "preflight",
|
|
12079
|
-
error: String(error?.message || error)
|
|
12080
|
-
};
|
|
12081
|
-
}
|
|
12373
|
+
return { ok: true, stage: "already-current" };
|
|
12082
12374
|
}
|
|
12083
12375
|
let report;
|
|
12084
12376
|
let transition;
|
|
@@ -12217,12 +12509,13 @@ ${String(commit).toLowerCase()}`;
|
|
|
12217
12509
|
);
|
|
12218
12510
|
const data = row?.data;
|
|
12219
12511
|
const domainKeys = Array.isArray(data?.["spec.domainKeys"]) ? data["spec.domainKeys"].map(String) : [];
|
|
12220
|
-
|
|
12512
|
+
const exactSingleDomain = String(data?.["spec.domainHash"] ?? "") === candidateHash && String(currentLawInner()?.[domain] ?? "") === candidateHash && domainKeys.length === 0;
|
|
12513
|
+
if (!data || !domainKeys.includes(domain) && !exactSingleDomain) return null;
|
|
12221
12514
|
return {
|
|
12222
12515
|
hash: candidateHash,
|
|
12223
12516
|
phase: String(data["status.phase"] ?? ""),
|
|
12224
12517
|
dependencies: Array.isArray(data["spec.dependencies"]) ? data["spec.dependencies"].map(String) : [],
|
|
12225
|
-
domainKeys
|
|
12518
|
+
domainKeys: exactSingleDomain ? [domain] : domainKeys
|
|
12226
12519
|
};
|
|
12227
12520
|
};
|
|
12228
12521
|
const _nomosStageGeneratedModel = async (domain, candidateHash, lawUsdz, dependencies) => {
|
|
@@ -12246,14 +12539,10 @@ ${String(commit).toLowerCase()}`;
|
|
|
12246
12539
|
`generated model '${candidateHash}' has no USDZ transport asset`
|
|
12247
12540
|
);
|
|
12248
12541
|
}
|
|
12249
|
-
const
|
|
12250
|
-
const data = entry?.data;
|
|
12251
|
-
return String(data?.["status.phase"] ?? "") === "Active" && Array.isArray(data?.["spec.domainKeys"]) && data["spec.domainKeys"].map(String).includes(domain);
|
|
12252
|
-
});
|
|
12253
|
-
const priorHash = String(predecessor?.data?.["spec.domainHash"] ?? "");
|
|
12542
|
+
const priorHash = String(currentLawInner()?.[domain] ?? "");
|
|
12254
12543
|
if (!priorHash) {
|
|
12255
12544
|
throw new Error(
|
|
12256
|
-
`generated application cannot identify the active '${domain}' model it would supersede`
|
|
12545
|
+
`generated application cannot identify the active '${domain}' model it would supersede` + (installedLawCurrentError ? `: ${installedLawCurrentError}` : "")
|
|
12257
12546
|
);
|
|
12258
12547
|
}
|
|
12259
12548
|
const head = await offerDirective(
|
|
@@ -13944,6 +14233,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
13944
14233
|
workspace,
|
|
13945
14234
|
deviceSecret,
|
|
13946
14235
|
authHeaders,
|
|
14236
|
+
connectionAuthToken: () => activeAuthToken,
|
|
14237
|
+
connectionFrameworkCalls: frameworkCalls,
|
|
13947
14238
|
receivingGroupNameOf,
|
|
13948
14239
|
sha256hexBytes,
|
|
13949
14240
|
bytesUnb64,
|
|
@@ -15347,6 +15638,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
15347
15638
|
"application-open"
|
|
15348
15639
|
);
|
|
15349
15640
|
let requiredParentCustodyHead;
|
|
15641
|
+
let requiredDelegationKeyHash;
|
|
15350
15642
|
try {
|
|
15351
15643
|
if (spec.idToken || typeof spec.signIn === "function") {
|
|
15352
15644
|
const enrollment = await api.enrollFirstDevice({
|
|
@@ -15363,6 +15655,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
15363
15655
|
enrollFirstDeviceCall: spec.enrollFirstDeviceCall
|
|
15364
15656
|
});
|
|
15365
15657
|
requiredParentCustodyHead = enrollment.verdict?.head;
|
|
15658
|
+
requiredDelegationKeyHash = enrollment.keyHash;
|
|
15366
15659
|
if (!requiredParentCustodyHead || !OID40_RE.test(requiredParentCustodyHead)) {
|
|
15367
15660
|
throw new Error(
|
|
15368
15661
|
`enrollFirstDevice at '${parent}' admitted without an exact custody head; refusing to prepare birth against an unbound resident frontier`
|
|
@@ -15413,9 +15706,16 @@ ${String(commit).toLowerCase()}`;
|
|
|
15413
15706
|
}
|
|
15414
15707
|
);
|
|
15415
15708
|
if (dq.ok) {
|
|
15416
|
-
const
|
|
15417
|
-
const
|
|
15418
|
-
|
|
15709
|
+
const response = await dq.json().catch(() => null);
|
|
15710
|
+
const rows = Array.isArray(response) ? response : response && Array.isArray(response.rows) ? response.rows : [];
|
|
15711
|
+
const hasExactDeviceDelegation = rows.some((row) => {
|
|
15712
|
+
if (!row || typeof row !== "object") return false;
|
|
15713
|
+
const data = row.data;
|
|
15714
|
+
if (!data || typeof data !== "object") return false;
|
|
15715
|
+
const fields = data;
|
|
15716
|
+
return fields.certificateParentKey === device.public && (requiredDelegationKeyHash === void 0 || fields.deviceKey === `key:${requiredDelegationKeyHash}`);
|
|
15717
|
+
});
|
|
15718
|
+
if (hasExactDeviceDelegation) {
|
|
15419
15719
|
sawDelegation = true;
|
|
15420
15720
|
break;
|
|
15421
15721
|
}
|
|
@@ -15426,7 +15726,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
15426
15726
|
}
|
|
15427
15727
|
if (!sawDelegation) {
|
|
15428
15728
|
const err15 = new Error(
|
|
15429
|
-
`receiving-group setup: parent '${parent}' still holds NO SignerDelegation for '${owner}' after ${pollTimeoutMs}ms. enrollFirstDevice seated the device SIGNER, but the home cert chain's links[1] (the platform-signed delegation) never surfaced \u2014 the birth would
|
|
15729
|
+
`receiving-group setup: parent '${parent}' still holds NO SignerDelegation for '${owner}' after ${pollTimeoutMs}ms. enrollFirstDevice seated the device SIGNER, but the home cert chain's links[1] (the platform-signed delegation for device '${String(requiredDelegationKeyHash ?? "unknown").slice(0, 12)}\u2026') never surfaced \u2014 the birth would combine different device generations and fail its certificate chain. The enroll must record the keyless delegation (enrollFirstDevice.delegationCert) BEFORE birth. [ParentSignerDelegationMissing]`
|
|
15430
15730
|
);
|
|
15431
15731
|
err15.code = "ParentSignerDelegationMissing";
|
|
15432
15732
|
throw err15;
|
|
@@ -15640,7 +15940,22 @@ ${String(commit).toLowerCase()}`;
|
|
|
15640
15940
|
* lifecycle view: active = served now; superseded/retired = replayable, not served.
|
|
15641
15941
|
* `drifted` is true ONLY on the word of a successful read.
|
|
15642
15942
|
*/
|
|
15643
|
-
lawStatus: () => serialize(async () =>
|
|
15943
|
+
lawStatus: () => serialize(async () => {
|
|
15944
|
+
const currentLaw2 = currentLawInner();
|
|
15945
|
+
const current = currentLawHashesInner();
|
|
15946
|
+
const status2 = lawStatusOf(
|
|
15947
|
+
installedLawRowsCache === void 0 ? null : installedLawInner(),
|
|
15948
|
+
clientLawHash,
|
|
15949
|
+
current
|
|
15950
|
+
);
|
|
15951
|
+
console.error(
|
|
15952
|
+
`[nomos-law-status] workspace=${workspace} client=${status2.clientHash ?? "unregistered"} current=${status2.current?.join(",") ?? "unknown"} installed=${status2.installed.join(",")} drifted=${status2.drifted}`
|
|
15953
|
+
);
|
|
15954
|
+
return {
|
|
15955
|
+
...status2,
|
|
15956
|
+
currentDomains: currentLaw2 === null ? null : Object.keys(currentLaw2).sort()
|
|
15957
|
+
};
|
|
15958
|
+
}),
|
|
15644
15959
|
/**
|
|
15645
15960
|
* Register the BAKED law hash this client was generated under — the soft-warn lane:
|
|
15646
15961
|
* if the workspace's installed law doesn't carry it, ONE console.warn names the drift
|
|
@@ -15654,7 +15969,16 @@ ${String(commit).toLowerCase()}`;
|
|
|
15654
15969
|
"registerLawHash(hash) requires the generated client's baked law hash (the 64-hex sha256 of its package)"
|
|
15655
15970
|
);
|
|
15656
15971
|
clientLawHash = hash;
|
|
15657
|
-
const
|
|
15972
|
+
const currentLaw2 = currentLawInner();
|
|
15973
|
+
const current = currentLawHashesInner();
|
|
15974
|
+
const status2 = lawStatusOf(
|
|
15975
|
+
installedLawRowsCache === void 0 ? null : installedLawInner(),
|
|
15976
|
+
clientLawHash,
|
|
15977
|
+
current
|
|
15978
|
+
);
|
|
15979
|
+
console.error(
|
|
15980
|
+
`[nomos-law-status] workspace=${workspace} client=${status2.clientHash ?? "unregistered"} current=${status2.current?.join(",") ?? "unknown"} installed=${status2.installed.join(",")} drifted=${status2.drifted}`
|
|
15981
|
+
);
|
|
15658
15982
|
if (status2.drifted && !warnedDrift) {
|
|
15659
15983
|
warnedDrift = true;
|
|
15660
15984
|
console.warn(
|
|
@@ -15662,11 +15986,14 @@ ${String(commit).toLowerCase()}`;
|
|
|
15662
15986
|
what: "connect",
|
|
15663
15987
|
workspace,
|
|
15664
15988
|
clientHash: hash,
|
|
15665
|
-
installed: status2.installed
|
|
15989
|
+
installed: status2.current ?? status2.installed
|
|
15666
15990
|
})
|
|
15667
15991
|
);
|
|
15668
15992
|
}
|
|
15669
|
-
return
|
|
15993
|
+
return {
|
|
15994
|
+
...status2,
|
|
15995
|
+
currentDomains: currentLaw2 === null ? null : Object.keys(currentLaw2).sort()
|
|
15996
|
+
};
|
|
15670
15997
|
}),
|
|
15671
15998
|
/**
|
|
15672
15999
|
* THE COMPAT SUPERPOWER (#72b): the generated client factory hands over its baked `nomosCompat`
|
|
@@ -16245,7 +16572,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
16245
16572
|
if (result?.offline === true || result?.pushFailed === true || result?.reconnectRequired === true)
|
|
16246
16573
|
return result;
|
|
16247
16574
|
const localHead = await serialize(async () => resolveBranchHead());
|
|
16248
|
-
if (localHead === syncedBase) return result;
|
|
16575
|
+
if (localHead === syncedBase && !discoverRemote) return result;
|
|
16249
16576
|
return api.sync({ admit, discoverRemote });
|
|
16250
16577
|
});
|
|
16251
16578
|
}
|
|
@@ -17493,6 +17820,33 @@ async function openRealm(opts = {}) {
|
|
|
17493
17820
|
rebindWatches(name, holon);
|
|
17494
17821
|
return holon;
|
|
17495
17822
|
}
|
|
17823
|
+
async function deviceIdentity(secret) {
|
|
17824
|
+
const scratch = `nomos-device-${realmClientId}`;
|
|
17825
|
+
const holon = await mount(scratch, {
|
|
17826
|
+
allowUnborn: true,
|
|
17827
|
+
authToken: "",
|
|
17828
|
+
principal: "",
|
|
17829
|
+
clientId: `${realmClientId}:device-identity`
|
|
17830
|
+
}, { evict: false });
|
|
17831
|
+
try {
|
|
17832
|
+
if (typeof secret === "string" && secret.length > 0) {
|
|
17833
|
+
return { secret, public: await holon.devicePublicOf(secret) };
|
|
17834
|
+
}
|
|
17835
|
+
const created = await holon.authorKeygen();
|
|
17836
|
+
if (!created?.ok || !created.secret || !created.public) {
|
|
17837
|
+
throw new Error("the kernel did not return a complete device identity");
|
|
17838
|
+
}
|
|
17839
|
+
return { secret: created.secret, public: created.public };
|
|
17840
|
+
} finally {
|
|
17841
|
+
try {
|
|
17842
|
+
holon._dispose();
|
|
17843
|
+
} catch {
|
|
17844
|
+
}
|
|
17845
|
+
mounted.delete(scratch);
|
|
17846
|
+
parked.delete(scratch);
|
|
17847
|
+
plane.drop(scratch);
|
|
17848
|
+
}
|
|
17849
|
+
}
|
|
17496
17850
|
return {
|
|
17497
17851
|
/** The realm's stable client id (each workspace gets `${clientId}:${name}` unless overridden). */
|
|
17498
17852
|
clientId: realmClientId,
|
|
@@ -17500,6 +17854,8 @@ async function openRealm(opts = {}) {
|
|
|
17500
17854
|
plane,
|
|
17501
17855
|
/** Open (or mount-on-demand) a holon bound to `name` IN this plane. Same surface as `connect()` returns. */
|
|
17502
17856
|
workspace: (name, wsOpts = {}) => withGate(() => mount(name, wsOpts)),
|
|
17857
|
+
/** Kernel-owned device identity, prepared without reading or creating remote custody. */
|
|
17858
|
+
deviceIdentity: (secret) => withGate(() => deviceIdentity(secret)),
|
|
17503
17859
|
/** The realm's workspaces + their posture (mounted / parked / has-custody). */
|
|
17504
17860
|
list: () => {
|
|
17505
17861
|
const names = /* @__PURE__ */ new Set([
|
|
@@ -18151,6 +18507,16 @@ function prepareManagedPromotion2(report, candidateHash, domain, opts = {}) {
|
|
|
18151
18507
|
error: `the package-wide report does not cover the generated business area '${domain}'`
|
|
18152
18508
|
};
|
|
18153
18509
|
}
|
|
18510
|
+
const dispositions2 = report.dispositions;
|
|
18511
|
+
const changesStableIdentity = dispositions2 !== void 0 && (dispositions2.retired.length > 0 || Object.keys(dispositions2.retyped).length > 0 || Object.keys(dispositions2.rebinds).length > 0);
|
|
18512
|
+
if (changesStableIdentity && !acceptanceReason) {
|
|
18513
|
+
return {
|
|
18514
|
+
ok: false,
|
|
18515
|
+
stage: "acceptance",
|
|
18516
|
+
report,
|
|
18517
|
+
error: "the current-frontier transition changes stable business identities and needs an attributed acceptance reason"
|
|
18518
|
+
};
|
|
18519
|
+
}
|
|
18154
18520
|
const preflight = {
|
|
18155
18521
|
candidateHash,
|
|
18156
18522
|
// A package may be reached through any one of its generated domain clients. The
|
|
@@ -18511,7 +18877,7 @@ var init_lifecycle_calls2 = __esm({
|
|
|
18511
18877
|
|
|
18512
18878
|
// vendor/engine/proto/nomos/kernel/v1/kernel_pb.js
|
|
18513
18879
|
import { enumDesc as enumDesc4, fileDesc as fileDesc5, messageDesc as messageDesc5, serviceDesc as serviceDesc3, tsEnum as tsEnum4 } from "@bufbuild/protobuf/codegenv2";
|
|
18514
|
-
var file_nomos_kernel_v1_kernel2, CallRequestSchema2, CallResponseSchema2, PrepareRemoteOfferRequestSchema2, PrepareRemoteOfferResponseSchema2, ApplyWorkspaceEffectRequestSchema, ApplyWorkspaceEffectResponseSchema, WorkspaceTargetSchema2, InitializeWorkspaceRequestSchema, DirectiveCallSchema3, AuthoringOptionsSchema3, CapturedClockSchema3, BirthCertificateSchema3, SignBirthCertificateRequestSchema2, OfferRequestSchema3, QueryRequestSchema3, QueryAuthoritySchema3, InjectedKeySchema2, RowsQuerySchema3, PageQuerySchema3, ByIdQuerySchema3, ByTypeQuerySchema2, TallyQuerySchema3, SpatialQuerySchema3, PendingConflictsQuerySchema2, PendingConflictSummaryQuerySchema2, NamedQuerySchema3, FrontierTransitionRequestSchema2, AuthorizationObjectSchema3, AuthorizationSubjectSchema3, AuthorizationConsistencySchema3, AuthorizationCheckRequestSchema3, AuthorizationExpandRequestSchema, OutboxRequestSchema, SyncRequestSchema3, TestRequestSchema3, SetTestRootRequestSchema3, CustodyRequestSchema2, ResidentFootprintRequestSchema, PackDeltaRequestSchema2, ApplyPackRequestSchema2, RepoStatsRequestSchema2, IntentsAboveRequestSchema3, InspectChangeRequestSchema, RefusalVerdictSchema, EncodeRefusalVerdictRequestSchema, InspectRefusalVerdictRequestSchema, ProveCompactionEquivalenceRequestSchema, ReadBlobRequestSchema, ResolveRefRequestSchema2, ListRefsRequestSchema, WriteRefRequestSchema3, DeleteRefRequestSchema3, WriteMetaCommitRequestSchema, LawClosureInfoRequestSchema2, CheckpointExportRequestSchema2, VerifiedFrontierReceiptSchema, StoredCheckpointManifestSchema, CheckpointImportRequestSchema3, CapacityReserveRequestSchema2, RestoreMainRequestSchema2, ResolveStatePositionRequestSchema, NomosValueSchema2, NomosStructSchema2, BirthOutcomeStatusSchema2, BirthOutcomeStatus2, QueryResultFormatSchema2, QueryResultFormat2, QueryOperationSchema2, QueryOperation3, KernelLawCapabilitySchema2, KernelLawCapability2, CheckpointCompressionSchema, CheckpointCompression, CheckpointVerificationPolicySchema, CheckpointVerificationPolicy, CheckpointAssuranceSchema, CheckpointAssurance, IntentTransportRequirementSchema2, IntentTransportRequirement3, LifecycleInstallPhaseSchema, LifecycleInstallPhase;
|
|
18880
|
+
var file_nomos_kernel_v1_kernel2, CallRequestSchema2, CallResponseSchema2, PrepareRemoteOfferRequestSchema2, PrepareRemoteOfferResponseSchema2, ApplyWorkspaceEffectRequestSchema, ApplyWorkspaceEffectResponseSchema, WorkspaceTargetSchema2, InitializeWorkspaceRequestSchema, DirectiveCallSchema3, AuthoringOptionsSchema3, CapturedClockSchema3, BirthCertificateSchema3, SignBirthCertificateRequestSchema2, ModelLifecycleIntentSchema2, OfferRequestSchema3, QueryRequestSchema3, QueryAuthoritySchema3, InjectedKeySchema2, RowsQuerySchema3, PageQuerySchema3, ByIdQuerySchema3, ByTypeQuerySchema2, TallyQuerySchema3, SpatialQuerySchema3, PendingConflictsQuerySchema2, PendingConflictSummaryQuerySchema2, NamedQuerySchema3, FrontierTransitionRequestSchema2, FrontierTransitionDispositionMapEntrySchema, FrontierTransitionDispositionsSchema, FrontierTransitionViolationSchema, FrontierTransitionResponseSchema, AuthorizationObjectSchema3, AuthorizationSubjectSchema3, AuthorizationConsistencySchema3, AuthorizationCheckRequestSchema3, AuthorizationExpandRequestSchema, OutboxRequestSchema, SyncRequestSchema3, TestRequestSchema3, SetTestRootRequestSchema3, CustodyRequestSchema2, ResidentFootprintRequestSchema, PackDeltaRequestSchema2, ApplyPackRequestSchema2, RepoStatsRequestSchema2, IntentsAboveRequestSchema3, InspectChangeRequestSchema, RefusalVerdictSchema, EncodeRefusalVerdictRequestSchema, InspectRefusalVerdictRequestSchema, ProveCompactionEquivalenceRequestSchema, ReadBlobRequestSchema, ResolveRefRequestSchema2, ListRefsRequestSchema, WriteRefRequestSchema3, DeleteRefRequestSchema3, WriteMetaCommitRequestSchema, LawClosureInfoRequestSchema2, CheckpointExportRequestSchema2, VerifiedFrontierReceiptSchema, StoredCheckpointManifestSchema, CheckpointImportRequestSchema3, CapacityReserveRequestSchema2, RestoreMainRequestSchema2, ResolveStatePositionRequestSchema, NomosValueSchema2, NomosStructSchema2, BirthOutcomeStatusSchema2, BirthOutcomeStatus2, ModelLifecycleOperationSchema2, ModelLifecycleOperation3, QueryResultFormatSchema2, QueryResultFormat2, QueryOperationSchema2, QueryOperation3, KernelLawCapabilitySchema2, KernelLawCapability2, CheckpointCompressionSchema, CheckpointCompression, CheckpointVerificationPolicySchema, CheckpointVerificationPolicy, CheckpointAssuranceSchema, CheckpointAssurance, IntentTransportRequirementSchema2, IntentTransportRequirement3, LifecycleInstallPhaseSchema, LifecycleInstallPhase;
|
|
18515
18881
|
var init_kernel_pb2 = __esm({
|
|
18516
18882
|
"vendor/engine/proto/nomos/kernel/v1/kernel_pb.js"() {
|
|
18517
18883
|
"use strict";
|
|
@@ -18529,6 +18895,7 @@ var init_kernel_pb2 = __esm({
|
|
|
18529
18895
|
CapturedClockSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 49);
|
|
18530
18896
|
BirthCertificateSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 50);
|
|
18531
18897
|
SignBirthCertificateRequestSchema2 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 51);
|
|
18898
|
+
ModelLifecycleIntentSchema2 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 53);
|
|
18532
18899
|
OfferRequestSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 54);
|
|
18533
18900
|
QueryRequestSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 57);
|
|
18534
18901
|
QueryAuthoritySchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 64);
|
|
@@ -18543,6 +18910,10 @@ var init_kernel_pb2 = __esm({
|
|
|
18543
18910
|
PendingConflictSummaryQuerySchema2 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 77);
|
|
18544
18911
|
NamedQuerySchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 78);
|
|
18545
18912
|
FrontierTransitionRequestSchema2 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 79);
|
|
18913
|
+
FrontierTransitionDispositionMapEntrySchema = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 80);
|
|
18914
|
+
FrontierTransitionDispositionsSchema = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 81);
|
|
18915
|
+
FrontierTransitionViolationSchema = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 82);
|
|
18916
|
+
FrontierTransitionResponseSchema = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 83);
|
|
18546
18917
|
AuthorizationObjectSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 84);
|
|
18547
18918
|
AuthorizationSubjectSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 85);
|
|
18548
18919
|
AuthorizationConsistencySchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 87);
|
|
@@ -18581,6 +18952,8 @@ var init_kernel_pb2 = __esm({
|
|
|
18581
18952
|
NomosStructSchema2 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 166);
|
|
18582
18953
|
BirthOutcomeStatusSchema2 = /* @__PURE__ */ enumDesc4(file_nomos_kernel_v1_kernel2, 0);
|
|
18583
18954
|
BirthOutcomeStatus2 = /* @__PURE__ */ tsEnum4(BirthOutcomeStatusSchema2);
|
|
18955
|
+
ModelLifecycleOperationSchema2 = /* @__PURE__ */ enumDesc4(file_nomos_kernel_v1_kernel2, 3);
|
|
18956
|
+
ModelLifecycleOperation3 = /* @__PURE__ */ tsEnum4(ModelLifecycleOperationSchema2);
|
|
18584
18957
|
QueryResultFormatSchema2 = /* @__PURE__ */ enumDesc4(file_nomos_kernel_v1_kernel2, 5);
|
|
18585
18958
|
QueryResultFormat2 = /* @__PURE__ */ tsEnum4(QueryResultFormatSchema2);
|
|
18586
18959
|
QueryOperationSchema2 = /* @__PURE__ */ enumDesc4(file_nomos_kernel_v1_kernel2, 6);
|
|
@@ -18675,6 +19048,17 @@ var init_offer_result2 = __esm({
|
|
|
18675
19048
|
}
|
|
18676
19049
|
});
|
|
18677
19050
|
|
|
19051
|
+
// vendor/engine/proto/nomos/custody/v1/snapshot_pb.js
|
|
19052
|
+
import { fileDesc as fileDesc6, messageDesc as messageDesc6 } from "@bufbuild/protobuf/codegenv2";
|
|
19053
|
+
var file_nomos_custody_v1_snapshot2, LocalCustodySnapshotSchema2;
|
|
19054
|
+
var init_snapshot_pb2 = __esm({
|
|
19055
|
+
"vendor/engine/proto/nomos/custody/v1/snapshot_pb.js"() {
|
|
19056
|
+
"use strict";
|
|
19057
|
+
file_nomos_custody_v1_snapshot2 = /* @__PURE__ */ fileDesc6("Ch9ub21vcy9jdXN0b2R5L3YxL3NuYXBzaG90LnByb3RvEhBub21vcy5jdXN0b2R5LnYxIqACChRMb2NhbEN1c3RvZHlTbmFwc2hvdBIWCg5mb3JtYXRfdmVyc2lvbhgBIAEoDRIWCgl3b3Jrc3BhY2UYAiABKAlIAIgBARIMCgR0cmVlGAMgASgMEhcKCmNoZWNrcG9pbnQYBCABKAxIAYgBARIVCghmcm9udGllchgFIAEoDEgCiAEBEhMKBmN1cnNvchgGIAEoCUgDiAEBEhcKCnN0YXRlX3Jvb3QYByABKAlIBIgBARIYCgtzeW5jZWRfYmFzZRgIIAEoCUgFiAEBQgwKCl93b3Jrc3BhY2VCDQoLX2NoZWNrcG9pbnRCCwoJX2Zyb250aWVyQgkKB19jdXJzb3JCDQoLX3N0YXRlX3Jvb3RCDgoMX3N5bmNlZF9iYXNlYgZwcm90bzM");
|
|
19058
|
+
LocalCustodySnapshotSchema2 = /* @__PURE__ */ messageDesc6(file_nomos_custody_v1_snapshot2, 0);
|
|
19059
|
+
}
|
|
19060
|
+
});
|
|
19061
|
+
|
|
18678
19062
|
// vendor/engine/engine.ts
|
|
18679
19063
|
var engine_exports = {};
|
|
18680
19064
|
__export(engine_exports, {
|
|
@@ -18690,6 +19074,8 @@ __export(engine_exports, {
|
|
|
18690
19074
|
author: () => author,
|
|
18691
19075
|
authorEphemeral: () => authorEphemeral,
|
|
18692
19076
|
authorKeygen: () => authorKeygen,
|
|
19077
|
+
authorModelLifecyclePromotion: () => authorModelLifecyclePromotion,
|
|
19078
|
+
authorModelLifecycleStage: () => authorModelLifecycleStage,
|
|
18693
19079
|
authorOn: () => authorOn,
|
|
18694
19080
|
authorOperatorCall: () => authorOperatorCall,
|
|
18695
19081
|
backupHead: () => backupHead,
|
|
@@ -18762,6 +19148,7 @@ __export(engine_exports, {
|
|
|
18762
19148
|
lawParity: () => lawParity,
|
|
18763
19149
|
ledgerStats: () => ledgerStats,
|
|
18764
19150
|
listRefusedRefs: () => listRefusedRefs,
|
|
19151
|
+
localCustodySnapshot: () => localCustodySnapshot,
|
|
18765
19152
|
materializeRefused: () => materializeRefused,
|
|
18766
19153
|
memoryDropProbe: () => memoryDropProbe,
|
|
18767
19154
|
migrateHomes: () => migrateHomes,
|
|
@@ -19142,6 +19529,100 @@ function workspaceGenesis(eng, ws) {
|
|
|
19142
19529
|
function authorOperatorCall(eng, ws, call, controllerHash, opts = {}) {
|
|
19143
19530
|
return author(eng, ws, call.domain, call.directive, call.canonicalUsda, controllerHash, opts);
|
|
19144
19531
|
}
|
|
19532
|
+
function authorModelLifecycleStage(eng, ws, lawUsdz, installedBy, supersedes, opts = {}) {
|
|
19533
|
+
const sequence = eng.seq++;
|
|
19534
|
+
const captured = {
|
|
19535
|
+
physical: Date.now(),
|
|
19536
|
+
logical: 0,
|
|
19537
|
+
replica: eng.replica
|
|
19538
|
+
};
|
|
19539
|
+
const response = offerRequestResponse(eng, create7(OfferRequestSchema3, {
|
|
19540
|
+
target: protoTarget2(ws),
|
|
19541
|
+
intent: {
|
|
19542
|
+
case: "modelLifecycle",
|
|
19543
|
+
value: create7(ModelLifecycleIntentSchema2, {
|
|
19544
|
+
operation: ModelLifecycleOperation3.STAGE,
|
|
19545
|
+
installedBy,
|
|
19546
|
+
supersedes
|
|
19547
|
+
})
|
|
19548
|
+
},
|
|
19549
|
+
authoring: create7(AuthoringOptionsSchema3, {
|
|
19550
|
+
actor: opts.actor ?? "",
|
|
19551
|
+
authToken: opts.authToken ? enc7.encode(opts.authToken) : new Uint8Array(),
|
|
19552
|
+
authorSecret: opts.authorSecret ? bytesFromB64(opts.authorSecret) : new Uint8Array(),
|
|
19553
|
+
validFromEpoch: opts.validFromEpoch === void 0 ? void 0 : BigInt(opts.validFromEpoch),
|
|
19554
|
+
rng: osEntropyBuffer2(opts.rngDraws ?? 64),
|
|
19555
|
+
deferProjection: opts.deferProjection !== false,
|
|
19556
|
+
spans: opts.spans ?? false,
|
|
19557
|
+
sequence: BigInt(sequence),
|
|
19558
|
+
clock: create7(CapturedClockSchema3, {
|
|
19559
|
+
physicalMillis: BigInt(captured.physical),
|
|
19560
|
+
logical: captured.logical,
|
|
19561
|
+
replica: BigInt(captured.replica)
|
|
19562
|
+
})
|
|
19563
|
+
}),
|
|
19564
|
+
lawUsdz
|
|
19565
|
+
}));
|
|
19566
|
+
return offerResult(response);
|
|
19567
|
+
}
|
|
19568
|
+
function authorModelLifecyclePromotion(eng, ws, transition, replaces, acceptanceReason, opts = {}) {
|
|
19569
|
+
const sequence = eng.seq++;
|
|
19570
|
+
const captured = {
|
|
19571
|
+
physical: Date.now(),
|
|
19572
|
+
logical: 0,
|
|
19573
|
+
replica: eng.replica
|
|
19574
|
+
};
|
|
19575
|
+
const dispositions2 = transition.dispositions === void 0 ? void 0 : create7(FrontierTransitionDispositionsSchema, {
|
|
19576
|
+
retired: [...transition.dispositions.retired],
|
|
19577
|
+
retyped: Object.entries(transition.dispositions.retyped).map(
|
|
19578
|
+
([sourceStableId, acknowledgement]) => create7(FrontierTransitionDispositionMapEntrySchema, { sourceStableId, acknowledgement })
|
|
19579
|
+
),
|
|
19580
|
+
rebinds: Object.entries(transition.dispositions.rebinds).map(
|
|
19581
|
+
([sourceStableId, acknowledgement]) => create7(FrontierTransitionDispositionMapEntrySchema, { sourceStableId, acknowledgement })
|
|
19582
|
+
),
|
|
19583
|
+
acknowledgedBy: transition.dispositions.ackBy
|
|
19584
|
+
});
|
|
19585
|
+
const response = offerRequestResponse(eng, create7(OfferRequestSchema3, {
|
|
19586
|
+
target: protoTarget2(ws),
|
|
19587
|
+
intent: {
|
|
19588
|
+
case: "modelLifecycle",
|
|
19589
|
+
value: create7(ModelLifecycleIntentSchema2, {
|
|
19590
|
+
operation: ModelLifecycleOperation3.PROMOTE,
|
|
19591
|
+
replaces,
|
|
19592
|
+
acceptanceReason,
|
|
19593
|
+
transition: create7(FrontierTransitionResponseSchema, {
|
|
19594
|
+
atHash: transition.atHash,
|
|
19595
|
+
currentHash: transition.currentHash,
|
|
19596
|
+
atStateRoot: transition.atStateRoot ?? "",
|
|
19597
|
+
candidateHash: transition.candidateHash,
|
|
19598
|
+
domain: transition.domain,
|
|
19599
|
+
domains: [...transition.domains ?? []],
|
|
19600
|
+
ready: transition.ready,
|
|
19601
|
+
violations: transition.evolve.violations.map(
|
|
19602
|
+
({ domain, detail }) => create7(FrontierTransitionViolationSchema, { domain, detail })
|
|
19603
|
+
),
|
|
19604
|
+
dispositions: dispositions2
|
|
19605
|
+
})
|
|
19606
|
+
})
|
|
19607
|
+
},
|
|
19608
|
+
authoring: create7(AuthoringOptionsSchema3, {
|
|
19609
|
+
actor: opts.actor ?? "",
|
|
19610
|
+
authToken: opts.authToken ? enc7.encode(opts.authToken) : new Uint8Array(),
|
|
19611
|
+
authorSecret: opts.authorSecret ? bytesFromB64(opts.authorSecret) : new Uint8Array(),
|
|
19612
|
+
validFromEpoch: opts.validFromEpoch === void 0 ? void 0 : BigInt(opts.validFromEpoch),
|
|
19613
|
+
rng: osEntropyBuffer2(opts.rngDraws ?? 64),
|
|
19614
|
+
deferProjection: opts.deferProjection !== false,
|
|
19615
|
+
spans: opts.spans ?? false,
|
|
19616
|
+
sequence: BigInt(sequence),
|
|
19617
|
+
clock: create7(CapturedClockSchema3, {
|
|
19618
|
+
physicalMillis: BigInt(captured.physical),
|
|
19619
|
+
logical: captured.logical,
|
|
19620
|
+
replica: BigInt(captured.replica)
|
|
19621
|
+
})
|
|
19622
|
+
})
|
|
19623
|
+
}));
|
|
19624
|
+
return offerResult(response);
|
|
19625
|
+
}
|
|
19145
19626
|
function initializeWorkspace(eng, ws, installedBy = eng.installedBy) {
|
|
19146
19627
|
const sequence = eng.seq++;
|
|
19147
19628
|
const captured = {
|
|
@@ -20242,8 +20723,11 @@ async function reconcileRequiredCustodyHead(eng, ws, ledger, requiredCustodyHead
|
|
|
20242
20723
|
if (!/^[0-9a-f]{40}$/.test(requiredCustodyHead)) {
|
|
20243
20724
|
throw new Error("required custody head must be a lowercase 40-hex git object id");
|
|
20244
20725
|
}
|
|
20245
|
-
const
|
|
20246
|
-
|
|
20726
|
+
const resident = eng.mounted.get(ws);
|
|
20727
|
+
const current = resident ? kgit.resolveRef(eng, gitdirOf(ws), BRANCH2) : "";
|
|
20728
|
+
if (current === requiredCustodyHead && resident?.remoteMain === requiredCustodyHead && !resident.restoreError) {
|
|
20729
|
+
return resident;
|
|
20730
|
+
}
|
|
20247
20731
|
if (current && isDirty(eng, ws)) {
|
|
20248
20732
|
throw new Error(
|
|
20249
20733
|
`workspace '${ws}' has verified but unsealed resident work; refusing to discard it while reconciling custody`
|
|
@@ -20256,6 +20740,12 @@ async function reconcileRequiredCustodyHead(eng, ws, ledger, requiredCustodyHead
|
|
|
20256
20740
|
`workspace '${ws}' could not reconcile required custody ${requiredCustodyHead}: ${mounted.restoreError || "custody has no verified main"}`
|
|
20257
20741
|
);
|
|
20258
20742
|
}
|
|
20743
|
+
const reconciled = kgit.resolveRef(eng, gitdirOf(ws), BRANCH2);
|
|
20744
|
+
if (reconciled !== requiredCustodyHead || mounted.remoteMain !== requiredCustodyHead) {
|
|
20745
|
+
throw new Error(
|
|
20746
|
+
`workspace '${ws}' restored custody ${mounted.remoteMain || reconciled || "none"}, not required custody ${requiredCustodyHead}`
|
|
20747
|
+
);
|
|
20748
|
+
}
|
|
20259
20749
|
return mounted;
|
|
20260
20750
|
}
|
|
20261
20751
|
function assertAuthored(res, what) {
|
|
@@ -20393,7 +20883,10 @@ async function applyWorkspaceEffect(eng, ws, ledger, requestBytes, admissionChec
|
|
|
20393
20883
|
const result = response.outcome.value.result;
|
|
20394
20884
|
if (!result || result.outcome.case !== "admitted") {
|
|
20395
20885
|
const outcome = result?.outcome.case || "empty";
|
|
20396
|
-
|
|
20886
|
+
const detail = result?.outcome.case === "refused" ? result.outcome.value.refusal?.message : void 0;
|
|
20887
|
+
throw new Error(
|
|
20888
|
+
`target kernel ${outcome} the workspace effect${detail ? `: ${detail}` : ""}`
|
|
20889
|
+
);
|
|
20397
20890
|
}
|
|
20398
20891
|
await custodyPush(eng, ws, ledger, { remoteRef: "refs/heads/main", ffOnly: true });
|
|
20399
20892
|
return toBinary6(ApplyWorkspaceEffectResponseSchema, response.outcome.value);
|
|
@@ -20504,8 +20997,8 @@ function prepareRemoteOffer(eng, ws, requestBytes) {
|
|
|
20504
20997
|
if (authoring.authorSecret.byteLength !== 0) {
|
|
20505
20998
|
throw new Error("remote offer preparation refuses client signing secrets");
|
|
20506
20999
|
}
|
|
20507
|
-
if (request.intent.case !== "call") {
|
|
20508
|
-
throw new Error("remote offer preparation requires a typed directive call");
|
|
21000
|
+
if (request.intent.case !== "call" && request.intent.case !== "modelLifecycle") {
|
|
21001
|
+
throw new Error("remote offer preparation requires a typed directive or model-lifecycle call");
|
|
20509
21002
|
}
|
|
20510
21003
|
const response = callProto(eng.ex, {
|
|
20511
21004
|
case: "prepareRemoteOffer",
|
|
@@ -20971,7 +21464,13 @@ function packDelta(eng, ws, base, head) {
|
|
|
20971
21464
|
case: "packDelta",
|
|
20972
21465
|
value: create7(PackDeltaRequestSchema2, { repo: repoArgOf(ws), base: base || void 0, head })
|
|
20973
21466
|
}, "packDelta").pack;
|
|
20974
|
-
} catch {
|
|
21467
|
+
} catch (error) {
|
|
21468
|
+
console.error("[nomos-custody-pack] packDelta refused", {
|
|
21469
|
+
workspace: ws,
|
|
21470
|
+
base: base || "<full>",
|
|
21471
|
+
head,
|
|
21472
|
+
error: String(error)
|
|
21473
|
+
});
|
|
20975
21474
|
return null;
|
|
20976
21475
|
}
|
|
20977
21476
|
}
|
|
@@ -21653,11 +22152,12 @@ function promotePreflighted(eng, ws, domain, candidateHash, opts = {}) {
|
|
|
21653
22152
|
acceptanceReason: _acceptance,
|
|
21654
22153
|
...authorOpts
|
|
21655
22154
|
} = opts;
|
|
21656
|
-
const result =
|
|
22155
|
+
const result = authorModelLifecyclePromotion(
|
|
21657
22156
|
eng,
|
|
21658
22157
|
ws,
|
|
21659
|
-
|
|
21660
|
-
|
|
22158
|
+
report,
|
|
22159
|
+
prepared.payload.replaces,
|
|
22160
|
+
prepared.payload.preflight.acceptanceReason,
|
|
21661
22161
|
{
|
|
21662
22162
|
...authorOpts,
|
|
21663
22163
|
...actingPrincipal ? { actor: actingPrincipal } : {}
|
|
@@ -22147,7 +22647,10 @@ async function emitOutbox(eng, ws, ledger, workspaceEffectBase = "", admissionCh
|
|
|
22147
22647
|
const targetResult = response.result;
|
|
22148
22648
|
if (!targetResult || targetResult.outcome.case !== "admitted") {
|
|
22149
22649
|
const outcome = targetResult?.outcome.case || "empty";
|
|
22150
|
-
|
|
22650
|
+
const detail = targetResult?.outcome.case === "refused" ? targetResult.outcome.value.refusal?.message : void 0;
|
|
22651
|
+
throw new Error(
|
|
22652
|
+
`target kernel ${outcome} the workspace effect${detail ? `: ${detail}` : ""}`
|
|
22653
|
+
);
|
|
22151
22654
|
}
|
|
22152
22655
|
break;
|
|
22153
22656
|
}
|
|
@@ -22179,7 +22682,7 @@ async function emitOutbox(eng, ws, ledger, workspaceEffectBase = "", admissionCh
|
|
|
22179
22682
|
} catch (e) {
|
|
22180
22683
|
errors++;
|
|
22181
22684
|
const destination = offer.route.case === "httpsRoute" ? offer.route.value.url : offer.route.case === "workspaceRoute" ? offer.route.value.workspace : offer.destination;
|
|
22182
|
-
log("outbox-deliver-failed", { ws, offerId: offer.id, destination, error: String(e).slice(0,
|
|
22685
|
+
log("outbox-deliver-failed", { ws, offerId: offer.id, destination, error: String(e).slice(0, 2e3) });
|
|
22183
22686
|
}
|
|
22184
22687
|
}
|
|
22185
22688
|
if (delivered.length || errors) log("outbox", { ws, delivered: delivered.length, errors });
|
|
@@ -22210,6 +22713,26 @@ function snapshot(eng, ws) {
|
|
|
22210
22713
|
const wsDir = dirOf(eng.preopen.dir.contents.get("ws")).contents.get(ws);
|
|
22211
22714
|
return serializeTree2(wsDir);
|
|
22212
22715
|
}
|
|
22716
|
+
function localCustodySnapshot(eng, ws) {
|
|
22717
|
+
const checkpoint = exportCheckpoint(eng, ws);
|
|
22718
|
+
const tree = snapshot(eng, ws);
|
|
22719
|
+
const head = headOf(eng, ws);
|
|
22720
|
+
const body = toBinary6(LocalCustodySnapshotSchema2, create7(LocalCustodySnapshotSchema2, {
|
|
22721
|
+
formatVersion: 3,
|
|
22722
|
+
workspace: ws,
|
|
22723
|
+
tree,
|
|
22724
|
+
checkpoint: checkpoint.blob ? bytesFromB64(checkpoint.blob) : void 0,
|
|
22725
|
+
frontier: checkpoint.frontier ? bytesFromB64(checkpoint.frontier) : void 0,
|
|
22726
|
+
cursor: checkpoint.cursor === void 0 ? void 0 : String(checkpoint.cursor),
|
|
22727
|
+
stateRoot: checkpoint.stateRoot,
|
|
22728
|
+
syncedBase: head || void 0
|
|
22729
|
+
}));
|
|
22730
|
+
const prefix = enc7.encode("NOMOS-CUSTODY-PB3\n");
|
|
22731
|
+
const framed = new Uint8Array(prefix.byteLength + body.byteLength);
|
|
22732
|
+
framed.set(prefix);
|
|
22733
|
+
framed.set(body, prefix.byteLength);
|
|
22734
|
+
return framed;
|
|
22735
|
+
}
|
|
22213
22736
|
function stats(eng) {
|
|
22214
22737
|
return {
|
|
22215
22738
|
mounted: eng.mounted.size,
|
|
@@ -22286,6 +22809,7 @@ var init_engine = __esm({
|
|
|
22286
22809
|
init_lifecycle_calls2();
|
|
22287
22810
|
init_offer_result2();
|
|
22288
22811
|
init_kernel_pb2();
|
|
22812
|
+
init_snapshot_pb2();
|
|
22289
22813
|
enc7 = new TextEncoder();
|
|
22290
22814
|
dec7 = new TextDecoder();
|
|
22291
22815
|
BRANCH2 = "main";
|
|
@@ -23318,6 +23842,14 @@ __export(governance_exports, {
|
|
|
23318
23842
|
import { createHash, createPrivateKey, createPublicKey } from "node:crypto";
|
|
23319
23843
|
import { mkdirSync as mkdirSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync4 } from "node:fs";
|
|
23320
23844
|
import { dirname as dirname3, join as join4 } from "node:path";
|
|
23845
|
+
function custodyAdmissionAccepted(admission) {
|
|
23846
|
+
if (admission === null || admission === void 0 || admission.ok === false) return false;
|
|
23847
|
+
const refused = (admission.sessions ?? []).some(
|
|
23848
|
+
(session) => (session.rejected?.length ?? 0) > 0 || (session.intents ?? []).some((intent) => intent.outcome?.case !== "admitted")
|
|
23849
|
+
);
|
|
23850
|
+
if (refused) return false;
|
|
23851
|
+
return admission.ok === true || /^[0-9a-f]{40}$/i.test(String(admission.main ?? ""));
|
|
23852
|
+
}
|
|
23321
23853
|
async function clientConnect() {
|
|
23322
23854
|
const mod = await Promise.resolve().then(() => (init_src2(), src_exports));
|
|
23323
23855
|
return mod.connect;
|
|
@@ -23456,8 +23988,7 @@ async function adoptRootModelLifecycle(candidateHash, opts, acceptance) {
|
|
|
23456
23988
|
}
|
|
23457
23989
|
const sync = await holon.sync({ admit: true, discoverRemote: true });
|
|
23458
23990
|
const admission = sync.admission;
|
|
23459
|
-
const
|
|
23460
|
-
const ok = sync.pushFailed !== true && sync.offline !== true && admission?.ok === true && rejected.length === 0;
|
|
23991
|
+
const ok = sync.pushFailed !== true && sync.offline !== true && custodyAdmissionAccepted(admission);
|
|
23461
23992
|
return { ok, adoption, sync };
|
|
23462
23993
|
}
|
|
23463
23994
|
async function adoptWorkspaceModel(workspace, domain, candidateHash, opts, acceptance) {
|
|
@@ -23492,8 +24023,7 @@ async function adoptWorkspaceModel(workspace, domain, candidateHash, opts, accep
|
|
|
23492
24023
|
}
|
|
23493
24024
|
const sync = await holon.sync({ admit: true, discoverRemote: true });
|
|
23494
24025
|
const admission = sync.admission;
|
|
23495
|
-
const
|
|
23496
|
-
const ok = sync.pushFailed !== true && sync.offline !== true && admission?.ok === true && rejected.length === 0;
|
|
24026
|
+
const ok = sync.pushFailed !== true && sync.offline !== true && custodyAdmissionAccepted(admission);
|
|
23497
24027
|
return { ok, adoption, sync };
|
|
23498
24028
|
} finally {
|
|
23499
24029
|
holon._dispose?.();
|
|
@@ -23542,11 +24072,11 @@ async function signAndPostPreparedOffer(ws, domain, prepare, opts, authorMode =
|
|
|
23542
24072
|
}
|
|
23543
24073
|
const sync = await holon.sync({ admit: true, discoverRemote: true });
|
|
23544
24074
|
const admission = sync.admission;
|
|
23545
|
-
const
|
|
23546
|
-
const failed = sync.pushFailed === true || sync.offline === true ||
|
|
24075
|
+
const accepted = custodyAdmissionAccepted(admission);
|
|
24076
|
+
const failed = sync.pushFailed === true || sync.offline === true || !accepted;
|
|
23547
24077
|
return {
|
|
23548
|
-
ok: !failed
|
|
23549
|
-
status: !failed
|
|
24078
|
+
ok: !failed,
|
|
24079
|
+
status: !failed ? 200 : admission !== null && admission !== void 0 ? 422 : 502,
|
|
23550
24080
|
body: sync.pushError ?? admission ?? sync,
|
|
23551
24081
|
principal,
|
|
23552
24082
|
actor,
|
|
@@ -28405,10 +28935,14 @@ function domainInventory(value) {
|
|
|
28405
28935
|
const domains = row.domains.map((candidate) => {
|
|
28406
28936
|
if (typeof candidate !== "object" || candidate === null) throw new Error("domain inventory contains a non-record installation");
|
|
28407
28937
|
const install = candidate;
|
|
28408
|
-
if (typeof install.domainHash !== "string" || typeof install.phase !== "string" || !Array.isArray(install.domainKeys) || !install.domainKeys.every((key2) => typeof key2 === "string")) {
|
|
28938
|
+
if (typeof install.domainHash !== "string" || typeof install.phase !== "string" || install.domainKeys !== void 0 && (!Array.isArray(install.domainKeys) || !install.domainKeys.every((key2) => typeof key2 === "string"))) {
|
|
28409
28939
|
throw new Error("domain inventory contains an invalid installation record");
|
|
28410
28940
|
}
|
|
28411
|
-
return {
|
|
28941
|
+
return {
|
|
28942
|
+
domainHash: install.domainHash,
|
|
28943
|
+
phase: install.phase,
|
|
28944
|
+
domainKeys: install.domainKeys ?? []
|
|
28945
|
+
};
|
|
28412
28946
|
});
|
|
28413
28947
|
const currentLaw2 = Object.fromEntries(Object.entries(row.currentLaw).map(([key2, hash]) => {
|
|
28414
28948
|
if (typeof hash !== "string") throw new Error(`domain inventory has a non-string current law for '${key2}'`);
|
|
@@ -31905,7 +32439,6 @@ async function status(wsArg, opts) {
|
|
|
31905
32439
|
|
|
31906
32440
|
// src/proof_upgrade.ts
|
|
31907
32441
|
init_engine();
|
|
31908
|
-
init_lifecycle_calls2();
|
|
31909
32442
|
init_cloud();
|
|
31910
32443
|
init_governance();
|
|
31911
32444
|
init_local_holon();
|
|
@@ -32033,27 +32566,33 @@ async function mountReadOnlyCopy(eng, source, cloud) {
|
|
|
32033
32566
|
function tenantPredecessors(candidateDomains, current, frameworkHashes) {
|
|
32034
32567
|
return [...new Set(candidateDomains.map((domain) => current[domain]).filter((hash) => typeof hash === "string" && !frameworkHashes.has(hash)))];
|
|
32035
32568
|
}
|
|
32036
|
-
function
|
|
32037
|
-
|
|
32038
|
-
|
|
32039
|
-
|
|
32040
|
-
|
|
32569
|
+
function upgradeControllerLawHash(installed, bundledControllerHash) {
|
|
32570
|
+
const active = installed["nomos"];
|
|
32571
|
+
if (typeof active === "string" && /^[0-9a-f]{64}$/.test(active)) return active;
|
|
32572
|
+
if (/^[0-9a-f]{64}$/.test(bundledControllerHash)) return bundledControllerHash;
|
|
32573
|
+
throw new Error("the copied workspace declares no active Nomos lifecycle controller");
|
|
32574
|
+
}
|
|
32575
|
+
function printFrontier(report) {
|
|
32576
|
+
out11(` frontier ${report.atHash.slice(0, 12)}\u2026 state ${report.atStateRoot?.slice(0, 12) ?? "unknown"}\u2026`);
|
|
32577
|
+
out11(` evolution ${report.ready ? "admissible" : "refused"}`);
|
|
32578
|
+
for (const violation of report.evolve.violations) {
|
|
32579
|
+
out11(` violation ${violation.domain}: ${violation.detail}`);
|
|
32041
32580
|
}
|
|
32042
|
-
if (report.divergences.length > 12) out11(` changed + ${report.divergences.length - 12} more difference(s)`);
|
|
32043
32581
|
}
|
|
32044
32582
|
function localAuthorIdentity(explicitPrincipal) {
|
|
32045
32583
|
const selectedPrincipal = explicitPrincipal ?? activePrincipal() ?? ACTOR;
|
|
32046
32584
|
const actor = canonicalPrincipal2(selectedPrincipal);
|
|
32047
32585
|
const bareActor = actor.startsWith("user:") ? actor.slice("user:".length) : actor;
|
|
32048
32586
|
const device = getDeviceKey(selectedPrincipal) ?? getDeviceKey(actor) ?? getDeviceKey(bareActor);
|
|
32049
|
-
|
|
32587
|
+
const authorSecret = process.env["NOMOS_AUTHOR_SECRET"]?.trim() || device?.secret;
|
|
32588
|
+
if (authorSecret === void 0) {
|
|
32050
32589
|
throw new Error(
|
|
32051
32590
|
`upgrade proof needs an enrolled signing device for '${actor}' \u2014 select one with --as <uid> or import/enroll its key first`
|
|
32052
32591
|
);
|
|
32053
32592
|
}
|
|
32054
32593
|
return {
|
|
32055
32594
|
actor,
|
|
32056
|
-
authorSecret
|
|
32595
|
+
authorSecret
|
|
32057
32596
|
};
|
|
32058
32597
|
}
|
|
32059
32598
|
async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
|
|
@@ -32071,7 +32610,11 @@ async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
|
|
|
32071
32610
|
return 1;
|
|
32072
32611
|
}
|
|
32073
32612
|
try {
|
|
32074
|
-
const
|
|
32613
|
+
const localIdentity = localAuthorIdentity(opts.principal);
|
|
32614
|
+
const identity = {
|
|
32615
|
+
...localIdentity,
|
|
32616
|
+
...process.env["NOMOS_AUTH_TOKEN"] ? { authToken: process.env["NOMOS_AUTH_TOKEN"] } : {}
|
|
32617
|
+
};
|
|
32075
32618
|
const { eng: sourceEngine, runtime } = await holonEngine(cloud, identity.actor);
|
|
32076
32619
|
const mounted = await mountReadOnlyCopy(sourceEngine, source, cloud);
|
|
32077
32620
|
const sourceVerdict = verifyChainLocal(sourceEngine, WORKSPACE);
|
|
@@ -32092,10 +32635,11 @@ async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
|
|
|
32092
32635
|
const candidate = inspectLawArchive(eng, lawUsdzPath);
|
|
32093
32636
|
if (candidate.domainKeys.length === 0) throw new Error("candidate law archive carries no business domains");
|
|
32094
32637
|
const before = currentLaw(eng, WORKSPACE);
|
|
32638
|
+
const controllerLawHash = upgradeControllerLawHash(before, eng.hashes.nomos);
|
|
32095
32639
|
const predecessors = tenantPredecessors(
|
|
32096
32640
|
candidate.domainKeys,
|
|
32097
32641
|
before,
|
|
32098
|
-
/* @__PURE__ */ new Set([eng.hashes.bootstrap, eng.hashes.nomos])
|
|
32642
|
+
/* @__PURE__ */ new Set([eng.hashes.bootstrap, eng.hashes.nomos, controllerLawHash])
|
|
32099
32643
|
);
|
|
32100
32644
|
const alreadyCurrent = candidate.domainKeys.every((domain) => before[domain] === candidate.identity);
|
|
32101
32645
|
if (alreadyCurrent) {
|
|
@@ -32113,20 +32657,23 @@ async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
|
|
|
32113
32657
|
);
|
|
32114
32658
|
}
|
|
32115
32659
|
const predecessor = predecessors[0];
|
|
32116
|
-
const staged =
|
|
32660
|
+
const staged = authorModelLifecycleStage(
|
|
32117
32661
|
eng,
|
|
32118
32662
|
WORKSPACE,
|
|
32119
|
-
|
|
32120
|
-
|
|
32121
|
-
|
|
32122
|
-
|
|
32123
|
-
eng.hashes.nomos,
|
|
32124
|
-
{ ...identity, lawUsdz: candidate.lawUsdz }
|
|
32663
|
+
candidate.lawUsdz,
|
|
32664
|
+
identity.actor,
|
|
32665
|
+
predecessor,
|
|
32666
|
+
identity
|
|
32125
32667
|
);
|
|
32126
|
-
if (staged.ok === false)
|
|
32668
|
+
if (staged.ok === false) {
|
|
32669
|
+
const authority = /authoriz|not permitted/i.test(staged.error ?? "") ? expand(eng, WORKSPACE, "workspace:self", "installDomain").subjects : [];
|
|
32670
|
+
throw new Error(
|
|
32671
|
+
`candidate staging refused: ${staged.error ?? "unknown refusal"}` + (authority.length > 0 ? `; lifecycle authority is held by ${authority.join(", ")}` : "")
|
|
32672
|
+
);
|
|
32673
|
+
}
|
|
32127
32674
|
const stagedHead = kgit.resolveRef(eng, gitdirOf(WORKSPACE), "refs/heads/main");
|
|
32128
32675
|
if (!stagedHead) throw new Error("candidate staging produced no current head");
|
|
32129
|
-
const report =
|
|
32676
|
+
const report = frontierTransition(
|
|
32130
32677
|
eng,
|
|
32131
32678
|
WORKSPACE,
|
|
32132
32679
|
candidate.domainKeys[0],
|
|
@@ -32137,21 +32684,13 @@ async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
|
|
|
32137
32684
|
out11(`githolon proof --upgrade \u2014 ${source} (${mounted.location}, never modified)`);
|
|
32138
32685
|
out11(` current ${predecessor.slice(0, 16)}\u2026`);
|
|
32139
32686
|
out11(` candidate ${candidate.identity.slice(0, 16)}\u2026 (${candidate.domainKeys.join(", ")})`);
|
|
32140
|
-
|
|
32141
|
-
if (!report.
|
|
32142
|
-
throw new Error(
|
|
32143
|
-
!report.sourceVerified ? "the source history did not verify" : !report.complete ? "the candidate could not re-derive every historical premise" : `typed evolution refused: ${report.evolve.violations.map((violation) => violation.detail).join("; ")}`
|
|
32144
|
-
);
|
|
32145
|
-
}
|
|
32146
|
-
if (!report.promotable && !opts.acceptanceReason?.trim()) {
|
|
32147
|
-
throw new Error(
|
|
32148
|
-
'the candidate deliberately changes historical business outcomes; review the differences above, then rerun with --acceptance-reason "why this change is correct"'
|
|
32149
|
-
);
|
|
32687
|
+
printFrontier(report);
|
|
32688
|
+
if (!report.ready || !report.evolve.ok) {
|
|
32689
|
+
throw new Error(`typed evolution refused: ${report.evolve.violations.map((violation) => violation.detail).join("; ")}`);
|
|
32150
32690
|
}
|
|
32151
32691
|
const promoted = promotePreflighted(eng, WORKSPACE, candidate.domainKeys[0], candidate.identity, {
|
|
32152
32692
|
...identity,
|
|
32153
32693
|
replaces: predecessor,
|
|
32154
|
-
retireReplaced: true,
|
|
32155
32694
|
...opts.acceptanceReason?.trim() ? { acceptanceReason: opts.acceptanceReason.trim() } : {}
|
|
32156
32695
|
});
|
|
32157
32696
|
if (!promoted.ok) throw new Error(`disposable promotion refused at ${promoted.stage}: ${promoted.error}`);
|
|
@@ -32161,7 +32700,7 @@ async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
|
|
|
32161
32700
|
throw new Error(`promotion completed but ${domain} does not resolve to the candidate model`);
|
|
32162
32701
|
}
|
|
32163
32702
|
}
|
|
32164
|
-
out11(`\u2713
|
|
32703
|
+
out11(`\u2713 current-frontier promotion admitted in the disposable copy`);
|
|
32165
32704
|
}
|
|
32166
32705
|
const warmVerdict = verifyChainLocal(eng, WORKSPACE);
|
|
32167
32706
|
if (warmVerdict.valid !== true) throw new Error(`promoted chain failed verification: ${String(warmVerdict.error ?? "unknown refusal")}`);
|