@githolon/dsl 0.103.3 → 0.103.5
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/dart/CHANGELOG.md +15 -0
- package/dart/lib/src/runner/node-entry.mjs +411 -149
- package/dart/lib/src/runner/offline-install.mjs +222 -99
- package/dart/lib/src/session_bound.dart +111 -2
- package/dart/lib/src/test_harness.dart +117 -66
- package/dart/lib/src/webview_bridge.dart +726 -61
- package/dart/pubspec.lock +1 -1
- package/dart/pubspec.yaml +4 -5
- package/dart/test/acquire_session_test.dart +62 -5
- package/dart/test/cloud_bound_topology_test.dart +59 -38
- package/dart/test/session_bound_test.dart +25 -10
- package/dart/test/webview_bridge_test.dart +357 -9
- package/dart_types/CHANGELOG.md +5 -0
- package/dart_types/lib/nomos_types.dart +1 -0
- package/dart_types/lib/src/git_object_id.dart +37 -0
- package/dart_types/pubspec.yaml +1 -1
- package/package.json +1 -1
- package/runtime/generated-application-host.js +425 -145
- package/src/births.ts +16 -1
- package/src/business_birth.ts +67 -46
- package/src/codegen_dart.ts +68 -12
- package/src/codegen_dart_application.ts +114 -19
- package/src/codegen_dart_client.ts +149 -6
- package/src/codegen_proof.ts +16 -9
- package/src/codegen_provider_dart.ts +5 -0
- package/src/codegen_ts.ts +115 -19
- package/src/compile_package_main.ts +142 -40
- package/src/fields.ts +43 -0
- package/src/framework/attested_receipts.ts +34 -1
- package/src/framework/domain_lifecycle.ts +140 -83
- package/src/framework/genesis.ts +2 -1
- package/src/framework/home.ts +20 -45
- package/src/framework/workspaces.ts +62 -29
- package/src/idof_lint.ts +65 -51
- package/src/index.ts +21 -1
- package/src/intent.ts +11 -1
- package/src/law_graph.ts +81 -11
- package/src/law_graph_usda.ts +45 -54
- package/src/relation_schema.ts +18 -0
- package/src/shape_compat.ts +3 -0
- package/src/stable_ids_for_module.ts +7 -1
- package/src/value_object.ts +40 -0
|
@@ -5341,52 +5341,74 @@ function writeTypeOfScalar(type) {
|
|
|
5341
5341
|
}
|
|
5342
5342
|
|
|
5343
5343
|
// ../cloud/web-client/src/_adapter/proto/nomos/kernel/v1/kernel_pb.js
|
|
5344
|
-
var file_nomos_kernel_v1_kernel = /* @__PURE__ */ fileDesc("Chxub21vcy9rZXJuZWwvdjEva2VybmVsLnByb3RvEg9ub21vcy5rZXJuZWwudjEimAMKC0NhbGxSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRIsCgRvcGVuGAogASgLMhwubm9tb3Mua2VybmVsLnYxLk9wZW5SZXF1ZXN0SAASLgoFb2ZmZXIYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXF1ZXN0SAASLgoFcXVlcnkYDCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0SAASMAoGb3V0Ym94GA0gASgLMh4ubm9tb3Mua2VybmVsLnYxLk91dGJveFJlcXVlc3RIABIsCgRzeW5jGA4gASgLMhwubm9tb3Mua2VybmVsLnYxLlN5bmNSZXF1ZXN0SAASMgoHY3VzdG9keRgPIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVxdWVzdEgAEiwKBHRlc3QYECABKAsyHC5ub21vcy5rZXJuZWwudjEuVGVzdFJlcXVlc3RIAEILCglvcGVyYXRpb24iywMKDENhbGxSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSKwoHZmFpbHVyZRgKIAEoCzIYLm5vbW9zLmtlcm5lbC52MS5GYWlsdXJlSAASLQoEb3BlbhgLIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5PcGVuUmVzcG9uc2VIABIvCgVvZmZlchgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlSAASLwoFcXVlcnkYDSABKAsyHi5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXNwb25zZUgAEjEKBm91dGJveBgOIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5PdXRib3hSZXNwb25zZUgAEi0KBHN5bmMYDyABKAsyHS5ub21vcy5rZXJuZWwudjEuU3luY1Jlc3BvbnNlSAASMwoHY3VzdG9keRgQIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVzcG9uc2VIABItCgR0ZXN0GBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlRlc3RSZXNwb25zZUgAQgkKB291dGNvbWUiVwoHRmFpbHVyZRIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSLQoHZGV0YWlscxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCI8CgxPcGVuUmVzcG9uc2USLAoGcmVzdWx0GAEgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IsMCCg1PZmZlclJlc3BvbnNlEjIKCGFkbWl0dGVkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLk9mZmVyQWRtaXR0ZWRIABIwCgdyZWZ1c2VkGAIgASgLMh0ubm9tb3Mua2VybmVsLnYxLk9mZmVyUmVmdXNlZEgAEjsKDWRlYWRfbGV0dGVyZWQYAyABKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJEZWFkTGV0dGVyZWRIABI4CgtxdWFyYW50aW5lZBgEIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5PZmZlclF1YXJhbnRpbmVkSAASSgoVYmxvY2tlZF9vbl9kZXBlbmRlbmN5GAUgASgLMikubm9tb3Mua2VybmVsLnYxLk9mZmVyQmxvY2tlZE9uRGVwZW5kZW5jeUgAQgkKB291dGNvbWUiPQoNT2ZmZXJBZG1pdHRlZBIsCgZyZXN1bHQYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QilgEKDE9mZmVyUmVmdXNlZBIVCghvZmZlcl9pZBgBIAEoCUgAiAEBEi8KB3JlZnVzYWwYAiABKAsyHi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbBIxCgtkaWFnbm9zdGljcxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdEILCglfb2ZmZXJfaWQiegoRT2ZmZXJEZWFkTGV0dGVyZWQSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZyZWFzb24YAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIq4BChBPZmZlclF1YXJhbnRpbmVkEhUKCG9mZmVyX2lkGAEgASgJSACIAQESGQoRYXV0aG9yZWRfbGF3X2hhc2gYAiABKAkSGAoQY3VycmVudF9sYXdfaGFzaBgDIAEoCRIOCgZyZWFzb24YBCABKAkSMQoLZGlhZ25vc3RpY3MYBSABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBChhPZmZlckJsb2NrZWRPbkRlcGVuZGVuY3kSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZkZXRhaWwYAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBCg1LZXJuZWxSZWZ1c2FsEjAKBGNvZGUYASABKA4yIi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbENvZGUSDwoHbWVzc2FnZRgCIAEoCRItCgdkZXRhaWxzGAMgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IqQCCg1RdWVyeVJlc3BvbnNlEiwKBXZhbHVlGAEgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWVIABJBChBhcHBsaWNhdGlvbl9qc29uGAIgASgLMiUubm9tb3Mua2VybmVsLnYxLkFwcGxpY2F0aW9uSnNvblZhbHVlSAASSgoTYXV0aG9yaXphdGlvbl9jaGVjaxgKIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ2hlY2tSZXNwb25zZUgAEkwKFGF1dGhvcml6YXRpb25fZXhwYW5kGAsgASgLMiwubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBhbmRSZXNwb25zZUgAQggKBnJlc3VsdCIkChRBcHBsaWNhdGlvbkpzb25WYWx1ZRIMCgR1dGY4GAEgASgMIj4KDk91dGJveFJlc3BvbnNlEiwKBnJlc3VsdBgBIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCI8CgxTeW5jUmVzcG9uc2USLAoGcmVzdWx0GAEgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IkIKD1dvcmtzcGFjZVRhcmdldBIMCgRyZXBvGAEgASgJEhEKCXdvcmtzcGFjZRgCIAEoCRIOCgZicmFuY2gYAyABKAkiTgoLT3BlblJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBINCgVzcGFucxgCIAEoCCJhCg1EaXJlY3RpdmVDYWxsEg4KBmRvbWFpbhgBIAEoCRIRCglkaXJlY3RpdmUYAiABKAkSLQoHcGF5bG9hZBgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCLAAgoQQXV0aG9yaW5nT3B0aW9ucxINCgVhY3RvchgBIAEoCRISCgphdXRoX3Rva2VuGAIgASgMEhUKDWF1dGhvcl9zZWNyZXQYAyABKAwSHQoQdmFsaWRfZnJvbV9lcG9jaBgEIAEoBEgAiAEBEh8KEnByaW5jaXBhbF92ZXJpZmllZBgFIAEoCEgBiAEBEgsKA3JuZxgGIAMoARIYChBkZWZlcl9wcm9qZWN0aW9uGAcgASgIEg0KBXNwYW5zGAggASgIEg8KB2RyeV9ydW4YCSABKAgSEAoIc2VxdWVuY2UYCiABKAQSLQoFY2xvY2sYCyABKAsyHi5ub21vcy5rZXJuZWwudjEuQ2FwdHVyZWRDbG9ja0ITChFfdmFsaWRfZnJvbV9lcG9jaEIVChNfcHJpbmNpcGFsX3ZlcmlmaWVkIkoKDUNhcHR1cmVkQ2xvY2sSFwoPcGh5c2ljYWxfbWlsbGlzGAEgASgEEg8KB2xvZ2ljYWwYAiABKA0SDwoHcmVwbGljYRgDIAEoBCLeAwoMT2ZmZXJSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSLgoEY2FsbBgCIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsSAASHAoSc2VhbGVkX2NoYW5nZV91c2RhGAcgASgMSAASNAoJYXV0aG9yaW5nGAMgASgLMiEubm9tb3Mua2VybmVsLnYxLkF1dGhvcmluZ09wdGlvbnMSEAoIbGF3X3VzZHoYBCABKAwSMwoMYXR0ZXN0YXRpb25zGAUgAygLMh0ubm9tb3Mua2VybmVsLnYxLkF0dGVzdGVkUmVhZBI9ChJjb25mbGljdF9zbmFwc2hvdHMYBiADKAsyIS5ub21vcy5rZXJuZWwudjEuQ29uZmxpY3RTbmFwc2hvdBIaChJleGVjdXRpb25fbGF3X3VzZHoYCCABKAwSIAoTY29udHJvbGxlcl9sYXdfaGFzaBgJIAEoCUgBiAEBEh0KEGNhbmRpZGF0ZV9jb21taXQYCiABKAlIAogBAUIICgZpbnRlbnRCFgoUX2NvbnRyb2xsZXJfbGF3X2hhc2hCEwoRX2NhbmRpZGF0ZV9jb21taXQikwEKDEF0dGVzdGVkUmVhZBIQCghxdWVyeV9pZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSKwoGcmVzdWx0GAMgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWUSEwoLYXR0ZXN0YXRpb24YBCABKAwidQoQQ29uZmxpY3RTbmFwc2hvdBIWCg5hZ2dyZWdhdGVfdHlwZRgBIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAiABKAkSDQoFZmllbGQYAyABKAkSFQoNdGFyZ2V0X3NjaGVtYRgEIAEoCRINCgV0b2tlbhgFIAEoCSLbBQoMUXVlcnlSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSMgoJYXV0aG9yaXR5GAIgASgLMh8ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5QXV0aG9yaXR5Eg0KBXNwYW5zGAMgASgIEioKBHJvd3MYCiABKAsyGi5ub21vcy5rZXJuZWwudjEuUm93c1F1ZXJ5SAASKgoEcGFnZRgLIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5QYWdlUXVlcnlIABIrCgVieV9pZBgMIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5CeUlkUXVlcnlIABI5CgxyZXNvbHZlX3JlZnMYDSABKAsyIS5ub21vcy5rZXJuZWwudjEuUmVzb2x2ZVJlZnNRdWVyeUgAEjsKDXJlZl9mcmVzaG5lc3MYDiABKAsyIi5ub21vcy5rZXJuZWwudjEuUmVmRnJlc2huZXNzUXVlcnlIABIsCgVjb3VudBgPIAEoCzIbLm5vbW9zLmtlcm5lbC52MS5UYWxseVF1ZXJ5SAASKgoDc3VtGBAgASgLMhsubm9tb3Mua2VybmVsLnYxLlRhbGx5UXVlcnlIABIwCgdzcGF0aWFsGBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlNwYXRpYWxRdWVyeUgAEiwKBW5hbWVkGBIgASgLMhsubm9tb3Mua2VybmVsLnYxLk5hbWVkUXVlcnlIABJJChNhdXRob3JpemF0aW9uX2NoZWNrGBMgASgLMioubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25DaGVja1JlcXVlc3RIABJLChRhdXRob3JpemF0aW9uX2V4cGFuZBgUIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwYW5kUmVxdWVzdEgAQgcKBXF1ZXJ5IpIBCg5RdWVyeUF1dGhvcml0eRIXCg9wcmluY2lwYWxfY2xhaW0YASABKAkSEgoKYXV0aF90b2tlbhgCIAEoDBIQCghub3dfdW5peBgDIAEoBBIVCg1hdXRob3Jfc2VjcmV0GAQgASgMEioKBGtleXMYBSADKAsyHC5ub21vcy5rZXJuZWwudjEuSW5qZWN0ZWRLZXkiOAoLSW5qZWN0ZWRLZXkSDQoFc2NvcGUYASABKAkSDQoFZXBvY2gYAiABKAQSCwoDa2V5GAMgASgMIlsKCVJvd3NRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJcHJpbmNpcGFsGAMgASgJInkKCVBhZ2VRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSDQoFbGltaXQYAyABKA0SDQoFYWZ0ZXIYBCABKAkSEQoJcHJpbmNpcGFsGAUgASgJIkwKCUJ5SWRRdWVyeRIWCg5hZ2dyZWdhdGVfdHlwZRgBIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJIlwKCE5vbW9zUmVmEhEKCXdvcmtzcGFjZRgBIAEoCRIWCg5hZ2dyZWdhdGVfdHlwZRgCIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAyABKAkSDwoHdmVyc2lvbhgEIAEoCSJOChBSZXNvbHZlUmVmc1F1ZXJ5EicKBHJlZnMYASADKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSEQoJcHJpbmNpcGFsGAIgASgJIkUKEVJlZkZyZXNobmVzc1F1ZXJ5EjAKBHJlZnMYASADKAsyIi5ub21vcy5rZXJuZWwudjEuUmVmRnJlc2huZXNzQ2hlY2sigAEKEVJlZkZyZXNobmVzc0NoZWNrEikKBnBpbm5lZBgBIAEoCzIZLm5vbW9zLmtlcm5lbC52MS5Ob21vc1JlZhIpCgZzZXJpZXMYAiABKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSFQoNY3VycmVudF9maWVsZBgDIAEoCSJcCgpUYWxseVF1ZXJ5EgoKAmlkGAEgASgJEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIRCglwcmluY2lwYWwYAyABKAkiXgoMU3BhdGlhbFF1ZXJ5EgoKAmlkGAEgASgJEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIRCglwcmluY2lwYWwYAyABKAkicQoKTmFtZWRRdWVyeRIyCglvcGVyYXRpb24YASABKA4yHy5ub21vcy5rZXJuZWwudjEuUXVlcnlPcGVyYXRpb24SLwoJYXJndW1lbnRzGAIgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0Ii8KE0F1dGhvcml6YXRpb25PYmplY3QSDAoEdHlwZRgBIAEoCRIKCgJpZBgCIAEoCSJUChRBdXRob3JpemF0aW9uU3ViamVjdBIMCgR0eXBlGAEgASgJEgoKAmlkGAIgASgJEhUKCHJlbGF0aW9uGAMgASgJSACIAQFCCwoJX3JlbGF0aW9uIpwBChhSZWxhdGlvbnNoaXBUdXBsZUFkZHJlc3MSNgoIcmVzb3VyY2UYASABKAsyJC5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbk9iamVjdBIQCghyZWxhdGlvbhgCIAEoCRI2CgdzdWJqZWN0GAMgASgLMiUubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25TdWJqZWN0IoEBChhBdXRob3JpemF0aW9uQ29uc2lzdGVuY3kSIwoZY3VycmVudF92ZXJpZmllZF9mcm9udGllchgBIAEoCEgAEhkKD2F0X2xlYXN0X2NvbW1pdBgCIAEoCUgAEhYKDGV4YWN0X2NvbW1pdBgDIAEoCUgAQg0KC3JlcXVpcmVtZW50ImYKHUF1dGhvcml6YXRpb25Db25kaXRpb25Db250ZXh0EhQKDGNvbmRpdGlvbl9pZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3Qi9wIKGUF1dGhvcml6YXRpb25DaGVja1JlcXVlc3QSNgoIcmVzb3VyY2UYASABKAsyJC5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbk9iamVjdBISCgpwZXJtaXNzaW9uGAIgASgJEjYKB3N1YmplY3QYAyABKAsyJS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvblN1YmplY3QSPgoLY29uc2lzdGVuY3kYBCABKAsyKS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbnNpc3RlbmN5Ej8KB2NvbnRleHQYBSADKAsyLi5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbmRpdGlvbkNvbnRleHQSIAoTZXhwZWN0ZWRfbW9kZWxfaGFzaBgGIAEoCUgAiAEBEhsKE2luY2x1ZGVfZXhwbGFuYXRpb24YByABKAhCFgoUX2V4cGVjdGVkX21vZGVsX2hhc2gi7QIKGkF1dGhvcml6YXRpb25FeHBhbmRSZXF1ZXN0EjYKCHJlc291cmNlGAEgASgLMiQubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25PYmplY3QSEgoKcGVybWlzc2lvbhgCIAEoCRI+Cgtjb25zaXN0ZW5jeRgDIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ29uc2lzdGVuY3kSPwoHY29udGV4dBgEIAMoCzIuLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ29uZGl0aW9uQ29udGV4dBIgChNleHBlY3RlZF9tb2RlbF9oYXNoGAUgASgJSACIAQESDQoFbGltaXQYBiABKA0SEgoFYWZ0ZXIYByABKAlIAYgBARIbChNpbmNsdWRlX2V4cGxhbmF0aW9uGAggASgIQhYKFF9leHBlY3RlZF9tb2RlbF9oYXNoQggKBl9hZnRlciK9AQoZUmVsYXRpb25zaGlwVHVwbGVFdmlkZW5jZRI4CgV0dXBsZRgBIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5SZWxhdGlvbnNoaXBUdXBsZUFkZHJlc3MSEAoIdHVwbGVfaWQYAiABKAkSGgoSYXNzZXJ0aW9uX2V2ZW50X2lkGAMgASgJEiAKE3Jldm9jYXRpb25fZXZlbnRfaWQYBCABKAlIAIgBAUIWChRfcmV2b2NhdGlvbl9ldmVudF9pZCLhAwoYQXV0aG9yaXphdGlvbkV4cGxhbmF0aW9uEkYKCW9wZXJhdGlvbhgBIAEoDjIzLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb24uT3BlcmF0aW9uEhAKCHJlbGF0aW9uGAIgASgJEg4KBnJlc3VsdBgDIAEoCBI8CghldmlkZW5jZRgEIAMoCzIqLm5vbW9zLmtlcm5lbC52MS5SZWxhdGlvbnNoaXBUdXBsZUV2aWRlbmNlEjsKCGNoaWxkcmVuGAUgAygLMikubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBsYW5hdGlvbiLfAQoJT3BlcmF0aW9uEhkKFU9QRVJBVElPTl9VTlNQRUNJRklFRBAAEhQKEE9QRVJBVElPTl9ESVJFQ1QQARIeChpPUEVSQVRJT05fQ09NUFVURURfVVNFUlNFVBACEh4KGk9QRVJBVElPTl9UVVBMRV9UT19VU0VSU0VUEAMSEwoPT1BFUkFUSU9OX1VOSU9OEAQSGgoWT1BFUkFUSU9OX0lOVEVSU0VDVElPThAFEhcKE09QRVJBVElPTl9FWENMVVNJT04QBhIXChNPUEVSQVRJT05fQ09ORElUSU9OEAcidwoaQXV0aG9yaXphdGlvbkRlY2lzaW9uQmFzaXMSIAoYYXV0aG9yaXphdGlvbl9tb2RlbF9oYXNoGAEgASgJEiEKGXJlbGF0aW9uc2hpcF9zdGF0ZV9jb21taXQYAiABKAkSFAoMY29udGV4dF9oYXNoGAMgASgMIr4BChpBdXRob3JpemF0aW9uQ2hlY2tSZXNwb25zZRIPCgdhbGxvd2VkGAEgASgIEjoKBWJhc2lzGAIgASgLMisubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25EZWNpc2lvbkJhc2lzEkMKC2V4cGxhbmF0aW9uGAMgASgLMikubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBsYW5hdGlvbkgAiAEBQg4KDF9leHBsYW5hdGlvbiKDAgobQXV0aG9yaXphdGlvbkV4cGFuZFJlc3BvbnNlEjcKCHN1YmplY3RzGAEgAygLMiUubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25TdWJqZWN0EjoKBWJhc2lzGAIgASgLMisubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25EZWNpc2lvbkJhc2lzEhEKBG5leHQYAyABKAlIAIgBARJDCgtleHBsYW5hdGlvbhgEIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb25IAYgBAUIHCgVfbmV4dEIOCgxfZXhwbGFuYXRpb24iQQoNT3V0Ym94UmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0ImMKC1N5bmNSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSEQoJZnJvbV9iYXNlGAIgASgJEg8KB3RvX2hlYWQYAyABKAkiUwoLVGVzdFJlcXVlc3QSNwoIc2V0X3Jvb3QYASABKAsyIy5ub21vcy5rZXJuZWwudjEuU2V0VGVzdFJvb3RSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIigKElNldFRlc3RSb290UmVxdWVzdBISCgpwdWJsaWNfa2V5GAEgASgMIj0KDFRlc3RSZXNwb25zZRItCgZyZXN1bHQYASABKAsyHS5ub21vcy5rZXJuZWwudjEuQWNrbm93bGVkZ2VkIoMJCg5DdXN0b2R5UmVxdWVzdBI3CgpwYWNrX2RlbHRhGAogASgLMiEubm9tb3Mua2VybmVsLnYxLlBhY2tEZWx0YVJlcXVlc3RIABI3CgphcHBseV9wYWNrGAsgASgLMiEubm9tb3Mua2VybmVsLnYxLkFwcGx5UGFja1JlcXVlc3RIABI3CgpyZXBvX3N0YXRzGAwgASgLMiEubm9tb3Mua2VybmVsLnYxLlJlcG9TdGF0c1JlcXVlc3RIABI9Cg1pbnRlbnRzX2Fib3ZlGA0gASgLMiQubm9tb3Mua2VybmVsLnYxLkludGVudHNBYm92ZVJlcXVlc3RIABI/Cg5pbnNwZWN0X2NoYW5nZRgOIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5JbnNwZWN0Q2hhbmdlUmVxdWVzdEgAEkEKD2VuY29kZV9kb2N1bWVudBgPIAEoCzImLm5vbW9zLmtlcm5lbC52MS5FbmNvZGVEb2N1bWVudFJlcXVlc3RIABJDChBpbnNwZWN0X2RvY3VtZW50GBAgASgLMicubm9tb3Mua2VybmVsLnYxLkluc3BlY3REb2N1bWVudFJlcXVlc3RIABI1CglyZWFkX2Jsb2IYESABKAsyIC5ub21vcy5rZXJuZWwudjEuUmVhZEJsb2JSZXF1ZXN0SAASOQoLcmVzb2x2ZV9yZWYYEiABKAsyIi5ub21vcy5rZXJuZWwudjEuUmVzb2x2ZVJlZlJlcXVlc3RIABI1CglsaXN0X3JlZnMYEyABKAsyIC5ub21vcy5rZXJuZWwudjEuTGlzdFJlZnNSZXF1ZXN0SAASNQoJd3JpdGVfcmVmGBQgASgLMiAubm9tb3Mua2VybmVsLnYxLldyaXRlUmVmUmVxdWVzdEgAEjcKCmRlbGV0ZV9yZWYYFSABKAsyIS5ub21vcy5rZXJuZWwudjEuRGVsZXRlUmVmUmVxdWVzdEgAEkQKEXdyaXRlX21ldGFfY29tbWl0GBYgASgLMicubm9tb3Mua2VybmVsLnYxLldyaXRlTWV0YUNvbW1pdFJlcXVlc3RIABJCChBsYXdfY2xvc3VyZV9pbmZvGBcgASgLMiYubm9tb3Mua2VybmVsLnYxLkxhd0Nsb3N1cmVJbmZvUmVxdWVzdEgAEkUKEWNoZWNrcG9pbnRfZXhwb3J0GBggASgLMigubm9tb3Mua2VybmVsLnYxLkNoZWNrcG9pbnRFeHBvcnRSZXF1ZXN0SAASRQoRY2hlY2twb2ludF9pbXBvcnQYGSABKAsyKC5ub21vcy5rZXJuZWwudjEuQ2hlY2twb2ludEltcG9ydFJlcXVlc3RIABJDChBjYXBhY2l0eV9yZXNlcnZlGBogASgLMicubm9tb3Mua2VybmVsLnYxLkNhcGFjaXR5UmVzZXJ2ZVJlcXVlc3RIABI7CgxyZXN0b3JlX21haW4YGyABKAsyIy5ub21vcy5rZXJuZWwudjEuUmVzdG9yZU1haW5SZXF1ZXN0SABCCwoJb3BlcmF0aW9uImgKEFBhY2tEZWx0YVJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCgRoZWFkGAIgASgJSACIAQESEQoEYmFzZRgDIAEoCUgBiAEBEg4KBmJyYW5jaBgEIAEoCUIHCgVfaGVhZEIHCgVfYmFzZSJyChBBcHBseVBhY2tSZXF1ZXN0EgwKBHJlcG8YASABKAkSDgoEcGFjaxgCIAEoDEgAEhoKEHN0YWdlZF9wYWNrX2ZpbGUYBCABKAlIABIRCgRoZWFkGAMgASgJSAGIAQFCCAoGc291cmNlQgcKBV9oZWFkIiAKEFJlcG9TdGF0c1JlcXVlc3QSDAoEcmVwbxgBIAEoCSKsAQoTSW50ZW50c0Fib3ZlUmVxdWVzdBIMCgRyZXBvGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBARIRCgRiYXNlGAMgASgJSAGIAQESDgoGYnJhbmNoGAQgASgJEg0KBWxpbWl0GAUgASgEEhgKEGNvbXBsZXRlX2xvZ2ljYWwYBiABKAgSFgoOY29tcGFjdF9zdG9yZWQYByABKAhCBwoFX2hlYWRCBwoFX2Jhc2UiKwoUSW5zcGVjdENoYW5nZVJlcXVlc3QSEwoLY2hhbmdlX3VzZGEYASABKAwiRgoVRW5jb2RlRG9jdW1lbnRSZXF1ZXN0Ei0KCGRvY3VtZW50GAEgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWUiLwoWSW5zcGVjdERvY3VtZW50UmVxdWVzdBIVCg1kb2N1bWVudF91c2RhGAEgASgMIjoKD1JlYWRCbG9iUmVxdWVzdBIMCgRyZXBvGAEgASgJEgsKA29pZBgCIAEoCRIMCgRwYXRoGAMgASgJIjQKEVJlc29sdmVSZWZSZXF1ZXN0EgwKBHJlcG8YASABKAkSEQoJcmVmZXJlbmNlGAIgASgJIi8KD0xpc3RSZWZzUmVxdWVzdBIMCgRyZXBvGAEgASgJEg4KBnByZWZpeBgCIAEoCSJCCg9Xcml0ZVJlZlJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCglyZWZlcmVuY2UYAiABKAkSDgoGdGFyZ2V0GAMgASgJIjMKEERlbGV0ZVJlZlJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCglyZWZlcmVuY2UYAiABKAkiKQoITWV0YUZpbGUSDAoEcGF0aBgBIAEoCRIPCgdjb250ZW50GAIgASgMIq4BChZXcml0ZU1ldGFDb21taXRSZXF1ZXN0EgwKBHJlcG8YASABKAkSDwoHcGFyZW50cxgCIAMoCRIoCgVmaWxlcxgDIAMoCzIZLm5vbW9zLmtlcm5lbC52MS5NZXRhRmlsZRIPCgdtZXNzYWdlGAQgASgJEhQKDHRpbWVfc2Vjb25kcxgFIAEoEhIWCglyZWZlcmVuY2UYBiABKAlIAIgBAUIMCgpfcmVmZXJlbmNlIi0KFUxhd0Nsb3N1cmVJbmZvUmVxdWVzdBIUCgxjbG9zdXJlX2ZpbGUYASABKAkihwEKF0NoZWNrcG9pbnRFeHBvcnRSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSIQoUc3RhZ2VkX2Zyb250aWVyX2ZpbGUYAiABKAlIAIgBAUIXChVfc3RhZ2VkX2Zyb250aWVyX2ZpbGUi6QEKF0NoZWNrcG9pbnRJbXBvcnRSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSEgoIZnJvbnRpZXIYAiABKAxIABIeChRzdGFnZWRfZnJvbnRpZXJfZmlsZRgGIAEoCUgAEhMKBmN1cnNvchgDIAEoCUgBiAEBEhcKCnN0YXRlX3Jvb3QYBCABKAlIAogBARINCgVzcGFucxgFIAEoCEIRCg9mcm9udGllcl9zb3VyY2VCCQoHX2N1cnNvckINCgtfc3RhdGVfcm9vdCIxChZDYXBhY2l0eVJlc2VydmVSZXF1ZXN0EhcKD2FnZ3JlZ2F0ZV9jb3VudBgBIAEoBCJUChJSZXN0b3JlTWFpblJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBIMCgRoZWFkGAIgASgJIo0JCg9DdXN0b2R5UmVzcG9uc2USOAoKcGFja19kZWx0YRgKIAEoCzIiLm5vbW9zLmtlcm5lbC52MS5QYWNrRGVsdGFSZXNwb25zZUgAEjgKCmFwcGx5X3BhY2sYCyABKAsyIi5ub21vcy5rZXJuZWwudjEuQXBwbHlQYWNrUmVzcG9uc2VIABI4CgpyZXBvX3N0YXRzGAwgASgLMiIubm9tb3Mua2VybmVsLnYxLlJlcG9TdGF0c1Jlc3BvbnNlSAASPgoNaW50ZW50c19hYm92ZRgNIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5JbnRlbnRzQWJvdmVSZXNwb25zZUgAEkAKDmluc3BlY3RfY2hhbmdlGA4gASgLMiYubm9tb3Mua2VybmVsLnYxLkluc3BlY3RDaGFuZ2VSZXNwb25zZUgAEkIKD2VuY29kZV9kb2N1bWVudBgPIAEoCzInLm5vbW9zLmtlcm5lbC52MS5FbmNvZGVEb2N1bWVudFJlc3BvbnNlSAASRAoQaW5zcGVjdF9kb2N1bWVudBgQIAEoCzIoLm5vbW9zLmtlcm5lbC52MS5JbnNwZWN0RG9jdW1lbnRSZXNwb25zZUgAEjYKCXJlYWRfYmxvYhgRIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5SZWFkQmxvYlJlc3BvbnNlSAASOgoLcmVzb2x2ZV9yZWYYEiABKAsyIy5ub21vcy5rZXJuZWwudjEuUmVzb2x2ZVJlZlJlc3BvbnNlSAASNgoJbGlzdF9yZWZzGBMgASgLMiEubm9tb3Mua2VybmVsLnYxLkxpc3RSZWZzUmVzcG9uc2VIABIyCgl3cml0ZV9yZWYYFCABKAsyHS5ub21vcy5rZXJuZWwudjEuQWNrbm93bGVkZ2VkSAASMwoKZGVsZXRlX3JlZhgVIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5BY2tub3dsZWRnZWRIABJFChF3cml0ZV9tZXRhX2NvbW1pdBgWIAEoCzIoLm5vbW9zLmtlcm5lbC52MS5Xcml0ZU1ldGFDb21taXRSZXNwb25zZUgAEkMKEGxhd19jbG9zdXJlX2luZm8YFyABKAsyJy5ub21vcy5rZXJuZWwudjEuTGF3Q2xvc3VyZUluZm9SZXNwb25zZUgAEkYKEWNoZWNrcG9pbnRfZXhwb3J0GBggASgLMikubm9tb3Mua2VybmVsLnYxLkNoZWNrcG9pbnRFeHBvcnRSZXNwb25zZUgAEkYKEWNoZWNrcG9pbnRfaW1wb3J0GBkgASgLMikubm9tb3Mua2VybmVsLnYxLkNoZWNrcG9pbnRJbXBvcnRSZXNwb25zZUgAEkQKEGNhcGFjaXR5X3Jlc2VydmUYGiABKAsyKC5ub21vcy5rZXJuZWwudjEuQ2FwYWNpdHlSZXNlcnZlUmVzcG9uc2VIABI8CgxyZXN0b3JlX21haW4YGyABKAsyJC5ub21vcy5rZXJuZWwudjEuUmVzdG9yZU1haW5SZXNwb25zZUgAQgsKCW9wZXJhdGlvbiIhChFQYWNrRGVsdGFSZXNwb25zZRIMCgRwYWNrGAEgASgMIjwKEUFwcGx5UGFja1Jlc3BvbnNlEhQKDG9iamVjdF9jb3VudBgBIAEoBBIRCglwYWNrX2hhc2gYAiABKAkipwEKEVJlcG9TdGF0c1Jlc3BvbnNlEhMKC3RvdGFsX2J5dGVzGAEgASgEEhQKDG9iamVjdF9ieXRlcxgCIAEoBBIVCg1sb29zZV9vYmplY3RzGAMgASgEEhMKC2xvb3NlX2J5dGVzGAQgASgEEhIKCnBhY2tfZmlsZXMYBSABKAQSEgoKcGFja19ieXRlcxgGIAEoBBITCgtpbmRleF9ieXRlcxgHIAEoBCKWAQoMSW50ZW50UmVjb3JkEgsKA29pZBgBIAEoCRIRCglpbnRlbnRfaWQYAiABKAkSDgoGZG9tYWluGAMgASgJEhEKCWRpcmVjdGl2ZRgEIAEoCRITCgtjaGFuZ2VfdXNkYRgFIAEoDBIuCghzZW1hbnRpYxgGIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCJGChRJbnRlbnRzQWJvdmVSZXNwb25zZRIuCgdpbnRlbnRzGAEgAygLMh0ubm9tb3Mua2VybmVsLnYxLkludGVudFJlY29yZCJHChVJbnNwZWN0Q2hhbmdlUmVzcG9uc2USLgoIc2VtYW50aWMYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QiLwoWRW5jb2RlRG9jdW1lbnRSZXNwb25zZRIVCg1kb2N1bWVudF91c2RhGAEgASgMIkgKF0luc3BlY3REb2N1bWVudFJlc3BvbnNlEi0KCGRvY3VtZW50GAEgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWUiLwoQUmVhZEJsb2JSZXNwb25zZRINCgVmb3VuZBgBIAEoCBIMCgRibG9iGAIgASgMIi4KElJlc29sdmVSZWZSZXNwb25zZRIQCgNvaWQYASABKAlIAIgBAUIGCgRfb2lkIisKCVJlZlJlY29yZBIRCglyZWZlcmVuY2UYASABKAkSCwoDb2lkGAIgASgJIjwKEExpc3RSZWZzUmVzcG9uc2USKAoEcmVmcxgBIAMoCzIaLm5vbW9zLmtlcm5lbC52MS5SZWZSZWNvcmQiDgoMQWNrbm93bGVkZ2VkIiYKF1dyaXRlTWV0YUNvbW1pdFJlc3BvbnNlEgsKA29pZBgBIAEoCSKDAQoWTGF3Q2xvc3VyZUluZm9SZXNwb25zZRIQCghpZGVudGl0eRgBIAEoCRIZChFyb290X2xvZ2ljYWxfcGF0aBgCIAEoCRITCgthc3NldF9jb3VudBgDIAEoBBISCgpwcmltX2NvdW50GAQgASgEEhMKC2RvbWFpbl9rZXlzGAUgAygJIu8CChhDaGVja3BvaW50RXhwb3J0UmVzcG9uc2USDQoFZW1wdHkYASABKAgSEwoGY3Vyc29yGAIgASgJSACIAQESEAoIZnJvbnRpZXIYAyABKAwSFwoKc3RhdGVfcm9vdBgEIAEoCUgBiAEBEhIKCnN0YXRlX3RyZWUYBSABKAgSDgoGcGlubmVkGAYgASgIEhsKE3JlYWRfaW5kZXhfc25hcHNob3QYByABKAgSIwobcmVhZF9pbmRleF9zbmFwc2hvdF9wZW5kaW5nGAggASgIEiQKF3JlYWRfaW5kZXhfc3FsaXRlX2J5dGVzGAkgASgESAKIAQESJQoYcmVhZF9pbmRleF9jdXN0b2R5X2J5dGVzGAogASgESAOIAQFCCQoHX2N1cnNvckINCgtfc3RhdGVfcm9vdEIaChhfcmVhZF9pbmRleF9zcWxpdGVfYnl0ZXNCGwoZX3JlYWRfaW5kZXhfY3VzdG9keV9ieXRlcyKeAgoYQ2hlY2twb2ludEltcG9ydFJlc3BvbnNlEhAKCHJlc3RvcmVkGAEgASgIEhMKBnJlYXNvbhgCIAEoCUgAiAEBEhcKD2Zyb250aWVyX3NlZWRlZBgDIAEoCBIlCh1mcm9udGllcl92ZXJpZmljYXRpb25fcGVuZGluZxgEIAEoCBIXCg9hZ2dyZWdhdGVfY291bnQYBSABKAQSKwoFc3BhbnMYBiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEwoGY3Vyc29yGAcgASgJSAGIAQESEQoJcmVhZF9vbmx5GAggASgIEhcKD2xhenlfcmVhZF9pbmRleBgJIAEoCEIJCgdfcmVhc29uQgkKB19jdXJzb3IiSgoXQ2FwYWNpdHlSZXNlcnZlUmVzcG9uc2USFwoPYWdncmVnYXRlX2NvdW50GAEgASgEEhYKDnJlc2VydmVkX2J5dGVzGAIgASgEIkMKE1Jlc3RvcmVNYWluUmVzcG9uc2USDAoEaGVhZBgBIAEoCRIQCgh2ZXJpZmllZBgCIAEoCBIMCgR3YWxrGAMgASgJIpsCCgpOb21vc1ZhbHVlEiUKBG51bGwYASABKAsyFS5ub21vcy5rZXJuZWwudjEuTnVsbEgAEhEKB2Jvb2xlYW4YAiABKAhIABIYCg5zaWduZWRfaW50ZWdlchgDIAEoEkgAEhoKEHVuc2lnbmVkX2ludGVnZXIYBCABKARIABIYCg5mbG9hdGluZ19wb2ludBgFIAEoAUgAEg4KBHRleHQYBiABKAlIABIPCgVieXRlcxgHIAEoDEgAEioKBGxpc3QYCCABKAsyGi5ub21vcy5rZXJuZWwudjEuTm9tb3NMaXN0SAASLgoGb2JqZWN0GAkgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0SABCBgoEa2luZCIGCgROdWxsIjgKCU5vbW9zTGlzdBIrCgZ2YWx1ZXMYASADKAsyGy5ub21vcy5rZXJuZWwudjEuTm9tb3NWYWx1ZSKTAQoLTm9tb3NTdHJ1Y3QSOAoGZmllbGRzGAEgAygLMigubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0LkZpZWxkc0VudHJ5GkoKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIqCgV2YWx1ZRgCIAEoCzIbLm5vbW9zLmtlcm5lbC52MS5Ob21vc1ZhbHVlOgI4ASrpEgoRS2VybmVsUmVmdXNhbENvZGUSIwofS0VSTkVMX1JFRlVTQUxfQ09ERV9VTlNQRUNJRklFRBAAEiUKIUtFUk5FTF9SRUZVU0FMX0NPREVfQkFEX1NJR05BVFVSRRABEiQKIEtFUk5FTF9SRUZVU0FMX0NPREVfVU5BVVRIT1JJWkVEEAISJwojS0VSTkVMX1JFRlVTQUxfQ09ERV9QT0xJQ1lfRElTQUJMRUQQAxIqCiZLRVJORUxfUkVGVVNBTF9DT0RFX1VOQ0VSVElGSUVEX1BPTElDWRAEEiMKH0tFUk5FTF9SRUZVU0FMX0NPREVfUkVGRVJFTlRJQUwQBRIvCitLRVJORUxfUkVGVVNBTF9DT0RFX1BPSU5UX1NUQVRFX1VOQVZBSUxBQkxFEAYSJAogS0VSTkVMX1JFRlVTQUxfQ09ERV9DQVBfRVhDRUVERUQQBxItCilLRVJORUxfUkVGVVNBTF9DT0RFX0NBUF9DT1VOVF9VTkFWQUlMQUJMRRAIEikKJUtFUk5FTF9SRUZVU0FMX0NPREVfRVZJREVOQ0VfVU5CQUNLRUQQCRImCiJLRVJORUxfUkVGVVNBTF9DT0RFX09SUEhBTl9SRUNFSVBUEAoSNgoyS0VSTkVMX1JFRlVTQUxfQ09ERV9SRUNFSVBUX09OX1RFUk1JTkFMX09CTElHQVRJT04QCxIiCh5LRVJORUxfUkVGVVNBTF9DT0RFX05PVF9NSU5URUQQDBIoCiRLRVJORUxfUkVGVVNBTF9DT0RFX0RPTUFJTl9MSUZFQ1lDTEUQDRIpCiVLRVJORUxfUkVGVVNBTF9DT0RFX1RZUEVfVEFHX01JU01BVENIEA4SLAooS0VSTkVMX1JFRlVTQUxfQ09ERV9SRVRJUkVEX1JFQURfU1VSRkFDRRAPEjAKLEtFUk5FTF9SRUZVU0FMX0NPREVfQ1JPU1NfV09SS1NQQUNFX0RFQ0xJTkVEEBASKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9BR0dSRUdBVEVfSU5WQVJJQU5UEBESKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9XT1JLU1BBQ0VfSU5WQVJJQU5UEBISLgoqS0VSTkVMX1JFRlVTQUxfQ09ERV9DQVBUVVJFRF9SRUFEX0NPTkZMSUNUEBMSMgouS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9SRVFVSVJFRBAUEjQKMEtFUk5FTF9SRUZVU0FMX0NPREVfQ09ORkxJQ1RfU05BUFNIT1RfVU5ERUNMQVJFRBAVEjEKLUtFUk5FTF9SRUZVU0FMX0NPREVfQ09ORkxJQ1RfU05BUFNIT1RfSU5WQUxJRBAWEi8KK0tFUk5FTF9SRUZVU0FMX0NPREVfQ09ORkxJQ1RfU05BUFNIT1RfU1RBTEUQFxIwCixLRVJORUxfUkVGVVNBTF9DT0RFX0NBUFRVUkVEX1JFQURfVU5ERUNMQVJFRBAYEi0KKUtFUk5FTF9SRUZVU0FMX0NPREVfQ0FQVFVSRURfUkVBRF9QUklWQVRFEBkSMAosS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX1VOREVDTEFSRUQQGhIzCi9LRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEVEX1JFQURfVU5UUlVTVEVEX0tFWRAbEjYKMktFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9VTlRSVVNURURfU09VUkNFEBwSLAooS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX0ZPUkdFRBAdEisKJ0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9TVEFMRRAeEi4KKktFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9PVkVSU0laRRAfEjcKM0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9ESVNIT05PUkVEX1NPVVJDRRAgEjUKMUtFUk5FTF9SRUZVU0FMX0NPREVfRVFVSVZPQ0FUSU9OX0VWSURFTkNFX0lOVkFMSUQQIRIzCi9LRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEFUSU9OX1JFQ0VJUFRfSU5WQUxJRBAiEisKJ0tFUk5FTF9SRUZVU0FMX0NPREVfS0VZX1JPU1RFUl9NSVNNQVRDSBAjEi8KK0tFUk5FTF9SRUZVU0FMX0NPREVfS0VZX0VQT0NIX05PVF9NT05PVE9OSUMQJBIpCiVLRVJORUxfUkVGVVNBTF9DT0RFX1dSSVRFX0VQT0NIX1NUQUxFECUSLQopS0VSTkVMX1JFRlVTQUxfQ09ERV9FTlZFTE9QRV9TSURfTUlTTUFUQ0gQJhIyCi5LRVJORUxfUkVGVVNBTF9DT0RFX1JFVk9LRURfTUVNQkVSX1JFU1VSUkVDVEVEECcSKAokS0VSTkVMX1JFRlVTQUxfQ09ERV9GT1JHRURfUFJJTkNJUEFMECgSKAokS0VSTkVMX1JFRlVTQUxfQ09ERV9PV05FRF9LRVlfQU5DSE9SECkSJgoiS0VSTkVMX1JFRlVTQUxfQ09ERV9PV05FRF9SRUNPVkVSWRAqEiwKKEtFUk5FTF9SRUZVU0FMX0NPREVfU1VSRkFDRURfQkFTSVNfQUhFQUQQKxIyCi5LRVJORUxfUkVGVVNBTF9DT0RFX1NJR05FUl9FUE9DSF9PVVRfT0ZfV0lORE9XECwSJgoiS0VSTkVMX1JFRlVTQUxfQ09ERV9FVk9MVkVfUkVGVVNFRBAtEisKJ0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNUQVRJT05fSU5WQUxJRBAuEi0KKUtFUk5FTF9SRUZVU0FMX0NPREVfUEFSRU5UX0RJRF9OT1RfQVRURVNUEC8SKQolS0VSTkVMX1JFRlVTQUxfQ09ERV9DRVJUX0NIQUlOX0JST0tFThAwEioKJktFUk5FTF9SRUZVU0FMX0NPREVfTk9UX1JPT1RFRF9BVF9ST09UEDESKgomS0VSTkVMX1JFRlVTQUxfQ09ERV9ERUxFR0FUSU9OX0lOVkFMSUQQMhIlCiFLRVJORUxfUkVGVVNBTF9DT0RFX1BMQU5fUkVKRUNURUQQMyqFDAoOUXVlcnlPcGVyYXRpb24SHwobUVVFUllfT1BFUkFUSU9OX1VOU1BFQ0lGSUVEEAASHAoYUVVFUllfT1BFUkFUSU9OX0VYVFJFTVVNEAESJQohUVVFUllfT1BFUkFUSU9OX1BFTkRJTkdfQ09ORkxJQ1RTEAISLAooUVVFUllfT1BFUkFUSU9OX1BFTkRJTkdfQ09ORkxJQ1RfU1VNTUFSWRADEiAKHFFVRVJZX09QRVJBVElPTl9SRUFEX1BPU1RVUkUQBBIfChtRVUVSWV9PUEVSQVRJT05fQ1VSUkVOVF9MQVcQBRIjCh9RVUVSWV9PUEVSQVRJT05fSU5URVJGQUNFX09GRkVSEAYSJwojUVVFUllfT1BFUkFUSU9OX1JFTEFUSU9OX0dBVEVfT0ZGRVIQBxIdChlRVUVSWV9PUEVSQVRJT05fU0NFTkVfTEFXEAgSIQodUVVFUllfT1BFUkFUSU9OX0lOU1RBTExFRF9MQVcQCRIcChhRVUVSWV9PUEVSQVRJT05fREVTQ1JJQkUQChIgChxRVUVSWV9PUEVSQVRJT05fS0VSTkVMX1NUQU1QEAsSIwofUVVFUllfT1BFUkFUSU9OX0RFVkVMT1BFUl9TUEFOUxAMEikKJVFVRVJZX09QRVJBVElPTl9ERUNMQVJFRF9DQVBBQklMSVRJRVMQDRIdChlRVUVSWV9PUEVSQVRJT05fUkVBRElORVNTEA4SJAogUVVFUllfT1BFUkFUSU9OX1BST0pFQ1RJT05fU1RBVFMQDxIlCiFRVUVSWV9PUEVSQVRJT05fTUVNT1JZX0RST1BfUFJPQkUQEBIYChRRVUVSWV9PUEVSQVRJT05fV0FSTRAREhsKF1FVRVJZX09QRVJBVElPTl9SRUZSRVNIEBISIAocUVVFUllfT1BFUkFUSU9OX1ZFUklGWV9DSEFJThATEiUKIVFVRVJZX09QRVJBVElPTl9ISVNUT1JZX1BSRUZMSUdIVBAUEhkKFVFVRVJZX09QRVJBVElPTl9ST1VURRAVEhgKFFFVRVJZX09QRVJBVElPTl9NSU5UEBYSIQodUVVFUllfT1BFUkFUSU9OX0NSWVBUT19LRVlHRU4QFxIlCiFRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX1NFQUxfRklFTEQQGBIsCihRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX0JMSU5EX0lOREVYX1RPS0VOEBkSKgomUVVFUllfT1BFUkFUSU9OX0NSWVBUT19PV05FRF9TQ09QRV9LRVkQGhIvCitRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX0RFVklDRV9SRVFVRVNUEBsSMQotUVVFUllfT1BFUkFUSU9OX0NSWVBUT19PV05FRF9QUkVQQVJFX0FQUFJPVkFMEBwSMQotUVVFUllfT1BFUkFUSU9OX0NSWVBUT19PV05FRF9QUkVQQVJFX1JFQ09WRVJZEB0SIwofUVVFUllfT1BFUkFUSU9OX0NSWVBUT19XUkFQX0tFWRAeEiUKIVFVRVJZX09QRVJBVElPTl9DUllQVE9fVU5XUkFQX0tFWRAfEiEKHVFVRVJZX09QRVJBVElPTl9BVVRIT1JfS0VZR0VOECASJAogUVVFUllfT1BFUkFUSU9OX0FUVEVTVEFUSU9OX1NJR04QIRIgChxRVUVSWV9PUEVSQVRJT05fUkVDRUlQVF9QQVRIECISHQoZUVVFUllfT1BFUkFUSU9OX0NFUlRfU0lHThAjEiUKIVFVRVJZX09QRVJBVElPTl9CSVJUSF9UUlVTVF9TVEFURRAkEiEKHVFVRVJZX09QRVJBVElPTl9FUkFfQ0VSVF9TSUdOECUSKAokUVVFUllfT1BFUkFUSU9OX0RFTEVHQVRJT05fQ0VSVF9TSUdOECYSKQolUVVFUllfT1BFUkFUSU9OX0NBTk9OSUNBTElaRV9GUk9OVElFUhAnEisKJ1FVRVJZX09QRVJBVElPTl9DQU5PTklDQUxJWkVfUFJPSkVDVElPThAoMlkKEk5vbW9zS2VybmVsU2VydmljZRJDCgRDYWxsEhwubm9tb3Mua2VybmVsLnYxLkNhbGxSZXF1ZXN0Gh0ubm9tb3Mua2VybmVsLnYxLkNhbGxSZXNwb25zZWIGcHJvdG8z");
|
|
5344
|
+
var file_nomos_kernel_v1_kernel = /* @__PURE__ */ fileDesc("Chxub21vcy9rZXJuZWwvdjEva2VybmVsLnByb3RvEg9ub21vcy5rZXJuZWwudjEimAMKC0NhbGxSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRIsCgRvcGVuGAogASgLMhwubm9tb3Mua2VybmVsLnYxLk9wZW5SZXF1ZXN0SAASLgoFb2ZmZXIYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXF1ZXN0SAASLgoFcXVlcnkYDCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0SAASMAoGb3V0Ym94GA0gASgLMh4ubm9tb3Mua2VybmVsLnYxLk91dGJveFJlcXVlc3RIABIsCgRzeW5jGA4gASgLMhwubm9tb3Mua2VybmVsLnYxLlN5bmNSZXF1ZXN0SAASMgoHY3VzdG9keRgPIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVxdWVzdEgAEiwKBHRlc3QYECABKAsyHC5ub21vcy5rZXJuZWwudjEuVGVzdFJlcXVlc3RIAEILCglvcGVyYXRpb24iywMKDENhbGxSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSKwoHZmFpbHVyZRgKIAEoCzIYLm5vbW9zLmtlcm5lbC52MS5GYWlsdXJlSAASLQoEb3BlbhgLIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5PcGVuUmVzcG9uc2VIABIvCgVvZmZlchgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlSAASLwoFcXVlcnkYDSABKAsyHi5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXNwb25zZUgAEjEKBm91dGJveBgOIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5PdXRib3hSZXNwb25zZUgAEi0KBHN5bmMYDyABKAsyHS5ub21vcy5rZXJuZWwudjEuU3luY1Jlc3BvbnNlSAASMwoHY3VzdG9keRgQIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVzcG9uc2VIABItCgR0ZXN0GBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlRlc3RSZXNwb25zZUgAQgkKB291dGNvbWUiVwoHRmFpbHVyZRIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSLQoHZGV0YWlscxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCI8CgxPcGVuUmVzcG9uc2USLAoGcmVzdWx0GAEgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IsMCCg1PZmZlclJlc3BvbnNlEjIKCGFkbWl0dGVkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLk9mZmVyQWRtaXR0ZWRIABIwCgdyZWZ1c2VkGAIgASgLMh0ubm9tb3Mua2VybmVsLnYxLk9mZmVyUmVmdXNlZEgAEjsKDWRlYWRfbGV0dGVyZWQYAyABKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJEZWFkTGV0dGVyZWRIABI4CgtxdWFyYW50aW5lZBgEIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5PZmZlclF1YXJhbnRpbmVkSAASSgoVYmxvY2tlZF9vbl9kZXBlbmRlbmN5GAUgASgLMikubm9tb3Mua2VybmVsLnYxLk9mZmVyQmxvY2tlZE9uRGVwZW5kZW5jeUgAQgkKB291dGNvbWUiPQoNT2ZmZXJBZG1pdHRlZBIsCgZyZXN1bHQYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QilgEKDE9mZmVyUmVmdXNlZBIVCghvZmZlcl9pZBgBIAEoCUgAiAEBEi8KB3JlZnVzYWwYAiABKAsyHi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbBIxCgtkaWFnbm9zdGljcxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdEILCglfb2ZmZXJfaWQiegoRT2ZmZXJEZWFkTGV0dGVyZWQSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZyZWFzb24YAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIq4BChBPZmZlclF1YXJhbnRpbmVkEhUKCG9mZmVyX2lkGAEgASgJSACIAQESGQoRYXV0aG9yZWRfbGF3X2hhc2gYAiABKAkSGAoQY3VycmVudF9sYXdfaGFzaBgDIAEoCRIOCgZyZWFzb24YBCABKAkSMQoLZGlhZ25vc3RpY3MYBSABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBChhPZmZlckJsb2NrZWRPbkRlcGVuZGVuY3kSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZkZXRhaWwYAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBCg1LZXJuZWxSZWZ1c2FsEjAKBGNvZGUYASABKA4yIi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbENvZGUSDwoHbWVzc2FnZRgCIAEoCRItCgdkZXRhaWxzGAMgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IqQCCg1RdWVyeVJlc3BvbnNlEiwKBXZhbHVlGAEgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWVIABJBChBhcHBsaWNhdGlvbl9qc29uGAIgASgLMiUubm9tb3Mua2VybmVsLnYxLkFwcGxpY2F0aW9uSnNvblZhbHVlSAASSgoTYXV0aG9yaXphdGlvbl9jaGVjaxgKIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ2hlY2tSZXNwb25zZUgAEkwKFGF1dGhvcml6YXRpb25fZXhwYW5kGAsgASgLMiwubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBhbmRSZXNwb25zZUgAQggKBnJlc3VsdCIkChRBcHBsaWNhdGlvbkpzb25WYWx1ZRIMCgR1dGY4GAEgASgMIj4KDk91dGJveFJlc3BvbnNlEiwKBnJlc3VsdBgBIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCI8CgxTeW5jUmVzcG9uc2USLAoGcmVzdWx0GAEgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IkIKD1dvcmtzcGFjZVRhcmdldBIMCgRyZXBvGAEgASgJEhEKCXdvcmtzcGFjZRgCIAEoCRIOCgZicmFuY2gYAyABKAkiTgoLT3BlblJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBINCgVzcGFucxgCIAEoCCJhCg1EaXJlY3RpdmVDYWxsEg4KBmRvbWFpbhgBIAEoCRIRCglkaXJlY3RpdmUYAiABKAkSLQoHcGF5bG9hZBgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCLAAgoQQXV0aG9yaW5nT3B0aW9ucxINCgVhY3RvchgBIAEoCRISCgphdXRoX3Rva2VuGAIgASgMEhUKDWF1dGhvcl9zZWNyZXQYAyABKAwSHQoQdmFsaWRfZnJvbV9lcG9jaBgEIAEoBEgAiAEBEh8KEnByaW5jaXBhbF92ZXJpZmllZBgFIAEoCEgBiAEBEgsKA3JuZxgGIAMoARIYChBkZWZlcl9wcm9qZWN0aW9uGAcgASgIEg0KBXNwYW5zGAggASgIEg8KB2RyeV9ydW4YCSABKAgSEAoIc2VxdWVuY2UYCiABKAQSLQoFY2xvY2sYCyABKAsyHi5ub21vcy5rZXJuZWwudjEuQ2FwdHVyZWRDbG9ja0ITChFfdmFsaWRfZnJvbV9lcG9jaEIVChNfcHJpbmNpcGFsX3ZlcmlmaWVkIkoKDUNhcHR1cmVkQ2xvY2sSFwoPcGh5c2ljYWxfbWlsbGlzGAEgASgEEg8KB2xvZ2ljYWwYAiABKA0SDwoHcmVwbGljYRgDIAEoBCLDAwoQQmlydGhDZXJ0aWZpY2F0ZRINCgVjaGlsZBgBIAEoCRIPCgdmb3VuZGVyGAIgASgJEhAKCHZlcmlmaWVkGAMgASgIEhIKCnBhcmVudF9rZXkYBCABKAwSEQoJcGFyZW50X2lkGAUgASgJEg0KBWVwb2NoGAYgASgDEhEKCXNpZ25hdHVyZRgHIAEoDBIZCgx2ZXJpZmllZF92aWEYCCABKAlIAIgBARIWCglpZHBfdG9rZW4YCSABKAlIAYgBARIbCg5jYXB0dXJlZF9jbG9jaxgKIAEoA0gCiAEBEiEKFGF1dGhfcHJvdmlkZXJfaXNzdWVyGAsgASgJSAOIAQESHwoSYXV0aF9wcm92aWRlcl9qd2tzGAwgASgJSASIAQESIwoWYXV0aF9wcm92aWRlcl9hdWRpZW5jZRgNIAEoCUgFiAEBQg8KDV92ZXJpZmllZF92aWFCDAoKX2lkcF90b2tlbkIRCg9fY2FwdHVyZWRfY2xvY2tCFwoVX2F1dGhfcHJvdmlkZXJfaXNzdWVyQhUKE19hdXRoX3Byb3ZpZGVyX2p3a3NCGQoXX2F1dGhfcHJvdmlkZXJfYXVkaWVuY2UinAQKDE9mZmVyUmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0Ei4KBGNhbGwYAiABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbEgAEhwKEnNlYWxlZF9jaGFuZ2VfdXNkYRgHIAEoDEgAEjQKCWF1dGhvcmluZxgDIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpbmdPcHRpb25zEhAKCGxhd191c2R6GAQgASgMEjMKDGF0dGVzdGF0aW9ucxgFIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5BdHRlc3RlZFJlYWQSPQoSY29uZmxpY3Rfc25hcHNob3RzGAYgAygLMiEubm9tb3Mua2VybmVsLnYxLkNvbmZsaWN0U25hcHNob3QSGgoSZXhlY3V0aW9uX2xhd191c2R6GAggASgMEiAKE2NvbnRyb2xsZXJfbGF3X2hhc2gYCSABKAlIAYgBARIdChBjYW5kaWRhdGVfY29tbWl0GAogASgJSAKIAQESPAoRYmlydGhfY2VydGlmaWNhdGUYCyABKAsyIS5ub21vcy5rZXJuZWwudjEuQmlydGhDZXJ0aWZpY2F0ZUIICgZpbnRlbnRCFgoUX2NvbnRyb2xsZXJfbGF3X2hhc2hCEwoRX2NhbmRpZGF0ZV9jb21taXQikwEKDEF0dGVzdGVkUmVhZBIQCghxdWVyeV9pZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSKwoGcmVzdWx0GAMgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWUSEwoLYXR0ZXN0YXRpb24YBCABKAwidQoQQ29uZmxpY3RTbmFwc2hvdBIWCg5hZ2dyZWdhdGVfdHlwZRgBIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAiABKAkSDQoFZmllbGQYAyABKAkSFQoNdGFyZ2V0X3NjaGVtYRgEIAEoCRINCgV0b2tlbhgFIAEoCSLbBQoMUXVlcnlSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSMgoJYXV0aG9yaXR5GAIgASgLMh8ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5QXV0aG9yaXR5Eg0KBXNwYW5zGAMgASgIEioKBHJvd3MYCiABKAsyGi5ub21vcy5rZXJuZWwudjEuUm93c1F1ZXJ5SAASKgoEcGFnZRgLIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5QYWdlUXVlcnlIABIrCgVieV9pZBgMIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5CeUlkUXVlcnlIABI5CgxyZXNvbHZlX3JlZnMYDSABKAsyIS5ub21vcy5rZXJuZWwudjEuUmVzb2x2ZVJlZnNRdWVyeUgAEjsKDXJlZl9mcmVzaG5lc3MYDiABKAsyIi5ub21vcy5rZXJuZWwudjEuUmVmRnJlc2huZXNzUXVlcnlIABIsCgVjb3VudBgPIAEoCzIbLm5vbW9zLmtlcm5lbC52MS5UYWxseVF1ZXJ5SAASKgoDc3VtGBAgASgLMhsubm9tb3Mua2VybmVsLnYxLlRhbGx5UXVlcnlIABIwCgdzcGF0aWFsGBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlNwYXRpYWxRdWVyeUgAEiwKBW5hbWVkGBIgASgLMhsubm9tb3Mua2VybmVsLnYxLk5hbWVkUXVlcnlIABJJChNhdXRob3JpemF0aW9uX2NoZWNrGBMgASgLMioubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25DaGVja1JlcXVlc3RIABJLChRhdXRob3JpemF0aW9uX2V4cGFuZBgUIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwYW5kUmVxdWVzdEgAQgcKBXF1ZXJ5IpIBCg5RdWVyeUF1dGhvcml0eRIXCg9wcmluY2lwYWxfY2xhaW0YASABKAkSEgoKYXV0aF90b2tlbhgCIAEoDBIQCghub3dfdW5peBgDIAEoBBIVCg1hdXRob3Jfc2VjcmV0GAQgASgMEioKBGtleXMYBSADKAsyHC5ub21vcy5rZXJuZWwudjEuSW5qZWN0ZWRLZXkiOAoLSW5qZWN0ZWRLZXkSDQoFc2NvcGUYASABKAkSDQoFZXBvY2gYAiABKAQSCwoDa2V5GAMgASgMIlsKCVJvd3NRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJcHJpbmNpcGFsGAMgASgJInkKCVBhZ2VRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSDQoFbGltaXQYAyABKA0SDQoFYWZ0ZXIYBCABKAkSEQoJcHJpbmNpcGFsGAUgASgJIkwKCUJ5SWRRdWVyeRIWCg5hZ2dyZWdhdGVfdHlwZRgBIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJIlwKCE5vbW9zUmVmEhEKCXdvcmtzcGFjZRgBIAEoCRIWCg5hZ2dyZWdhdGVfdHlwZRgCIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAyABKAkSDwoHdmVyc2lvbhgEIAEoCSJOChBSZXNvbHZlUmVmc1F1ZXJ5EicKBHJlZnMYASADKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSEQoJcHJpbmNpcGFsGAIgASgJIkUKEVJlZkZyZXNobmVzc1F1ZXJ5EjAKBHJlZnMYASADKAsyIi5ub21vcy5rZXJuZWwudjEuUmVmRnJlc2huZXNzQ2hlY2sigAEKEVJlZkZyZXNobmVzc0NoZWNrEikKBnBpbm5lZBgBIAEoCzIZLm5vbW9zLmtlcm5lbC52MS5Ob21vc1JlZhIpCgZzZXJpZXMYAiABKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSFQoNY3VycmVudF9maWVsZBgDIAEoCSJcCgpUYWxseVF1ZXJ5EgoKAmlkGAEgASgJEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIRCglwcmluY2lwYWwYAyABKAkiXgoMU3BhdGlhbFF1ZXJ5EgoKAmlkGAEgASgJEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIRCglwcmluY2lwYWwYAyABKAkicQoKTmFtZWRRdWVyeRIyCglvcGVyYXRpb24YASABKA4yHy5ub21vcy5rZXJuZWwudjEuUXVlcnlPcGVyYXRpb24SLwoJYXJndW1lbnRzGAIgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0Ii8KE0F1dGhvcml6YXRpb25PYmplY3QSDAoEdHlwZRgBIAEoCRIKCgJpZBgCIAEoCSJUChRBdXRob3JpemF0aW9uU3ViamVjdBIMCgR0eXBlGAEgASgJEgoKAmlkGAIgASgJEhUKCHJlbGF0aW9uGAMgASgJSACIAQFCCwoJX3JlbGF0aW9uIpwBChhSZWxhdGlvbnNoaXBUdXBsZUFkZHJlc3MSNgoIcmVzb3VyY2UYASABKAsyJC5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbk9iamVjdBIQCghyZWxhdGlvbhgCIAEoCRI2CgdzdWJqZWN0GAMgASgLMiUubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25TdWJqZWN0IoEBChhBdXRob3JpemF0aW9uQ29uc2lzdGVuY3kSIwoZY3VycmVudF92ZXJpZmllZF9mcm9udGllchgBIAEoCEgAEhkKD2F0X2xlYXN0X2NvbW1pdBgCIAEoCUgAEhYKDGV4YWN0X2NvbW1pdBgDIAEoCUgAQg0KC3JlcXVpcmVtZW50ImYKHUF1dGhvcml6YXRpb25Db25kaXRpb25Db250ZXh0EhQKDGNvbmRpdGlvbl9pZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3Qi9wIKGUF1dGhvcml6YXRpb25DaGVja1JlcXVlc3QSNgoIcmVzb3VyY2UYASABKAsyJC5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbk9iamVjdBISCgpwZXJtaXNzaW9uGAIgASgJEjYKB3N1YmplY3QYAyABKAsyJS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvblN1YmplY3QSPgoLY29uc2lzdGVuY3kYBCABKAsyKS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbnNpc3RlbmN5Ej8KB2NvbnRleHQYBSADKAsyLi5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbmRpdGlvbkNvbnRleHQSIAoTZXhwZWN0ZWRfbW9kZWxfaGFzaBgGIAEoCUgAiAEBEhsKE2luY2x1ZGVfZXhwbGFuYXRpb24YByABKAhCFgoUX2V4cGVjdGVkX21vZGVsX2hhc2gi7QIKGkF1dGhvcml6YXRpb25FeHBhbmRSZXF1ZXN0EjYKCHJlc291cmNlGAEgASgLMiQubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25PYmplY3QSEgoKcGVybWlzc2lvbhgCIAEoCRI+Cgtjb25zaXN0ZW5jeRgDIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ29uc2lzdGVuY3kSPwoHY29udGV4dBgEIAMoCzIuLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ29uZGl0aW9uQ29udGV4dBIgChNleHBlY3RlZF9tb2RlbF9oYXNoGAUgASgJSACIAQESDQoFbGltaXQYBiABKA0SEgoFYWZ0ZXIYByABKAlIAYgBARIbChNpbmNsdWRlX2V4cGxhbmF0aW9uGAggASgIQhYKFF9leHBlY3RlZF9tb2RlbF9oYXNoQggKBl9hZnRlciK9AQoZUmVsYXRpb25zaGlwVHVwbGVFdmlkZW5jZRI4CgV0dXBsZRgBIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5SZWxhdGlvbnNoaXBUdXBsZUFkZHJlc3MSEAoIdHVwbGVfaWQYAiABKAkSGgoSYXNzZXJ0aW9uX2V2ZW50X2lkGAMgASgJEiAKE3Jldm9jYXRpb25fZXZlbnRfaWQYBCABKAlIAIgBAUIWChRfcmV2b2NhdGlvbl9ldmVudF9pZCLhAwoYQXV0aG9yaXphdGlvbkV4cGxhbmF0aW9uEkYKCW9wZXJhdGlvbhgBIAEoDjIzLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb24uT3BlcmF0aW9uEhAKCHJlbGF0aW9uGAIgASgJEg4KBnJlc3VsdBgDIAEoCBI8CghldmlkZW5jZRgEIAMoCzIqLm5vbW9zLmtlcm5lbC52MS5SZWxhdGlvbnNoaXBUdXBsZUV2aWRlbmNlEjsKCGNoaWxkcmVuGAUgAygLMikubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBsYW5hdGlvbiLfAQoJT3BlcmF0aW9uEhkKFU9QRVJBVElPTl9VTlNQRUNJRklFRBAAEhQKEE9QRVJBVElPTl9ESVJFQ1QQARIeChpPUEVSQVRJT05fQ09NUFVURURfVVNFUlNFVBACEh4KGk9QRVJBVElPTl9UVVBMRV9UT19VU0VSU0VUEAMSEwoPT1BFUkFUSU9OX1VOSU9OEAQSGgoWT1BFUkFUSU9OX0lOVEVSU0VDVElPThAFEhcKE09QRVJBVElPTl9FWENMVVNJT04QBhIXChNPUEVSQVRJT05fQ09ORElUSU9OEAcidwoaQXV0aG9yaXphdGlvbkRlY2lzaW9uQmFzaXMSIAoYYXV0aG9yaXphdGlvbl9tb2RlbF9oYXNoGAEgASgJEiEKGXJlbGF0aW9uc2hpcF9zdGF0ZV9jb21taXQYAiABKAkSFAoMY29udGV4dF9oYXNoGAMgASgMIr4BChpBdXRob3JpemF0aW9uQ2hlY2tSZXNwb25zZRIPCgdhbGxvd2VkGAEgASgIEjoKBWJhc2lzGAIgASgLMisubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25EZWNpc2lvbkJhc2lzEkMKC2V4cGxhbmF0aW9uGAMgASgLMikubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBsYW5hdGlvbkgAiAEBQg4KDF9leHBsYW5hdGlvbiKDAgobQXV0aG9yaXphdGlvbkV4cGFuZFJlc3BvbnNlEjcKCHN1YmplY3RzGAEgAygLMiUubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25TdWJqZWN0EjoKBWJhc2lzGAIgASgLMisubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25EZWNpc2lvbkJhc2lzEhEKBG5leHQYAyABKAlIAIgBARJDCgtleHBsYW5hdGlvbhgEIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb25IAYgBAUIHCgVfbmV4dEIOCgxfZXhwbGFuYXRpb24iQQoNT3V0Ym94UmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0ImMKC1N5bmNSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSEQoJZnJvbV9iYXNlGAIgASgJEg8KB3RvX2hlYWQYAyABKAkiUwoLVGVzdFJlcXVlc3QSNwoIc2V0X3Jvb3QYASABKAsyIy5ub21vcy5rZXJuZWwudjEuU2V0VGVzdFJvb3RSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIigKElNldFRlc3RSb290UmVxdWVzdBISCgpwdWJsaWNfa2V5GAEgASgMIj0KDFRlc3RSZXNwb25zZRItCgZyZXN1bHQYASABKAsyHS5ub21vcy5rZXJuZWwudjEuQWNrbm93bGVkZ2VkIp0JCg5DdXN0b2R5UmVxdWVzdBI3CgpwYWNrX2RlbHRhGAogASgLMiEubm9tb3Mua2VybmVsLnYxLlBhY2tEZWx0YVJlcXVlc3RIABI3CgphcHBseV9wYWNrGAsgASgLMiEubm9tb3Mua2VybmVsLnYxLkFwcGx5UGFja1JlcXVlc3RIABI3CgpyZXBvX3N0YXRzGAwgASgLMiEubm9tb3Mua2VybmVsLnYxLlJlcG9TdGF0c1JlcXVlc3RIABI9Cg1pbnRlbnRzX2Fib3ZlGA0gASgLMiQubm9tb3Mua2VybmVsLnYxLkludGVudHNBYm92ZVJlcXVlc3RIABI/Cg5pbnNwZWN0X2NoYW5nZRgOIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5JbnNwZWN0Q2hhbmdlUmVxdWVzdEgAEk4KFmVuY29kZV9yZWZ1c2FsX3ZlcmRpY3QYDyABKAsyLC5ub21vcy5rZXJuZWwudjEuRW5jb2RlUmVmdXNhbFZlcmRpY3RSZXF1ZXN0SAASUAoXaW5zcGVjdF9yZWZ1c2FsX3ZlcmRpY3QYECABKAsyLS5ub21vcy5rZXJuZWwudjEuSW5zcGVjdFJlZnVzYWxWZXJkaWN0UmVxdWVzdEgAEjUKCXJlYWRfYmxvYhgRIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5SZWFkQmxvYlJlcXVlc3RIABI5CgtyZXNvbHZlX3JlZhgSIAEoCzIiLm5vbW9zLmtlcm5lbC52MS5SZXNvbHZlUmVmUmVxdWVzdEgAEjUKCWxpc3RfcmVmcxgTIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5MaXN0UmVmc1JlcXVlc3RIABI1Cgl3cml0ZV9yZWYYFCABKAsyIC5ub21vcy5rZXJuZWwudjEuV3JpdGVSZWZSZXF1ZXN0SAASNwoKZGVsZXRlX3JlZhgVIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5EZWxldGVSZWZSZXF1ZXN0SAASRAoRd3JpdGVfbWV0YV9jb21taXQYFiABKAsyJy5ub21vcy5rZXJuZWwudjEuV3JpdGVNZXRhQ29tbWl0UmVxdWVzdEgAEkIKEGxhd19jbG9zdXJlX2luZm8YFyABKAsyJi5ub21vcy5rZXJuZWwudjEuTGF3Q2xvc3VyZUluZm9SZXF1ZXN0SAASRQoRY2hlY2twb2ludF9leHBvcnQYGCABKAsyKC5ub21vcy5rZXJuZWwudjEuQ2hlY2twb2ludEV4cG9ydFJlcXVlc3RIABJFChFjaGVja3BvaW50X2ltcG9ydBgZIAEoCzIoLm5vbW9zLmtlcm5lbC52MS5DaGVja3BvaW50SW1wb3J0UmVxdWVzdEgAEkMKEGNhcGFjaXR5X3Jlc2VydmUYGiABKAsyJy5ub21vcy5rZXJuZWwudjEuQ2FwYWNpdHlSZXNlcnZlUmVxdWVzdEgAEjsKDHJlc3RvcmVfbWFpbhgbIAEoCzIjLm5vbW9zLmtlcm5lbC52MS5SZXN0b3JlTWFpblJlcXVlc3RIAEILCglvcGVyYXRpb24inAEKEFBhY2tEZWx0YVJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCgRoZWFkGAIgASgJSACIAQESEQoEYmFzZRgDIAEoCUgBiAEBEg4KBmJyYW5jaBgEIAEoCRIdChBzdGFnZWRfcGFja19maWxlGAUgASgJSAKIAQFCBwoFX2hlYWRCBwoFX2Jhc2VCEwoRX3N0YWdlZF9wYWNrX2ZpbGUicgoQQXBwbHlQYWNrUmVxdWVzdBIMCgRyZXBvGAEgASgJEg4KBHBhY2sYAiABKAxIABIaChBzdGFnZWRfcGFja19maWxlGAQgASgJSAASEQoEaGVhZBgDIAEoCUgBiAEBQggKBnNvdXJjZUIHCgVfaGVhZCIgChBSZXBvU3RhdHNSZXF1ZXN0EgwKBHJlcG8YASABKAkirAEKE0ludGVudHNBYm92ZVJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCgRoZWFkGAIgASgJSACIAQESEQoEYmFzZRgDIAEoCUgBiAEBEg4KBmJyYW5jaBgEIAEoCRINCgVsaW1pdBgFIAEoBBIYChBjb21wbGV0ZV9sb2dpY2FsGAYgASgIEhYKDmNvbXBhY3Rfc3RvcmVkGAcgASgIQgcKBV9oZWFkQgcKBV9iYXNlIisKFEluc3BlY3RDaGFuZ2VSZXF1ZXN0EhMKC2NoYW5nZV91c2RhGAEgASgMIt8BCg5SZWZ1c2FsVmVyZGljdBIVCghvZmZlcl9pZBgBIAEoCUgAiAEBEhAKA29pZBgCIAEoCUgBiAEBEhMKBmRvbWFpbhgDIAEoCUgCiAEBEhkKDGRpcmVjdGl2ZV9pZBgEIAEoCUgDiAEBEhQKB3Nlc3Npb24YBSABKAlIBIgBARIRCglwYXJrZWRfYXQYBiABKAkSDgoGcmVhc29uGAcgASgJQgsKCV9vZmZlcl9pZEIGCgRfb2lkQgkKB19kb21haW5CDwoNX2RpcmVjdGl2ZV9pZEIKCghfc2Vzc2lvbiJPChtFbmNvZGVSZWZ1c2FsVmVyZGljdFJlcXVlc3QSMAoHdmVyZGljdBgBIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5SZWZ1c2FsVmVyZGljdCI0ChxJbnNwZWN0UmVmdXNhbFZlcmRpY3RSZXF1ZXN0EhQKDHZlcmRpY3RfdXNkYRgBIAEoDCI6Cg9SZWFkQmxvYlJlcXVlc3QSDAoEcmVwbxgBIAEoCRILCgNvaWQYAiABKAkSDAoEcGF0aBgDIAEoCSI0ChFSZXNvbHZlUmVmUmVxdWVzdBIMCgRyZXBvGAEgASgJEhEKCXJlZmVyZW5jZRgCIAEoCSIvCg9MaXN0UmVmc1JlcXVlc3QSDAoEcmVwbxgBIAEoCRIOCgZwcmVmaXgYAiABKAkiQgoPV3JpdGVSZWZSZXF1ZXN0EgwKBHJlcG8YASABKAkSEQoJcmVmZXJlbmNlGAIgASgJEg4KBnRhcmdldBgDIAEoCSIzChBEZWxldGVSZWZSZXF1ZXN0EgwKBHJlcG8YASABKAkSEQoJcmVmZXJlbmNlGAIgASgJIikKCE1ldGFGaWxlEgwKBHBhdGgYASABKAkSDwoHY29udGVudBgCIAEoDCKuAQoWV3JpdGVNZXRhQ29tbWl0UmVxdWVzdBIMCgRyZXBvGAEgASgJEg8KB3BhcmVudHMYAiADKAkSKAoFZmlsZXMYAyADKAsyGS5ub21vcy5rZXJuZWwudjEuTWV0YUZpbGUSDwoHbWVzc2FnZRgEIAEoCRIUCgx0aW1lX3NlY29uZHMYBSABKBISFgoJcmVmZXJlbmNlGAYgASgJSACIAQFCDAoKX3JlZmVyZW5jZSJnChVMYXdDbG9zdXJlSW5mb1JlcXVlc3QSFAoMY2xvc3VyZV9maWxlGAEgASgJEjgKCmNhcGFiaWxpdHkYAiABKA4yJC5ub21vcy5rZXJuZWwudjEuS2VybmVsTGF3Q2FwYWJpbGl0eSKHAQoXQ2hlY2twb2ludEV4cG9ydFJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBIhChRzdGFnZWRfZnJvbnRpZXJfZmlsZRgCIAEoCUgAiAEBQhcKFV9zdGFnZWRfZnJvbnRpZXJfZmlsZSLpAQoXQ2hlY2twb2ludEltcG9ydFJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBISCghmcm9udGllchgCIAEoDEgAEh4KFHN0YWdlZF9mcm9udGllcl9maWxlGAYgASgJSAASEwoGY3Vyc29yGAMgASgJSAGIAQESFwoKc3RhdGVfcm9vdBgEIAEoCUgCiAEBEg0KBXNwYW5zGAUgASgIQhEKD2Zyb250aWVyX3NvdXJjZUIJCgdfY3Vyc29yQg0KC19zdGF0ZV9yb290IjEKFkNhcGFjaXR5UmVzZXJ2ZVJlcXVlc3QSFwoPYWdncmVnYXRlX2NvdW50GAEgASgEIlQKElJlc3RvcmVNYWluUmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0EgwKBGhlYWQYAiABKAkipwkKD0N1c3RvZHlSZXNwb25zZRI4CgpwYWNrX2RlbHRhGAogASgLMiIubm9tb3Mua2VybmVsLnYxLlBhY2tEZWx0YVJlc3BvbnNlSAASOAoKYXBwbHlfcGFjaxgLIAEoCzIiLm5vbW9zLmtlcm5lbC52MS5BcHBseVBhY2tSZXNwb25zZUgAEjgKCnJlcG9fc3RhdHMYDCABKAsyIi5ub21vcy5rZXJuZWwudjEuUmVwb1N0YXRzUmVzcG9uc2VIABI+Cg1pbnRlbnRzX2Fib3ZlGA0gASgLMiUubm9tb3Mua2VybmVsLnYxLkludGVudHNBYm92ZVJlc3BvbnNlSAASQAoOaW5zcGVjdF9jaGFuZ2UYDiABKAsyJi5ub21vcy5rZXJuZWwudjEuSW5zcGVjdENoYW5nZVJlc3BvbnNlSAASTwoWZW5jb2RlX3JlZnVzYWxfdmVyZGljdBgPIAEoCzItLm5vbW9zLmtlcm5lbC52MS5FbmNvZGVSZWZ1c2FsVmVyZGljdFJlc3BvbnNlSAASUQoXaW5zcGVjdF9yZWZ1c2FsX3ZlcmRpY3QYECABKAsyLi5ub21vcy5rZXJuZWwudjEuSW5zcGVjdFJlZnVzYWxWZXJkaWN0UmVzcG9uc2VIABI2CglyZWFkX2Jsb2IYESABKAsyIS5ub21vcy5rZXJuZWwudjEuUmVhZEJsb2JSZXNwb25zZUgAEjoKC3Jlc29sdmVfcmVmGBIgASgLMiMubm9tb3Mua2VybmVsLnYxLlJlc29sdmVSZWZSZXNwb25zZUgAEjYKCWxpc3RfcmVmcxgTIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5MaXN0UmVmc1Jlc3BvbnNlSAASMgoJd3JpdGVfcmVmGBQgASgLMh0ubm9tb3Mua2VybmVsLnYxLkFja25vd2xlZGdlZEgAEjMKCmRlbGV0ZV9yZWYYFSABKAsyHS5ub21vcy5rZXJuZWwudjEuQWNrbm93bGVkZ2VkSAASRQoRd3JpdGVfbWV0YV9jb21taXQYFiABKAsyKC5ub21vcy5rZXJuZWwudjEuV3JpdGVNZXRhQ29tbWl0UmVzcG9uc2VIABJDChBsYXdfY2xvc3VyZV9pbmZvGBcgASgLMicubm9tb3Mua2VybmVsLnYxLkxhd0Nsb3N1cmVJbmZvUmVzcG9uc2VIABJGChFjaGVja3BvaW50X2V4cG9ydBgYIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5DaGVja3BvaW50RXhwb3J0UmVzcG9uc2VIABJGChFjaGVja3BvaW50X2ltcG9ydBgZIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5DaGVja3BvaW50SW1wb3J0UmVzcG9uc2VIABJEChBjYXBhY2l0eV9yZXNlcnZlGBogASgLMigubm9tb3Mua2VybmVsLnYxLkNhcGFjaXR5UmVzZXJ2ZVJlc3BvbnNlSAASPAoMcmVzdG9yZV9tYWluGBsgASgLMiQubm9tb3Mua2VybmVsLnYxLlJlc3RvcmVNYWluUmVzcG9uc2VIAEILCglvcGVyYXRpb24iMAoRUGFja0RlbHRhUmVzcG9uc2USDAoEcGFjaxgBIAEoDBINCgVieXRlcxgCIAEoBCI8ChFBcHBseVBhY2tSZXNwb25zZRIUCgxvYmplY3RfY291bnQYASABKAQSEQoJcGFja19oYXNoGAIgASgJIqcBChFSZXBvU3RhdHNSZXNwb25zZRITCgt0b3RhbF9ieXRlcxgBIAEoBBIUCgxvYmplY3RfYnl0ZXMYAiABKAQSFQoNbG9vc2Vfb2JqZWN0cxgDIAEoBBITCgtsb29zZV9ieXRlcxgEIAEoBBISCgpwYWNrX2ZpbGVzGAUgASgEEhIKCnBhY2tfYnl0ZXMYBiABKAQSEwoLaW5kZXhfYnl0ZXMYByABKAQi4gEKDEludGVudFJlY29yZBILCgNvaWQYASABKAkSEQoJaW50ZW50X2lkGAIgASgJEg4KBmRvbWFpbhgDIAEoCRIRCglkaXJlY3RpdmUYBCABKAkSEwoLY2hhbmdlX3VzZGEYBSABKAwSLgoIc2VtYW50aWMYBiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSSgoVdHJhbnNwb3J0X3JlcXVpcmVtZW50GAcgASgOMisubm9tb3Mua2VybmVsLnYxLkludGVudFRyYW5zcG9ydFJlcXVpcmVtZW50IkYKFEludGVudHNBYm92ZVJlc3BvbnNlEi4KB2ludGVudHMYASADKAsyHS5ub21vcy5rZXJuZWwudjEuSW50ZW50UmVjb3JkIkIKE05vbWluYWxDYWxsSWRlbnRpdHkSEwoLZG9tYWluX3BhdGgYASABKAkSFgoOZGlyZWN0aXZlX3BhdGgYAiABKAkiiAEKGExpZmVjeWNsZUluc3RhbGxJZGVudGl0eRIfChd0YXJnZXRfY2xvc3VyZV9pZGVudGl0eRgBIAEoCRIUCgxpbnN0YWxsZWRfYnkYAiABKAkSNQoFcGhhc2UYAyABKA4yJi5ub21vcy5rZXJuZWwudjEuTGlmZWN5Y2xlSW5zdGFsbFBoYXNlIuYBChVJbnNwZWN0Q2hhbmdlUmVzcG9uc2USLgoIc2VtYW50aWMYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJaW50ZW50X2lkGAIgASgJEjIKBGNhbGwYAyABKAsyJC5ub21vcy5rZXJuZWwudjEuTm9taW5hbENhbGxJZGVudGl0eRIQCghhdXRob3JlZBgEIAEoCBJEChFsaWZlY3ljbGVfaW5zdGFsbBgFIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5MaWZlY3ljbGVJbnN0YWxsSWRlbnRpdHkiNAocRW5jb2RlUmVmdXNhbFZlcmRpY3RSZXNwb25zZRIUCgx2ZXJkaWN0X3VzZGEYASABKAwiUQodSW5zcGVjdFJlZnVzYWxWZXJkaWN0UmVzcG9uc2USMAoHdmVyZGljdBgBIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5SZWZ1c2FsVmVyZGljdCIvChBSZWFkQmxvYlJlc3BvbnNlEg0KBWZvdW5kGAEgASgIEgwKBGJsb2IYAiABKAwiLgoSUmVzb2x2ZVJlZlJlc3BvbnNlEhAKA29pZBgBIAEoCUgAiAEBQgYKBF9vaWQiKwoJUmVmUmVjb3JkEhEKCXJlZmVyZW5jZRgBIAEoCRILCgNvaWQYAiABKAkiPAoQTGlzdFJlZnNSZXNwb25zZRIoCgRyZWZzGAEgAygLMhoubm9tb3Mua2VybmVsLnYxLlJlZlJlY29yZCIOCgxBY2tub3dsZWRnZWQiJgoXV3JpdGVNZXRhQ29tbWl0UmVzcG9uc2USCwoDb2lkGAEgASgJIoMBChZMYXdDbG9zdXJlSW5mb1Jlc3BvbnNlEhAKCGlkZW50aXR5GAEgASgJEhkKEXJvb3RfbG9naWNhbF9wYXRoGAIgASgJEhMKC2Fzc2V0X2NvdW50GAMgASgEEhIKCnByaW1fY291bnQYBCABKAQSEwoLZG9tYWluX2tleXMYBSADKAki7wIKGENoZWNrcG9pbnRFeHBvcnRSZXNwb25zZRINCgVlbXB0eRgBIAEoCBITCgZjdXJzb3IYAiABKAlIAIgBARIQCghmcm9udGllchgDIAEoDBIXCgpzdGF0ZV9yb290GAQgASgJSAGIAQESEgoKc3RhdGVfdHJlZRgFIAEoCBIOCgZwaW5uZWQYBiABKAgSGwoTcmVhZF9pbmRleF9zbmFwc2hvdBgHIAEoCBIjChtyZWFkX2luZGV4X3NuYXBzaG90X3BlbmRpbmcYCCABKAgSJAoXcmVhZF9pbmRleF9zcWxpdGVfYnl0ZXMYCSABKARIAogBARIlChhyZWFkX2luZGV4X2N1c3RvZHlfYnl0ZXMYCiABKARIA4gBAUIJCgdfY3Vyc29yQg0KC19zdGF0ZV9yb290QhoKGF9yZWFkX2luZGV4X3NxbGl0ZV9ieXRlc0IbChlfcmVhZF9pbmRleF9jdXN0b2R5X2J5dGVzIp4CChhDaGVja3BvaW50SW1wb3J0UmVzcG9uc2USEAoIcmVzdG9yZWQYASABKAgSEwoGcmVhc29uGAIgASgJSACIAQESFwoPZnJvbnRpZXJfc2VlZGVkGAMgASgIEiUKHWZyb250aWVyX3ZlcmlmaWNhdGlvbl9wZW5kaW5nGAQgASgIEhcKD2FnZ3JlZ2F0ZV9jb3VudBgFIAEoBBIrCgVzcGFucxgGIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBITCgZjdXJzb3IYByABKAlIAYgBARIRCglyZWFkX29ubHkYCCABKAgSFwoPbGF6eV9yZWFkX2luZGV4GAkgASgIQgkKB19yZWFzb25CCQoHX2N1cnNvciJKChdDYXBhY2l0eVJlc2VydmVSZXNwb25zZRIXCg9hZ2dyZWdhdGVfY291bnQYASABKAQSFgoOcmVzZXJ2ZWRfYnl0ZXMYAiABKAQiQwoTUmVzdG9yZU1haW5SZXNwb25zZRIMCgRoZWFkGAEgASgJEhAKCHZlcmlmaWVkGAIgASgIEgwKBHdhbGsYAyABKAkimwIKCk5vbW9zVmFsdWUSJQoEbnVsbBgBIAEoCzIVLm5vbW9zLmtlcm5lbC52MS5OdWxsSAASEQoHYm9vbGVhbhgCIAEoCEgAEhgKDnNpZ25lZF9pbnRlZ2VyGAMgASgSSAASGgoQdW5zaWduZWRfaW50ZWdlchgEIAEoBEgAEhgKDmZsb2F0aW5nX3BvaW50GAUgASgBSAASDgoEdGV4dBgGIAEoCUgAEg8KBWJ5dGVzGAcgASgMSAASKgoEbGlzdBgIIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5Ob21vc0xpc3RIABIuCgZvYmplY3QYCSABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RIAEIGCgRraW5kIgYKBE51bGwiOAoJTm9tb3NMaXN0EisKBnZhbHVlcxgBIAMoCzIbLm5vbW9zLmtlcm5lbC52MS5Ob21vc1ZhbHVlIpMBCgtOb21vc1N0cnVjdBI4CgZmaWVsZHMYASADKAsyKC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QuRmllbGRzRW50cnkaSgoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEioKBXZhbHVlGAIgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWU6AjgBKukSChFLZXJuZWxSZWZ1c2FsQ29kZRIjCh9LRVJORUxfUkVGVVNBTF9DT0RFX1VOU1BFQ0lGSUVEEAASJQohS0VSTkVMX1JFRlVTQUxfQ09ERV9CQURfU0lHTkFUVVJFEAESJAogS0VSTkVMX1JFRlVTQUxfQ09ERV9VTkFVVEhPUklaRUQQAhInCiNLRVJORUxfUkVGVVNBTF9DT0RFX1BPTElDWV9ESVNBQkxFRBADEioKJktFUk5FTF9SRUZVU0FMX0NPREVfVU5DRVJUSUZJRURfUE9MSUNZEAQSIwofS0VSTkVMX1JFRlVTQUxfQ09ERV9SRUZFUkVOVElBTBAFEi8KK0tFUk5FTF9SRUZVU0FMX0NPREVfUE9JTlRfU1RBVEVfVU5BVkFJTEFCTEUQBhIkCiBLRVJORUxfUkVGVVNBTF9DT0RFX0NBUF9FWENFRURFRBAHEi0KKUtFUk5FTF9SRUZVU0FMX0NPREVfQ0FQX0NPVU5UX1VOQVZBSUxBQkxFEAgSKQolS0VSTkVMX1JFRlVTQUxfQ09ERV9FVklERU5DRV9VTkJBQ0tFRBAJEiYKIktFUk5FTF9SRUZVU0FMX0NPREVfT1JQSEFOX1JFQ0VJUFQQChI2CjJLRVJORUxfUkVGVVNBTF9DT0RFX1JFQ0VJUFRfT05fVEVSTUlOQUxfT0JMSUdBVElPThALEiIKHktFUk5FTF9SRUZVU0FMX0NPREVfTk9UX01JTlRFRBAMEigKJEtFUk5FTF9SRUZVU0FMX0NPREVfRE9NQUlOX0xJRkVDWUNMRRANEikKJUtFUk5FTF9SRUZVU0FMX0NPREVfVFlQRV9UQUdfTUlTTUFUQ0gQDhIsCihLRVJORUxfUkVGVVNBTF9DT0RFX1JFVElSRURfUkVBRF9TVVJGQUNFEA8SMAosS0VSTkVMX1JFRlVTQUxfQ09ERV9DUk9TU19XT1JLU1BBQ0VfREVDTElORUQQEBIrCidLRVJORUxfUkVGVVNBTF9DT0RFX0FHR1JFR0FURV9JTlZBUklBTlQQERIrCidLRVJORUxfUkVGVVNBTF9DT0RFX1dPUktTUEFDRV9JTlZBUklBTlQQEhIuCipLRVJORUxfUkVGVVNBTF9DT0RFX0NBUFRVUkVEX1JFQURfQ09ORkxJQ1QQExIyCi5LRVJORUxfUkVGVVNBTF9DT0RFX0NPTkZMSUNUX1NOQVBTSE9UX1JFUVVJUkVEEBQSNAowS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9VTkRFQ0xBUkVEEBUSMQotS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9JTlZBTElEEBYSLworS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9TVEFMRRAXEjAKLEtFUk5FTF9SRUZVU0FMX0NPREVfQ0FQVFVSRURfUkVBRF9VTkRFQ0xBUkVEEBgSLQopS0VSTkVMX1JFRlVTQUxfQ09ERV9DQVBUVVJFRF9SRUFEX1BSSVZBVEUQGRIwCixLRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEVEX1JFQURfVU5ERUNMQVJFRBAaEjMKL0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9VTlRSVVNURURfS0VZEBsSNgoyS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX1VOVFJVU1RFRF9TT1VSQ0UQHBIsCihLRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEVEX1JFQURfRk9SR0VEEB0SKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX1NUQUxFEB4SLgoqS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX09WRVJTSVpFEB8SNwozS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX0RJU0hPTk9SRURfU09VUkNFECASNQoxS0VSTkVMX1JFRlVTQUxfQ09ERV9FUVVJVk9DQVRJT05fRVZJREVOQ0VfSU5WQUxJRBAhEjMKL0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNUQVRJT05fUkVDRUlQVF9JTlZBTElEECISKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9LRVlfUk9TVEVSX01JU01BVENIECMSLworS0VSTkVMX1JFRlVTQUxfQ09ERV9LRVlfRVBPQ0hfTk9UX01PTk9UT05JQxAkEikKJUtFUk5FTF9SRUZVU0FMX0NPREVfV1JJVEVfRVBPQ0hfU1RBTEUQJRItCilLRVJORUxfUkVGVVNBTF9DT0RFX0VOVkVMT1BFX1NJRF9NSVNNQVRDSBAmEjIKLktFUk5FTF9SRUZVU0FMX0NPREVfUkVWT0tFRF9NRU1CRVJfUkVTVVJSRUNURUQQJxIoCiRLRVJORUxfUkVGVVNBTF9DT0RFX0ZPUkdFRF9QUklOQ0lQQUwQKBIoCiRLRVJORUxfUkVGVVNBTF9DT0RFX09XTkVEX0tFWV9BTkNIT1IQKRImCiJLRVJORUxfUkVGVVNBTF9DT0RFX09XTkVEX1JFQ09WRVJZECoSLAooS0VSTkVMX1JFRlVTQUxfQ09ERV9TVVJGQUNFRF9CQVNJU19BSEVBRBArEjIKLktFUk5FTF9SRUZVU0FMX0NPREVfU0lHTkVSX0VQT0NIX09VVF9PRl9XSU5ET1cQLBImCiJLRVJORUxfUkVGVVNBTF9DT0RFX0VWT0xWRV9SRUZVU0VEEC0SKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RBVElPTl9JTlZBTElEEC4SLQopS0VSTkVMX1JFRlVTQUxfQ09ERV9QQVJFTlRfRElEX05PVF9BVFRFU1QQLxIpCiVLRVJORUxfUkVGVVNBTF9DT0RFX0NFUlRfQ0hBSU5fQlJPS0VOEDASKgomS0VSTkVMX1JFRlVTQUxfQ09ERV9OT1RfUk9PVEVEX0FUX1JPT1QQMRIqCiZLRVJORUxfUkVGVVNBTF9DT0RFX0RFTEVHQVRJT05fSU5WQUxJRBAyEiUKIUtFUk5FTF9SRUZVU0FMX0NPREVfUExBTl9SRUpFQ1RFRBAzKoUMCg5RdWVyeU9wZXJhdGlvbhIfChtRVUVSWV9PUEVSQVRJT05fVU5TUEVDSUZJRUQQABIcChhRVUVSWV9PUEVSQVRJT05fRVhUUkVNVU0QARIlCiFRVUVSWV9PUEVSQVRJT05fUEVORElOR19DT05GTElDVFMQAhIsCihRVUVSWV9PUEVSQVRJT05fUEVORElOR19DT05GTElDVF9TVU1NQVJZEAMSIAocUVVFUllfT1BFUkFUSU9OX1JFQURfUE9TVFVSRRAEEh8KG1FVRVJZX09QRVJBVElPTl9DVVJSRU5UX0xBVxAFEiMKH1FVRVJZX09QRVJBVElPTl9JTlRFUkZBQ0VfT0ZGRVIQBhInCiNRVUVSWV9PUEVSQVRJT05fUkVMQVRJT05fR0FURV9PRkZFUhAHEh0KGVFVRVJZX09QRVJBVElPTl9TQ0VORV9MQVcQCBIhCh1RVUVSWV9PUEVSQVRJT05fSU5TVEFMTEVEX0xBVxAJEhwKGFFVRVJZX09QRVJBVElPTl9ERVNDUklCRRAKEiAKHFFVRVJZX09QRVJBVElPTl9LRVJORUxfU1RBTVAQCxIjCh9RVUVSWV9PUEVSQVRJT05fREVWRUxPUEVSX1NQQU5TEAwSKQolUVVFUllfT1BFUkFUSU9OX0RFQ0xBUkVEX0NBUEFCSUxJVElFUxANEh0KGVFVRVJZX09QRVJBVElPTl9SRUFESU5FU1MQDhIkCiBRVUVSWV9PUEVSQVRJT05fUFJPSkVDVElPTl9TVEFUUxAPEiUKIVFVRVJZX09QRVJBVElPTl9NRU1PUllfRFJPUF9QUk9CRRAQEhgKFFFVRVJZX09QRVJBVElPTl9XQVJNEBESGwoXUVVFUllfT1BFUkFUSU9OX1JFRlJFU0gQEhIgChxRVUVSWV9PUEVSQVRJT05fVkVSSUZZX0NIQUlOEBMSJQohUVVFUllfT1BFUkFUSU9OX0hJU1RPUllfUFJFRkxJR0hUEBQSGQoVUVVFUllfT1BFUkFUSU9OX1JPVVRFEBUSGAoUUVVFUllfT1BFUkFUSU9OX01JTlQQFhIhCh1RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX0tFWUdFThAXEiUKIVFVRVJZX09QRVJBVElPTl9DUllQVE9fU0VBTF9GSUVMRBAYEiwKKFFVRVJZX09QRVJBVElPTl9DUllQVE9fQkxJTkRfSU5ERVhfVE9LRU4QGRIqCiZRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX1NDT1BFX0tFWRAaEi8KK1FVRVJZX09QRVJBVElPTl9DUllQVE9fT1dORURfREVWSUNFX1JFUVVFU1QQGxIxCi1RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX1BSRVBBUkVfQVBQUk9WQUwQHBIxCi1RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX1BSRVBBUkVfUkVDT1ZFUlkQHRIjCh9RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX1dSQVBfS0VZEB4SJQohUVVFUllfT1BFUkFUSU9OX0NSWVBUT19VTldSQVBfS0VZEB8SIQodUVVFUllfT1BFUkFUSU9OX0FVVEhPUl9LRVlHRU4QIBIkCiBRVUVSWV9PUEVSQVRJT05fQVRURVNUQVRJT05fU0lHThAhEiAKHFFVRVJZX09QRVJBVElPTl9SRUNFSVBUX1BBVEgQIhIdChlRVUVSWV9PUEVSQVRJT05fQ0VSVF9TSUdOECMSJQohUVVFUllfT1BFUkFUSU9OX0JJUlRIX1RSVVNUX1NUQVRFECQSIQodUVVFUllfT1BFUkFUSU9OX0VSQV9DRVJUX1NJR04QJRIoCiRRVUVSWV9PUEVSQVRJT05fREVMRUdBVElPTl9DRVJUX1NJR04QJhIpCiVRVUVSWV9PUEVSQVRJT05fQ0FOT05JQ0FMSVpFX0ZST05USUVSECcSKwonUVVFUllfT1BFUkFUSU9OX0NBTk9OSUNBTElaRV9QUk9KRUNUSU9OECgqbAoTS2VybmVsTGF3Q2FwYWJpbGl0eRIlCiFLRVJORUxfTEFXX0NBUEFCSUxJVFlfVU5TUEVDSUZJRUQQABIuCipLRVJORUxfTEFXX0NBUEFCSUxJVFlfU1RBR0VfWkVST19CT09UU1RSQVAQASqoAQoaSW50ZW50VHJhbnNwb3J0UmVxdWlyZW1lbnQSLAooSU5URU5UX1RSQU5TUE9SVF9SRVFVSVJFTUVOVF9VTlNQRUNJRklFRBAAEi4KKklOVEVOVF9UUkFOU1BPUlRfUkVRVUlSRU1FTlRfU0VBTEVEX0NIQU5HRRABEiwKKElOVEVOVF9UUkFOU1BPUlRfUkVRVUlSRU1FTlRfQ09NTUlUX1RSRUUQAiqJAQoVTGlmZWN5Y2xlSW5zdGFsbFBoYXNlEicKI0xJRkVDWUNMRV9JTlNUQUxMX1BIQVNFX1VOU1BFQ0lGSUVEEAASIgoeTElGRUNZQ0xFX0lOU1RBTExfUEhBU0VfQUNUSVZFEAESIwofTElGRUNZQ0xFX0lOU1RBTExfUEhBU0VfUEVORElORxACMlkKEk5vbW9zS2VybmVsU2VydmljZRJDCgRDYWxsEhwubm9tb3Mua2VybmVsLnYxLkNhbGxSZXF1ZXN0Gh0ubm9tb3Mua2VybmVsLnYxLkNhbGxSZXNwb25zZWIGcHJvdG8z");
|
|
5345
5345
|
var CallRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 0);
|
|
5346
5346
|
var CallResponseSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 1);
|
|
5347
5347
|
var WorkspaceTargetSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 15);
|
|
5348
5348
|
var DirectiveCallSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 17);
|
|
5349
5349
|
var AuthoringOptionsSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 18);
|
|
5350
5350
|
var CapturedClockSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 19);
|
|
5351
|
-
var
|
|
5352
|
-
var
|
|
5353
|
-
var
|
|
5354
|
-
var
|
|
5355
|
-
var
|
|
5356
|
-
var
|
|
5357
|
-
var
|
|
5358
|
-
var
|
|
5359
|
-
var
|
|
5360
|
-
var
|
|
5361
|
-
var
|
|
5362
|
-
var
|
|
5363
|
-
var
|
|
5364
|
-
var
|
|
5365
|
-
var
|
|
5366
|
-
var
|
|
5367
|
-
var
|
|
5368
|
-
var
|
|
5369
|
-
var
|
|
5370
|
-
var
|
|
5371
|
-
var
|
|
5372
|
-
var
|
|
5373
|
-
var
|
|
5374
|
-
var
|
|
5375
|
-
var
|
|
5376
|
-
var
|
|
5377
|
-
var
|
|
5378
|
-
var
|
|
5379
|
-
var
|
|
5380
|
-
var
|
|
5381
|
-
var
|
|
5382
|
-
var
|
|
5383
|
-
var
|
|
5351
|
+
var BirthCertificateSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 20);
|
|
5352
|
+
var OfferRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 21);
|
|
5353
|
+
var QueryRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 24);
|
|
5354
|
+
var QueryAuthoritySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 25);
|
|
5355
|
+
var RowsQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 27);
|
|
5356
|
+
var PageQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 28);
|
|
5357
|
+
var ByIdQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 29);
|
|
5358
|
+
var NomosRefSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 30);
|
|
5359
|
+
var ResolveRefsQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 31);
|
|
5360
|
+
var RefFreshnessQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 32);
|
|
5361
|
+
var RefFreshnessCheckSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 33);
|
|
5362
|
+
var TallyQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 34);
|
|
5363
|
+
var SpatialQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 35);
|
|
5364
|
+
var NamedQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 36);
|
|
5365
|
+
var AuthorizationObjectSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 37);
|
|
5366
|
+
var AuthorizationSubjectSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 38);
|
|
5367
|
+
var AuthorizationConsistencySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 40);
|
|
5368
|
+
var AuthorizationCheckRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 42);
|
|
5369
|
+
var OutboxRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 49);
|
|
5370
|
+
var SyncRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 50);
|
|
5371
|
+
var TestRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 51);
|
|
5372
|
+
var SetTestRootRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 52);
|
|
5373
|
+
var CustodyRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 54);
|
|
5374
|
+
var PackDeltaRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 55);
|
|
5375
|
+
var ApplyPackRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 56);
|
|
5376
|
+
var RepoStatsRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 57);
|
|
5377
|
+
var IntentsAboveRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 58);
|
|
5378
|
+
var WriteRefRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 66);
|
|
5379
|
+
var DeleteRefRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 67);
|
|
5380
|
+
var LawClosureInfoRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 70);
|
|
5381
|
+
var CheckpointExportRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 71);
|
|
5382
|
+
var CheckpointImportRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 72);
|
|
5383
|
+
var RestoreMainRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 74);
|
|
5384
|
+
var NomosValueSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 97);
|
|
5385
|
+
var NomosStructSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 100);
|
|
5384
5386
|
var QueryOperationSchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 1);
|
|
5385
5387
|
var QueryOperation = /* @__PURE__ */ tsEnum(QueryOperationSchema);
|
|
5388
|
+
var KernelLawCapabilitySchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 2);
|
|
5389
|
+
var KernelLawCapability = /* @__PURE__ */ tsEnum(KernelLawCapabilitySchema);
|
|
5390
|
+
var IntentTransportRequirementSchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 3);
|
|
5391
|
+
var IntentTransportRequirement = /* @__PURE__ */ tsEnum(IntentTransportRequirementSchema);
|
|
5386
5392
|
|
|
5387
5393
|
// ../cloud/web-client/src/kernel_provider_wasm.ts
|
|
5388
5394
|
var enc2 = new TextEncoder();
|
|
5389
5395
|
var dec2 = new TextDecoder();
|
|
5396
|
+
var certificateBytes = (value) => value instanceof Uint8Array ? value : Uint8Array.from(Array.isArray(value) ? value.map(Number) : []);
|
|
5397
|
+
var protoBirthCertificate = (raw) => create(BirthCertificateSchema, {
|
|
5398
|
+
child: String(raw.child ?? ""),
|
|
5399
|
+
founder: String(raw.founder ?? ""),
|
|
5400
|
+
verified: raw.verified === true,
|
|
5401
|
+
parentKey: certificateBytes(raw.parentKey ?? raw.parent_key),
|
|
5402
|
+
parentId: String(raw.parentId ?? raw.parent_id ?? ""),
|
|
5403
|
+
epoch: BigInt(Number(raw.epoch ?? 0)),
|
|
5404
|
+
signature: certificateBytes(raw.signature),
|
|
5405
|
+
verifiedVia: raw.verifiedVia ?? raw.verified_via,
|
|
5406
|
+
idpToken: raw.idpToken ?? raw.idp_token,
|
|
5407
|
+
capturedClock: raw.capturedClock === void 0 && raw.captured_clock === void 0 ? void 0 : BigInt(Number(raw.capturedClock ?? raw.captured_clock)),
|
|
5408
|
+
authProviderIssuer: raw.authProviderIssuer ?? raw.auth_provider_issuer,
|
|
5409
|
+
authProviderJwks: raw.authProviderJwks ?? raw.auth_provider_jwks,
|
|
5410
|
+
authProviderAudience: raw.authProviderAudience ?? raw.auth_provider_audience
|
|
5411
|
+
});
|
|
5390
5412
|
var nmsInternalSnapshotToBase64 = (bytes) => {
|
|
5391
5413
|
if (typeof Buffer !== "undefined") {
|
|
5392
5414
|
return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString("base64");
|
|
@@ -5450,6 +5472,26 @@ var unsignedWasiPointers = (imports) => {
|
|
|
5450
5472
|
var PROTO_ABI_VERSION = 1;
|
|
5451
5473
|
var protoRequestSequence = 0;
|
|
5452
5474
|
var monotonicMs = () => globalThis.performance?.now?.() ?? Date.now();
|
|
5475
|
+
var KernelRuntimeArtifact = {
|
|
5476
|
+
Executable: "holon.wasm",
|
|
5477
|
+
StageZeroLaw: "bootstrap.law.usdz",
|
|
5478
|
+
ControllerLaw: "nomos.law.usdz"
|
|
5479
|
+
};
|
|
5480
|
+
async function localRuntimeArtifact(artifact) {
|
|
5481
|
+
const runtimeDir = globalThis.process?.env?.NOMOS_LOCAL_RUNTIME_DIR?.replace(/\/+$/, "");
|
|
5482
|
+
if (!runtimeDir) return null;
|
|
5483
|
+
const nodeFsPromises = "node:fs/promises";
|
|
5484
|
+
try {
|
|
5485
|
+
return new Uint8Array(await import(nodeFsPromises).then((fs) => fs.readFile(`${runtimeDir}/${artifact}`)));
|
|
5486
|
+
} catch (cause) {
|
|
5487
|
+
throw new LoadError(`local Nomos runtime is missing ${artifact}`, {
|
|
5488
|
+
code: "nomos.load.runtime_bundle_incomplete",
|
|
5489
|
+
artifact,
|
|
5490
|
+
sourceUrl: runtimeDir,
|
|
5491
|
+
info: cause
|
|
5492
|
+
});
|
|
5493
|
+
}
|
|
5494
|
+
}
|
|
5453
5495
|
function protoValue(value) {
|
|
5454
5496
|
if (value === null || value === void 0) return create(NomosValueSchema, { kind: { case: "null", value: {} } });
|
|
5455
5497
|
if (typeof value === "boolean") return create(NomosValueSchema, { kind: { case: "boolean", value } });
|
|
@@ -5760,6 +5802,7 @@ function providerOperation(mode, rawFields, workBytes) {
|
|
|
5760
5802
|
})
|
|
5761
5803
|
},
|
|
5762
5804
|
authoring,
|
|
5805
|
+
birthCertificate: fields.birthCertificate ? protoBirthCertificate(fields.birthCertificate) : void 0,
|
|
5763
5806
|
lawUsdz: fields.lawClosureFile ? workBytes(String(fields.lawClosureFile)) : new Uint8Array(),
|
|
5764
5807
|
executionLawUsdz: fields.executionLawClosureFile ? workBytes(String(fields.executionLawClosureFile)) : new Uint8Array(),
|
|
5765
5808
|
controllerLawHash: fields.domainHash === void 0 ? void 0 : String(fields.domainHash),
|
|
@@ -5807,7 +5850,7 @@ function providerOperation(mode, rawFields, workBytes) {
|
|
|
5807
5850
|
head: fields.head ? String(fields.head) : void 0
|
|
5808
5851
|
})
|
|
5809
5852
|
};
|
|
5810
|
-
else if (mode === "pack_delta") custody = { case: "packDelta", value: create(PackDeltaRequestSchema, { repo: String(fields.repoArg ?? ""), base: fields.base ? String(fields.base) : void 0, head: fields.head ? String(fields.head) : void 0, branch: String(fields.branch ?? "main") }) };
|
|
5853
|
+
else if (mode === "pack_delta") custody = { case: "packDelta", value: create(PackDeltaRequestSchema, { repo: String(fields.repoArg ?? ""), base: fields.base ? String(fields.base) : void 0, head: fields.head ? String(fields.head) : void 0, branch: String(fields.branch ?? "main"), stagedPackFile: fields.stagedPackFile ? String(fields.stagedPackFile) : void 0 }) };
|
|
5811
5854
|
else if (mode === "intents_above") custody = { case: "intentsAbove", value: create(IntentsAboveRequestSchema, { repo: String(fields.repoArg ?? ""), base: fields.base ? String(fields.base) : void 0, head: fields.head ? String(fields.head) : void 0, branch: String(fields.branch ?? "main"), limit: BigInt(Number(fields.limit ?? 0)), completeLogical: fields.completeLogical === true, compactStored: fields.compactStored === true }) };
|
|
5812
5855
|
else if (mode === "checkpoint_export") custody = { case: "checkpointExport", value: create(CheckpointExportRequestSchema, { target, stagedFrontierFile: fields.stagedFrontierFile ? String(fields.stagedFrontierFile) : void 0 }) };
|
|
5813
5856
|
else if (mode === "checkpoint_import") custody = {
|
|
@@ -5840,14 +5883,20 @@ function nmsInternalReportProviderTransport(host, encoded, phases, responseBytes
|
|
|
5840
5883
|
})}`);
|
|
5841
5884
|
}
|
|
5842
5885
|
function nmsInternalEncodeProviderCall(mode, fields, workBytes, requestPrefix = "browser") {
|
|
5886
|
+
return nmsInternalEncodeTypedProviderCall(
|
|
5887
|
+
providerOperation(mode, fields, workBytes),
|
|
5888
|
+
requestPrefix
|
|
5889
|
+
);
|
|
5890
|
+
}
|
|
5891
|
+
function nmsInternalEncodeTypedProviderCall(operation, requestPrefix = "browser") {
|
|
5843
5892
|
const started = monotonicMs();
|
|
5844
5893
|
const requestId = `${requestPrefix}-${++protoRequestSequence}`;
|
|
5845
5894
|
const bytes = toBinary(CallRequestSchema, create(CallRequestSchema, {
|
|
5846
5895
|
protocolVersion: PROTO_ABI_VERSION,
|
|
5847
5896
|
requestId,
|
|
5848
|
-
operation
|
|
5897
|
+
operation
|
|
5849
5898
|
}));
|
|
5850
|
-
return { requestId, mode, bytes, encodeMs: monotonicMs() - started };
|
|
5899
|
+
return { requestId, mode: operation.case || "empty", bytes, encodeMs: monotonicMs() - started };
|
|
5851
5900
|
}
|
|
5852
5901
|
function nmsInternalDecodeProviderResponse(bytes, requestId, stderr = []) {
|
|
5853
5902
|
const response = fromBinary(CallResponseSchema, bytes);
|
|
@@ -5886,13 +5935,15 @@ function nmsInternalDecodeProviderResponse(bytes, requestId, stderr = []) {
|
|
|
5886
5935
|
case "applyPack":
|
|
5887
5936
|
return JSON.stringify({ ok: true, objects: Number(result.value.objectCount), packHash: result.value.packHash });
|
|
5888
5937
|
case "packDelta":
|
|
5889
|
-
return JSON.stringify({ ok: true, bytes: result.value.pack.length, packB64: nmsInternalSnapshotToBase64(result.value.pack) });
|
|
5938
|
+
return JSON.stringify({ ok: true, bytes: Number(result.value.bytes || BigInt(result.value.pack.length)), ...result.value.pack.length ? { packB64: nmsInternalSnapshotToBase64(result.value.pack) } : {} });
|
|
5890
5939
|
case "intentsAbove":
|
|
5891
|
-
return JSON.stringify({ ok: true, intents: result.value.intents.map((intent) => ({ oid: intent.oid, id: intent.intentId, domain: intent.domain, directiveId: intent.directive, changeB64: nmsInternalSnapshotToBase64(intent.changeUsda), ...jsStruct(intent.semantic) })) });
|
|
5940
|
+
return JSON.stringify({ ok: true, intents: result.value.intents.map((intent) => ({ oid: intent.oid, id: intent.intentId, domain: intent.domain, directiveId: intent.directive, changeB64: nmsInternalSnapshotToBase64(intent.changeUsda), transportRequirement: intent.transportRequirement, ...jsStruct(intent.semantic) })) });
|
|
5892
5941
|
case "checkpointExport":
|
|
5893
5942
|
return JSON.stringify({ ok: true, empty: result.value.empty, cursor: result.value.cursor, frontier: result.value.frontier.length ? nmsInternalSnapshotToBase64(result.value.frontier) : void 0, stateRoot: result.value.stateRoot, stateTree: result.value.stateTree, pinned: result.value.pinned, readIndexSnapshot: result.value.readIndexSnapshot, readIndexSnapshotPending: result.value.readIndexSnapshotPending, readIndexSqliteBytes: result.value.readIndexSqliteBytes === void 0 ? void 0 : Number(result.value.readIndexSqliteBytes), readIndexCustodyBytes: result.value.readIndexCustodyBytes === void 0 ? void 0 : Number(result.value.readIndexCustodyBytes) });
|
|
5894
5943
|
case "checkpointImport":
|
|
5895
5944
|
return JSON.stringify({ ok: true, restored: result.value.restored, reason: result.value.reason, frontierSeeded: result.value.frontierSeeded, frontierVerificationPending: result.value.frontierVerificationPending, aggregates: Number(result.value.aggregateCount), kernelSpans: jsStruct(result.value.spans), cursor: result.value.cursor, readOnly: result.value.readOnly, lazyReadIndex: result.value.lazyReadIndex });
|
|
5945
|
+
case "lawClosureInfo":
|
|
5946
|
+
return JSON.stringify({ ok: true, identity: result.value.identity, domains: result.value.domainKeys });
|
|
5896
5947
|
case "writeRef":
|
|
5897
5948
|
case "deleteRef":
|
|
5898
5949
|
return JSON.stringify({ ok: true });
|
|
@@ -5908,7 +5959,13 @@ var wasmModuleCache = /* @__PURE__ */ new Map();
|
|
|
5908
5959
|
function wasmModuleFor(base, fetchImpl) {
|
|
5909
5960
|
let p = wasmModuleCache.get(base);
|
|
5910
5961
|
if (!p) {
|
|
5962
|
+
const localRuntimeDir = globalThis.process?.env?.NOMOS_LOCAL_RUNTIME_DIR;
|
|
5911
5963
|
const localWasm = globalThis.process?.env?.NOMOS_LOCAL_WASM;
|
|
5964
|
+
if (localRuntimeDir) {
|
|
5965
|
+
p = localRuntimeArtifact(KernelRuntimeArtifact.Executable).then((bytes) => WebAssembly.compile(new Uint8Array(bytes).buffer));
|
|
5966
|
+
wasmModuleCache.set(base, p);
|
|
5967
|
+
return p;
|
|
5968
|
+
}
|
|
5912
5969
|
if (localWasm) {
|
|
5913
5970
|
const nodeFsPromises = "node:fs/promises";
|
|
5914
5971
|
p = import(nodeFsPromises).then((fs) => fs.readFile(localWasm)).then((b) => WebAssembly.compile(b));
|
|
@@ -5981,15 +6038,26 @@ function createWasmEnginePlane({ span } = {}) {
|
|
|
5981
6038
|
root = /* @__PURE__ */ new Map();
|
|
5982
6039
|
wsParent = new Directory(/* @__PURE__ */ new Map());
|
|
5983
6040
|
root.set("ws", wsParent);
|
|
5984
|
-
|
|
5985
|
-
const
|
|
5986
|
-
|
|
5987
|
-
|
|
5988
|
-
|
|
5989
|
-
if (
|
|
5990
|
-
|
|
5991
|
-
|
|
5992
|
-
|
|
6041
|
+
const loadRuntimeLaw = async (artifact) => {
|
|
6042
|
+
const local = await localRuntimeArtifact(artifact);
|
|
6043
|
+
if (local) return local;
|
|
6044
|
+
const sourceUrl = `${base}/v1/runtime/${artifact}`;
|
|
6045
|
+
const response = await fetchImpl(sourceUrl, { headers: authHeaders });
|
|
6046
|
+
if (!response?.ok) {
|
|
6047
|
+
throw new LoadError(`runtime package fetch ${response?.status ?? "failed"}`, {
|
|
6048
|
+
code: "nomos.load.runtime_package_fetch_failed",
|
|
6049
|
+
artifact,
|
|
6050
|
+
sourceUrl
|
|
6051
|
+
});
|
|
6052
|
+
}
|
|
6053
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
6054
|
+
};
|
|
6055
|
+
const [bootstrapLaw, controllerLaw] = await Promise.all([
|
|
6056
|
+
loadRuntimeLaw(KernelRuntimeArtifact.StageZeroLaw),
|
|
6057
|
+
loadRuntimeLaw(KernelRuntimeArtifact.ControllerLaw)
|
|
6058
|
+
]);
|
|
6059
|
+
root.set(KernelRuntimeArtifact.StageZeroLaw, new File(bootstrapLaw));
|
|
6060
|
+
root.set(KernelRuntimeArtifact.ControllerLaw, new File(controllerLaw));
|
|
5993
6061
|
preopen = new PreopenDirectory("/work", root);
|
|
5994
6062
|
fs = makeGitFs(preopen, "/work", { File, Directory });
|
|
5995
6063
|
const _bootInst = _span("receive", "boot: instantiate holon (wasm)", "boot");
|
|
@@ -6009,6 +6077,22 @@ function createWasmEnginePlane({ span } = {}) {
|
|
|
6009
6077
|
throw new Error(`holon refused to start (exit ${code}): ${STDERR.join("\n")}`);
|
|
6010
6078
|
}
|
|
6011
6079
|
ex = inst.exports;
|
|
6080
|
+
protoTransportCall(
|
|
6081
|
+
ex,
|
|
6082
|
+
nmsInternalEncodeTypedProviderCall({
|
|
6083
|
+
case: "custody",
|
|
6084
|
+
value: create(CustodyRequestSchema, {
|
|
6085
|
+
operation: {
|
|
6086
|
+
case: "lawClosureInfo",
|
|
6087
|
+
value: create(LawClosureInfoRequestSchema, {
|
|
6088
|
+
closureFile: `/work/${KernelRuntimeArtifact.StageZeroLaw}`,
|
|
6089
|
+
capability: KernelLawCapability.STAGE_ZERO_BOOTSTRAP
|
|
6090
|
+
})
|
|
6091
|
+
}
|
|
6092
|
+
})
|
|
6093
|
+
}, "browser-boot"),
|
|
6094
|
+
STDERR
|
|
6095
|
+
);
|
|
6012
6096
|
_bootInst.end();
|
|
6013
6097
|
})();
|
|
6014
6098
|
return bootPromise;
|
|
@@ -6320,6 +6404,26 @@ function pkt(payload) {
|
|
|
6320
6404
|
return concatBytes([enc3.encode(len), body]);
|
|
6321
6405
|
}
|
|
6322
6406
|
var FLUSH = enc3.encode("0000");
|
|
6407
|
+
function receivePackCommandPrefix(updates) {
|
|
6408
|
+
const cmds = [];
|
|
6409
|
+
updates.forEach((u, i) => {
|
|
6410
|
+
const old = u.oldOid || ZERO_OID;
|
|
6411
|
+
const neu = u.newOid || ZERO_OID;
|
|
6412
|
+
const caps = i === 0 ? "\0report-status" : "";
|
|
6413
|
+
cmds.push(pkt(`${old} ${neu} ${u.ref}${caps}
|
|
6414
|
+
`));
|
|
6415
|
+
});
|
|
6416
|
+
cmds.push(FLUSH);
|
|
6417
|
+
return concatBytes(cmds);
|
|
6418
|
+
}
|
|
6419
|
+
function assertReceivePackAccepted(status, response, updates) {
|
|
6420
|
+
const txt = dec3.decode(response);
|
|
6421
|
+
const unpacked = /unpack ok/.test(txt);
|
|
6422
|
+
const everyRefOk = updates.every((u) => new RegExp(`ok ${u.ref.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`).test(txt));
|
|
6423
|
+
if (!(status >= 200 && status < 300 && unpacked && everyRefOk && !/\bng /.test(txt))) {
|
|
6424
|
+
throw new Error(`receive-pack ${status}: ${txt.replace(/[^\x20-\x7e]/g, " ").trim().slice(0, 200)}`);
|
|
6425
|
+
}
|
|
6426
|
+
}
|
|
6323
6427
|
function readPktLines(buf, off = 0) {
|
|
6324
6428
|
const lines = [];
|
|
6325
6429
|
while (off + 4 <= buf.length) {
|
|
@@ -6362,16 +6466,7 @@ async function lsRefs(remote, headers = {}, { service = "git-upload-pack", prefi
|
|
|
6362
6466
|
}
|
|
6363
6467
|
async function pushPack(remote, headers = {}, { updates = [], pack = null } = {}, fetchImpl = fetch) {
|
|
6364
6468
|
if (!updates.length) return { ok: true, noop: true };
|
|
6365
|
-
const
|
|
6366
|
-
updates.forEach((u, i) => {
|
|
6367
|
-
const old = u.oldOid || ZERO_OID;
|
|
6368
|
-
const neu = u.newOid || ZERO_OID;
|
|
6369
|
-
const caps = i === 0 ? "\0report-status" : "";
|
|
6370
|
-
cmds.push(pkt(`${old} ${neu} ${u.ref}${caps}
|
|
6371
|
-
`));
|
|
6372
|
-
});
|
|
6373
|
-
cmds.push(FLUSH);
|
|
6374
|
-
const body = concatBytes([...cmds, pack && pack.length ? pack : EMPTY_PACK]);
|
|
6469
|
+
const body = concatBytes([receivePackCommandPrefix(updates), pack && pack.length ? pack : EMPTY_PACK]);
|
|
6375
6470
|
let r;
|
|
6376
6471
|
try {
|
|
6377
6472
|
r = await fetchImpl(`${remote}/git-receive-pack`, {
|
|
@@ -6382,12 +6477,7 @@ async function pushPack(remote, headers = {}, { updates = [], pack = null } = {}
|
|
|
6382
6477
|
} catch (error) {
|
|
6383
6478
|
throw new Error(`receive-pack transport failed (${body.byteLength} bytes): ${String(error)}`, { cause: error });
|
|
6384
6479
|
}
|
|
6385
|
-
|
|
6386
|
-
const unpacked = /unpack ok/.test(txt);
|
|
6387
|
-
const everyRefOk = updates.every((u) => new RegExp(`ok ${u.ref.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`).test(txt));
|
|
6388
|
-
if (!(r.ok && unpacked && everyRefOk && !/\bng /.test(txt))) {
|
|
6389
|
-
throw new Error(`receive-pack ${r.status}: ${txt.replace(/[^\x20-\x7e]/g, " ").trim().slice(0, 200)}`);
|
|
6390
|
-
}
|
|
6480
|
+
assertReceivePackAccepted(r.status, new Uint8Array(await r.arrayBuffer()), updates);
|
|
6391
6481
|
return { ok: true };
|
|
6392
6482
|
}
|
|
6393
6483
|
|
|
@@ -6853,21 +6943,18 @@ function createGovernanceOffers(ctx) {
|
|
|
6853
6943
|
* relay as `{ intentBytes }`. `domain` defaults to "workspaces". The signature is verified by the kernel.
|
|
6854
6944
|
* @returns {Promise<SealedOffer>}
|
|
6855
6945
|
*/
|
|
6856
|
-
signGovernanceOffer: ({ domain, directiveId, payload, authorSecret, actor, domainHash, lawUsdz } = {}) => {
|
|
6946
|
+
signGovernanceOffer: ({ domain, directiveId, payload, authorSecret, actor, domainHash, lawUsdz, birthCertificate } = {}) => {
|
|
6857
6947
|
if (!directiveId || typeof directiveId !== "string") throw new Error("signGovernanceOffer requires a governance directiveId");
|
|
6858
6948
|
if (!authorSecret || typeof authorSecret !== "string") throw new Error("signGovernanceOffer requires the requester's device `authorSecret` (base64 from authorKeygen) \u2014 the signature IS the authorization");
|
|
6859
6949
|
if (!actor || typeof actor !== "string") throw new Error("signGovernanceOffer requires `actor` (the subject the key authors as, e.g. `user:<uid>`)");
|
|
6860
|
-
return offerDirective(domain || "workspaces", directiveId, payload ?? {}, { domainHash, actor, signWith: authorSecret, lawUsdz, returnSealed: true });
|
|
6950
|
+
return offerDirective(domain || "workspaces", directiveId, payload ?? {}, { domainHash, actor, signWith: authorSecret, lawUsdz, birthCertificate, returnSealed: true });
|
|
6861
6951
|
},
|
|
6862
|
-
/**
|
|
6863
|
-
* Build the `enrollSigner` payload that binds a device key to a principal (`keyHash = sha256(pubkey)`).
|
|
6864
|
-
*/
|
|
6952
|
+
/** Build the self-binding `enrollSigner` payload (`keyHash = sha256(pubkey)`). */
|
|
6865
6953
|
enrollSignerPayload: ({ principal, publicKey, grantedBy, grantedAt } = {}) => serialize(async () => {
|
|
6866
6954
|
if (!principal || typeof principal !== "string") throw new Error("enrollSignerPayload requires the auth-provider `principal` uid the key may author as");
|
|
6867
6955
|
if (!publicKey || typeof publicKey !== "string") throw new Error("enrollSignerPayload requires the device `publicKey` (base64 from authorKeygen)");
|
|
6868
6956
|
const p = canonicalPrincipal(principal);
|
|
6869
6957
|
return {
|
|
6870
|
-
principal: p,
|
|
6871
6958
|
keyHash: await sha256hexBytes2(bytesUnb642(publicKey)),
|
|
6872
6959
|
grantedBy: canonicalPrincipal(grantedBy || p),
|
|
6873
6960
|
grantedAt: typeof grantedAt === "number" ? grantedAt : Date.now()
|
|
@@ -7412,6 +7499,9 @@ async function sha256hex(t) {
|
|
|
7412
7499
|
const b = await crypto.subtle.digest("SHA-256", enc4.encode(t));
|
|
7413
7500
|
return [...new Uint8Array(b)].map((x) => x.toString(16).padStart(2, "0")).join("");
|
|
7414
7501
|
}
|
|
7502
|
+
async function nmsInternalCandidateSessionRef(clientId) {
|
|
7503
|
+
return `refs/heads/session/${await sha256hex(`nomos-candidate-session:${clientId}`)}`;
|
|
7504
|
+
}
|
|
7415
7505
|
async function sha256hexBytes(bytes) {
|
|
7416
7506
|
const b = await crypto.subtle.digest("SHA-256", bytes);
|
|
7417
7507
|
return [...new Uint8Array(b)].map((x) => x.toString(16).padStart(2, "0")).join("");
|
|
@@ -7567,7 +7657,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
7567
7657
|
const remote = `${base}/v2/workspaces/${workspace}/git`;
|
|
7568
7658
|
const cid = clientId || [...crypto.getRandomValues(new Uint8Array(8))].map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
7569
7659
|
const replica = await replicaIdFromValue(`client:${cid}`);
|
|
7570
|
-
|
|
7660
|
+
let activeAuthToken = authToken;
|
|
7661
|
+
let authHeaders = packAuthHeaders({ authToken: activeAuthToken, principal });
|
|
7571
7662
|
let _spanSeq = 0;
|
|
7572
7663
|
const span = (track, name, kind, extra = {}) => {
|
|
7573
7664
|
if (typeof onSpan !== "function") return { end: () => {
|
|
@@ -7947,7 +8038,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
7947
8038
|
activeHolonCall = null;
|
|
7948
8039
|
}
|
|
7949
8040
|
};
|
|
7950
|
-
const tokenSubject = jwtClaim(
|
|
8041
|
+
const tokenSubject = jwtClaim(activeAuthToken || "", "sub");
|
|
7951
8042
|
const connectionPrincipal = canonicalPrincipal(
|
|
7952
8043
|
typeof principal === "string" && principal ? principal : typeof tokenSubject === "string" ? tokenSubject : ""
|
|
7953
8044
|
);
|
|
@@ -7955,8 +8046,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
7955
8046
|
const out = {};
|
|
7956
8047
|
const pr = typeof p === "string" && p ? p : connectionPrincipal;
|
|
7957
8048
|
if (pr) out.principal = pr;
|
|
7958
|
-
if (
|
|
7959
|
-
out.authToken =
|
|
8049
|
+
if (activeAuthToken) {
|
|
8050
|
+
out.authToken = activeAuthToken;
|
|
7960
8051
|
out.nowUnix = Math.floor(Date.now() / 1e3);
|
|
7961
8052
|
}
|
|
7962
8053
|
if (deviceSecret) out.authorSecret = deviceSecret;
|
|
@@ -8004,6 +8095,9 @@ ${String(commit).toLowerCase()}`;
|
|
|
8004
8095
|
"spec.installedBy": domain.installedBy,
|
|
8005
8096
|
"spec.authorityScope": domain.authorityScope,
|
|
8006
8097
|
"spec.supersedes": domain.supersedes,
|
|
8098
|
+
"spec.lawClosureIdentity": domain.lawClosureIdentity,
|
|
8099
|
+
"spec.dependencies": Array.isArray(domain.dependencies) ? domain.dependencies : [],
|
|
8100
|
+
"spec.domainKeys": Array.isArray(domain.domainKeys) ? domain.domainKeys : [],
|
|
8007
8101
|
"status.phase": domain.phase,
|
|
8008
8102
|
"status.supersededBy": domain.supersededBy,
|
|
8009
8103
|
"metadata.generation": domain.generation
|
|
@@ -8089,33 +8183,41 @@ ${String(commit).toLowerCase()}`;
|
|
|
8089
8183
|
return intentsAbove(head, baseHead).map((it) => ({ session: cid, oid: it.oid.slice(0, 10), changeB64: it.changeB64 }));
|
|
8090
8184
|
}
|
|
8091
8185
|
async function pushCandidateCustody(head, baseHead) {
|
|
8092
|
-
|
|
8093
|
-
throw new Error(
|
|
8094
|
-
"this kernel provider cannot transport an offer's auxiliary Git custody; use the WASI client/CLI or upgrade the native provider"
|
|
8095
|
-
);
|
|
8096
|
-
}
|
|
8097
|
-
const sessionRef = `refs/heads/session/${cid}`;
|
|
8186
|
+
const sessionRef = await nmsInternalCandidateSessionRef(cid);
|
|
8098
8187
|
const refs = await lsRefs(remote, authHeaders, {
|
|
8099
8188
|
service: "git-receive-pack",
|
|
8100
8189
|
prefix: sessionRef
|
|
8101
8190
|
}, _fetch);
|
|
8102
8191
|
const oldOid = refs[sessionRef] || ZERO_OID;
|
|
8103
|
-
|
|
8104
|
-
if (oldOid !== ZERO_OID)
|
|
8105
|
-
|
|
8106
|
-
|
|
8107
|
-
|
|
8108
|
-
|
|
8109
|
-
|
|
8192
|
+
const bases = [];
|
|
8193
|
+
if (oldOid !== ZERO_OID) bases.push(oldOid);
|
|
8194
|
+
if (baseHead && !bases.includes(baseHead)) bases.push(baseHead);
|
|
8195
|
+
bases.push(null);
|
|
8196
|
+
if (typeof provider.pushPackDelta === "function") {
|
|
8197
|
+
const pushed = await provider.pushPackDelta({
|
|
8198
|
+
remote,
|
|
8199
|
+
headers: authHeaders,
|
|
8200
|
+
ref: sessionRef,
|
|
8201
|
+
oldOid,
|
|
8202
|
+
head,
|
|
8203
|
+
bases
|
|
8204
|
+
});
|
|
8205
|
+
return { ref: sessionRef, bytes: pushed.bytes };
|
|
8110
8206
|
}
|
|
8111
|
-
if (
|
|
8207
|
+
if (typeof provider.packDelta !== "function") {
|
|
8208
|
+
throw new Error(
|
|
8209
|
+
"this kernel provider cannot transport an offer's auxiliary Git custody; upgrade the provider"
|
|
8210
|
+
);
|
|
8211
|
+
}
|
|
8212
|
+
let pack = null;
|
|
8213
|
+
for (const base2 of bases) {
|
|
8112
8214
|
try {
|
|
8113
|
-
pack = provider.packDelta(
|
|
8215
|
+
pack = provider.packDelta(base2, head);
|
|
8114
8216
|
} catch {
|
|
8115
8217
|
pack = null;
|
|
8116
8218
|
}
|
|
8219
|
+
if (pack) break;
|
|
8117
8220
|
}
|
|
8118
|
-
if (!pack) pack = provider.packDelta("", head);
|
|
8119
8221
|
if (!pack) throw new Error("the kernel could not build the candidate custody pack");
|
|
8120
8222
|
await pushPack(remote, authHeaders, {
|
|
8121
8223
|
updates: [{ ref: sessionRef, oldOid, newOid: head }],
|
|
@@ -8474,7 +8576,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
8474
8576
|
}
|
|
8475
8577
|
}
|
|
8476
8578
|
}
|
|
8477
|
-
const offerDirective = (domain, directiveId, payload, { domainHash, actor = "", signWith, authTokenOverride, returnSealed = false, returnCreated = false, lawUsdz, __nomosConflictSnapshots, __nomosCorrectionAuthority, force = false } = {}) => {
|
|
8579
|
+
const offerDirective = (domain, directiveId, payload, { domainHash, actor = "", signWith, authTokenOverride, returnSealed = false, returnCreated = false, lawUsdz, birthCertificate, __nomosConflictSnapshots, __nomosCorrectionAuthority, force = false } = {}) => {
|
|
8478
8580
|
if (directiveId === BUSINESS_CORRECTION_DIRECTIVE && __nomosCorrectionAuthority !== BUSINESS_CORRECTION_AUTHORITY) {
|
|
8479
8581
|
throw new Error("Nomos business corrections are private framework law; use the generated corrections.undo(reason) / corrections.redo(reason) surface");
|
|
8480
8582
|
}
|
|
@@ -8524,6 +8626,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
8524
8626
|
// key cannot already be present in the signer relation by definition.
|
|
8525
8627
|
...authTokenOverride ? { principal: actor, authToken: authTokenOverride, nowUnix: Math.floor(Date.now() / 1e3) } : readAuthFields(void 0, actor),
|
|
8526
8628
|
...lawClosureFile ? { lawClosureFile } : {},
|
|
8629
|
+
...birthCertificate ? { birthCertificate } : {},
|
|
8527
8630
|
// SIGN THE WRITE (the write-pin): a client-held device secret makes the author door mint the
|
|
8528
8631
|
// signed-author attestation; a warranted workspace's gate requires it. Absent ⇒ unsigned (era-safe).
|
|
8529
8632
|
// A per-author `signWith` (e.g. a governance signing key) overrides the connect-time device secret.
|
|
@@ -8579,7 +8682,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
8579
8682
|
const bcm = /birth-unattestable \(([^)]+)\)/.exec(String(res.error || ""));
|
|
8580
8683
|
const certSecret = signWith || deviceSecret;
|
|
8581
8684
|
const p = payload;
|
|
8582
|
-
if (bcm && bcm[1] && certSecret && actor && p && typeof p === "object"
|
|
8685
|
+
if (bcm && bcm[1] && certSecret && actor && p && typeof p === "object") {
|
|
8583
8686
|
const child = bcm[1];
|
|
8584
8687
|
const derived = JSON.parse(call("query", { queryBytes: qBytes({ op: "attestationSign", secret: certSecret, asserterWorkspace: "derive", object: "derive:public", relation: "derive", subject: "user:derive", attestedAt: "1970-01-01T00:00:00.000Z" }) }));
|
|
8585
8688
|
const devicePub = derived && derived.publicKey;
|
|
@@ -8766,25 +8869,10 @@ ${String(commit).toLowerCase()}`;
|
|
|
8766
8869
|
if (!frontierTrustStateAvailable) call("query", { queryBytes: qBytes({ op: "byId", aggregateId: "genesis-warrant:self" }) });
|
|
8767
8870
|
}
|
|
8768
8871
|
}
|
|
8769
|
-
|
|
8770
|
-
let certified = {
|
|
8771
|
-
...p,
|
|
8772
|
-
ownerKeyHash: p.ownerKeyHash || keyHash,
|
|
8773
|
-
birthCert: JSON.stringify(sign(Boolean(__testRootSecret)))
|
|
8774
|
-
};
|
|
8775
|
-
envelope.payload = { domain, directiveId, payload: certified };
|
|
8872
|
+
envelope.payload = { domain, directiveId, payload: p };
|
|
8776
8873
|
writeWork(`envelope-${s}.json`, enc4.encode(stringifyBig(envelope)));
|
|
8777
8874
|
raw = authorViaOffer(authorArgs);
|
|
8778
8875
|
res = JSON.parse(raw);
|
|
8779
|
-
const verdictMismatch = res && res.ok === false ? /cert verified=(true|false) != the gate verdict verified=(true|false)/.exec(String(res.error || "")) : null;
|
|
8780
|
-
if (verdictMismatch) {
|
|
8781
|
-
const gateVerified = verdictMismatch[2] === "true";
|
|
8782
|
-
certified = { ...p, ownerKeyHash: p.ownerKeyHash || keyHash, birthCert: JSON.stringify(sign(gateVerified)) };
|
|
8783
|
-
envelope.payload = { domain, directiveId, payload: certified };
|
|
8784
|
-
writeWork(`envelope-${s}.json`, enc4.encode(stringifyBig(envelope)));
|
|
8785
|
-
raw = authorViaOffer(authorArgs);
|
|
8786
|
-
res = JSON.parse(raw);
|
|
8787
|
-
}
|
|
8788
8876
|
}
|
|
8789
8877
|
}
|
|
8790
8878
|
}
|
|
@@ -8837,7 +8925,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
8837
8925
|
}
|
|
8838
8926
|
const birth = res.born ? { born: res.born } : {};
|
|
8839
8927
|
const birthOut = res.birthOutcomes ? { birthOutcomes: res.birthOutcomes } : {};
|
|
8840
|
-
return returnSealed ? { head: res.head, intentBytes: sealedB64, ...birth, ...birthOut } : returnCreated ? { head: res.head, created, affected, workspace, ...birth, ...birthOut } : res.head;
|
|
8928
|
+
return returnSealed ? { head: res.head, intentBytes: sealedB64, ...birth, ...birthOut } : returnCreated ? { head: res.head, intentId: res.intentId, created, affected, workspace, ...birth, ...birthOut } : res.head;
|
|
8841
8929
|
}, `offerDirective:${domain}.${directiveId}`);
|
|
8842
8930
|
};
|
|
8843
8931
|
const _nomosAdoptModel = async (domain, candidateHash, opts = {}) => {
|
|
@@ -8851,6 +8939,17 @@ ${String(commit).toLowerCase()}`;
|
|
|
8851
8939
|
if (!domain.trim() || !candidateHash.trim()) {
|
|
8852
8940
|
return { ok: false, stage: "preflight", error: "the generated model identity is missing" };
|
|
8853
8941
|
}
|
|
8942
|
+
const candidateInstallation = installRowsInner().find(
|
|
8943
|
+
(row) => row?.id === `domain-installation:${candidateHash}`
|
|
8944
|
+
);
|
|
8945
|
+
const candidatePhase = String(candidateInstallation?.data?.["status.phase"] ?? "");
|
|
8946
|
+
if (candidatePhase !== "Pending") {
|
|
8947
|
+
return {
|
|
8948
|
+
ok: false,
|
|
8949
|
+
stage: candidatePhase.length === 0 ? "staging-required" : "preflight",
|
|
8950
|
+
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}', not a staged successor of the current model`
|
|
8951
|
+
};
|
|
8952
|
+
}
|
|
8854
8953
|
let report;
|
|
8855
8954
|
try {
|
|
8856
8955
|
report = await serialize(async () => {
|
|
@@ -8877,6 +8976,13 @@ ${String(commit).toLowerCase()}`;
|
|
|
8877
8976
|
returnCreated: false
|
|
8878
8977
|
});
|
|
8879
8978
|
const head = typeof outcome === "string" ? outcome : String(outcome?.head ?? "");
|
|
8979
|
+
const readiness = await prepareDomainReady(domain, candidateHash);
|
|
8980
|
+
if (readiness.prepared !== true) {
|
|
8981
|
+
throw Object.assign(
|
|
8982
|
+
new Error(`the promoted model '${candidateHash}' is active but its authenticated '${domain}' USDA slice is not ready`),
|
|
8983
|
+
{ code: "nomos.model.readiness_failed" }
|
|
8984
|
+
);
|
|
8985
|
+
}
|
|
8880
8986
|
recomputeCompat();
|
|
8881
8987
|
return {
|
|
8882
8988
|
ok: true,
|
|
@@ -8895,6 +9001,57 @@ ${String(commit).toLowerCase()}`;
|
|
|
8895
9001
|
};
|
|
8896
9002
|
}
|
|
8897
9003
|
};
|
|
9004
|
+
const _nomosModelInstallation = (domain, candidateHash) => {
|
|
9005
|
+
const row = installRowsInner()?.find(
|
|
9006
|
+
(entry) => entry?.id === `domain-installation:${candidateHash}`
|
|
9007
|
+
);
|
|
9008
|
+
const data = row?.data;
|
|
9009
|
+
const domainKeys = Array.isArray(data?.["spec.domainKeys"]) ? data["spec.domainKeys"].map(String) : [];
|
|
9010
|
+
if (!data || !domainKeys.includes(domain)) return null;
|
|
9011
|
+
return {
|
|
9012
|
+
hash: candidateHash,
|
|
9013
|
+
phase: String(data["status.phase"] ?? ""),
|
|
9014
|
+
dependencies: Array.isArray(data["spec.dependencies"]) ? data["spec.dependencies"].map(String) : [],
|
|
9015
|
+
domainKeys
|
|
9016
|
+
};
|
|
9017
|
+
};
|
|
9018
|
+
const _nomosStageGeneratedModel = async (domain, candidateHash, lawUsdz, dependencies) => {
|
|
9019
|
+
if (!connectionPrincipal) {
|
|
9020
|
+
throw new Error("generated model staging needs the signed-in session");
|
|
9021
|
+
}
|
|
9022
|
+
const rows = installRowsInner() ?? [];
|
|
9023
|
+
const existing = rows.find(
|
|
9024
|
+
(entry) => entry?.id === `domain-installation:${candidateHash}`
|
|
9025
|
+
);
|
|
9026
|
+
const existingPhase = String(existing?.data?.["status.phase"] ?? "");
|
|
9027
|
+
if (existingPhase === "Active" || existingPhase === "Pending") {
|
|
9028
|
+
return { ok: true, status: existingPhase.toLowerCase(), candidateHash };
|
|
9029
|
+
}
|
|
9030
|
+
if (!(lawUsdz instanceof Uint8Array) || lawUsdz.byteLength === 0) {
|
|
9031
|
+
throw new Error(`generated model '${candidateHash}' has no USDZ transport asset`);
|
|
9032
|
+
}
|
|
9033
|
+
const predecessor = rows.find((entry) => {
|
|
9034
|
+
const data = entry?.data;
|
|
9035
|
+
return String(data?.["status.phase"] ?? "") === "Active" && Array.isArray(data?.["spec.domainKeys"]) && data["spec.domainKeys"].map(String).includes(domain);
|
|
9036
|
+
});
|
|
9037
|
+
const priorHash = String(predecessor?.data?.["spec.domainHash"] ?? "");
|
|
9038
|
+
if (!priorHash) {
|
|
9039
|
+
throw new Error(`generated application cannot identify the active '${domain}' model it would supersede`);
|
|
9040
|
+
}
|
|
9041
|
+
const inheritedDependencies = Array.isArray(dependencies) ? dependencies : Array.isArray(predecessor?.data?.["spec.dependencies"]) ? predecessor.data["spec.dependencies"].map(String) : [];
|
|
9042
|
+
const head = await offerDirective("nomos", "stageDomain", {
|
|
9043
|
+
domainHash: candidateHash,
|
|
9044
|
+
installedBy: "generated-application",
|
|
9045
|
+
lawClosureIdentity: candidateHash,
|
|
9046
|
+
dependencies: [...new Set(inheritedDependencies.map(String))].sort(),
|
|
9047
|
+
supersedes: priorHash,
|
|
9048
|
+
finalizers: []
|
|
9049
|
+
}, {
|
|
9050
|
+
actor: connectionPrincipal,
|
|
9051
|
+
lawUsdz
|
|
9052
|
+
});
|
|
9053
|
+
return { ok: true, status: "pending", candidateHash, head };
|
|
9054
|
+
};
|
|
8898
9055
|
const _nomosRestorePreviousModel = async (domain, currentHash, opts = {}) => {
|
|
8899
9056
|
if (!connectionPrincipal) {
|
|
8900
9057
|
return {
|
|
@@ -9314,7 +9471,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
9314
9471
|
if (!verdict.ok) throw new KernelCoherenceError(verdict);
|
|
9315
9472
|
return verdict;
|
|
9316
9473
|
};
|
|
9317
|
-
const signWorkspaceOffer = async ({ target, domain, directiveId, payload, actor, authorSecret: signingSecret, authToken: targetToken, domainHash }) => {
|
|
9474
|
+
const signWorkspaceOffer = async ({ target, domain, directiveId, payload, actor, authorSecret: signingSecret, authToken: targetToken, domainHash, birthCertificate }) => {
|
|
9318
9475
|
if (!target || typeof target !== "string") throw new Error("cross-workspace offer requires a target workspace");
|
|
9319
9476
|
if (target === workspace) {
|
|
9320
9477
|
return offerDirective(domain, directiveId, payload, {
|
|
@@ -9322,7 +9479,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
9322
9479
|
signWith: signingSecret,
|
|
9323
9480
|
...targetToken ? { authTokenOverride: targetToken } : {},
|
|
9324
9481
|
returnSealed: true,
|
|
9325
|
-
...domainHash ? { domainHash } : {}
|
|
9482
|
+
...domainHash ? { domainHash } : {},
|
|
9483
|
+
...birthCertificate ? { birthCertificate } : {}
|
|
9326
9484
|
});
|
|
9327
9485
|
}
|
|
9328
9486
|
let targetHolon;
|
|
@@ -9362,7 +9520,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
9362
9520
|
payload,
|
|
9363
9521
|
actor,
|
|
9364
9522
|
authorSecret: signingSecret,
|
|
9365
|
-
...domainHash ? { domainHash } : {}
|
|
9523
|
+
...domainHash ? { domainHash } : {},
|
|
9524
|
+
...birthCertificate ? { birthCertificate } : {}
|
|
9366
9525
|
});
|
|
9367
9526
|
} finally {
|
|
9368
9527
|
if (temporary) {
|
|
@@ -10179,6 +10338,9 @@ ${String(commit).toLowerCase()}`;
|
|
|
10179
10338
|
correctMostRecent: (opts) => _correctMostRecent(opts.kind, opts),
|
|
10180
10339
|
/** Framework-private exact-history adoption seam consumed only by generated `model.adopt()`. */
|
|
10181
10340
|
__nomosAdoptModel: (domain, candidateHash, opts = {}) => _nomosAdoptModel(domain, candidateHash, opts),
|
|
10341
|
+
/** Framework-private generated parent-to-child model inheritance. */
|
|
10342
|
+
__nomosModelInstallation: (domain, candidateHash) => _nomosModelInstallation(domain, candidateHash),
|
|
10343
|
+
__nomosStageGeneratedModel: (domain, candidateHash, lawUsdz, dependencies) => _nomosStageGeneratedModel(domain, candidateHash, lawUsdz, dependencies),
|
|
10182
10344
|
/** Framework-private exact-history restoration seam consumed only by generated `model.restorePrevious()`. */
|
|
10183
10345
|
__nomosRestorePreviousModel: (domain, currentHash, opts = {}) => _nomosRestorePreviousModel(domain, currentHash, opts),
|
|
10184
10346
|
/**
|
|
@@ -10682,7 +10844,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
10682
10844
|
if (!publicKey || typeof publicKey !== "string") throw new Error("enrollDevice requires the device `publicKey` (base64 from mintDeviceKey)");
|
|
10683
10845
|
const keyHash = await sha256hexBytes(bytesUnb64(publicKey));
|
|
10684
10846
|
const p = canonicalPrincipal(principal2);
|
|
10685
|
-
const payload = {
|
|
10847
|
+
const payload = { keyHash, grantedBy: canonicalPrincipal(grantedBy || p), grantedAt: typeof grantedAt === "number" ? grantedAt : Date.now() };
|
|
10686
10848
|
return offerDirective("home", "enrollSigner", payload, { actor: p });
|
|
10687
10849
|
},
|
|
10688
10850
|
/**
|
|
@@ -10932,8 +11094,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
10932
11094
|
{ child: home, founder: owner, verified: true, parentKey: device.public, parentId: parent, epoch: 0 },
|
|
10933
11095
|
device.secret
|
|
10934
11096
|
);
|
|
10935
|
-
const
|
|
10936
|
-
const birthPayload = { owner, ownerKeyHash, frameworkHash, lawHash, bornAt, homeCert: JSON.stringify(homeCert) };
|
|
11097
|
+
const birthPayload = { owner, frameworkHash, lawHash, bornAt };
|
|
10937
11098
|
const sealedBirth = await signWorkspaceOffer({
|
|
10938
11099
|
target: parent,
|
|
10939
11100
|
domain: homeDomain,
|
|
@@ -10941,7 +11102,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
10941
11102
|
payload: birthPayload,
|
|
10942
11103
|
actor: owner,
|
|
10943
11104
|
authorSecret: device.secret,
|
|
10944
|
-
authToken: typeof at === "string" ? at : void 0
|
|
11105
|
+
authToken: typeof at === "string" ? at : void 0,
|
|
11106
|
+
birthCertificate: homeCert
|
|
10945
11107
|
});
|
|
10946
11108
|
const offerBody = await governanceOffers.postGovernanceOffer({
|
|
10947
11109
|
directiveId,
|
|
@@ -11337,6 +11499,23 @@ ${String(commit).toLowerCase()}`;
|
|
|
11337
11499
|
const intent = decodeIntentOfferBytes(intentBytes);
|
|
11338
11500
|
return offerDirective(intent.domain, intent.directiveId, intent.payload, { domainHash: intent.domainHash, actor: intent.actor });
|
|
11339
11501
|
},
|
|
11502
|
+
/** Replace an expired identity proof without remounting custody or losing watches. The caller is the
|
|
11503
|
+
* generated application runtime; tenant code never receives this seam. A refreshed token may prove only
|
|
11504
|
+
* the same signed-in subject that opened the workspace. */
|
|
11505
|
+
refreshAuthToken: (token) => {
|
|
11506
|
+
const next = typeof token === "string" ? token.trim() : "";
|
|
11507
|
+
if (!next) throw new Error("credential refresh returned an empty identity proof");
|
|
11508
|
+
const subjectClaim = jwtClaim(next, "sub");
|
|
11509
|
+
const nextSubject = canonicalPrincipal(
|
|
11510
|
+
typeof subjectClaim === "string" ? subjectClaim : ""
|
|
11511
|
+
);
|
|
11512
|
+
if (!nextSubject || nextSubject !== connectionPrincipal) {
|
|
11513
|
+
throw new Error("credential refresh changed the signed-in identity; reopen the application explicitly");
|
|
11514
|
+
}
|
|
11515
|
+
activeAuthToken = next;
|
|
11516
|
+
authHeaders = packAuthHeaders({ authToken: activeAuthToken, principal: connectionPrincipal });
|
|
11517
|
+
return { refreshed: true };
|
|
11518
|
+
},
|
|
11340
11519
|
/**
|
|
11341
11520
|
* THE ONE ENCODER as the public offer entrypoint. A generated client (TS or Dart-via-bridge) calls THIS
|
|
11342
11521
|
* with the planned payload + the verified `actor` — it NEVER re-encodes the v2 envelope itself. The bytes
|
|
@@ -11351,9 +11530,9 @@ ${String(commit).toLowerCase()}`;
|
|
|
11351
11530
|
// THIS offer with a key OTHER than the connect-time one (the sibling-birth / ensureParentSignerEnrollment
|
|
11352
11531
|
// recovery lanes ride this — the runner maps a bridge op's `authorSecret` onto `opts.signWith`). Dropping it
|
|
11353
11532
|
// here silently signed every per-offer-keyed write with the connect-time key (or nothing) — bug #9.
|
|
11354
|
-
offerDirective: (domain, directiveId, payload, opts = {}) => offerDirective(domain, directiveId, payload, { domainHash: opts.domainHash, actor: opts.actor, signWith: opts.signWith, lawUsdz: opts.lawUsdz, __nomosConflictSnapshots: opts.__nomosConflictSnapshots, returnCreated: opts.returnCreated !== false, force: opts.force === true }),
|
|
11533
|
+
offerDirective: (domain, directiveId, payload, opts = {}) => offerDirective(domain, directiveId, payload, { domainHash: opts.domainHash, actor: opts.actor, signWith: opts.signWith, lawUsdz: opts.lawUsdz, birthCertificate: opts.birthCertificate, __nomosConflictSnapshots: opts.__nomosConflictSnapshots, returnCreated: opts.returnCreated !== false, force: opts.force === true }),
|
|
11355
11534
|
// THE WRITE VERB, canonical name. `offerDirective` is the legacy alias; both encode via the one codec.
|
|
11356
|
-
offerIntent: (domain, directiveId, payload, opts = {}) => offerDirective(domain, directiveId, payload, { domainHash: opts.domainHash, actor: opts.actor, signWith: opts.signWith, lawUsdz: opts.lawUsdz, __nomosConflictSnapshots: opts.__nomosConflictSnapshots, returnCreated: opts.returnCreated !== false, force: opts.force === true }),
|
|
11535
|
+
offerIntent: (domain, directiveId, payload, opts = {}) => offerDirective(domain, directiveId, payload, { domainHash: opts.domainHash, actor: opts.actor, signWith: opts.signWith, lawUsdz: opts.lawUsdz, birthCertificate: opts.birthCertificate, __nomosConflictSnapshots: opts.__nomosConflictSnapshots, returnCreated: opts.returnCreated !== false, force: opts.force === true }),
|
|
11357
11536
|
/** HOLON-NATIVE ROUTING (routing by id): ask the holon which shard a write to `id` belongs on — the
|
|
11358
11537
|
* wasm decodes the id's route tag and resolves its folded shard map. Returns `{ ok, tag, shard }`
|
|
11359
11538
|
* (`shard:""` = a known-tag but unplaced home; `tag:null` = not a route-tagged id). The routed wrapper
|
|
@@ -11527,9 +11706,16 @@ ${String(commit).toLowerCase()}`;
|
|
|
11527
11706
|
try {
|
|
11528
11707
|
const rows = intentsAbove(snap.localHead, syncedBase);
|
|
11529
11708
|
const offers = rows.map((it) => ({ session: cid, oid: it.oid.slice(0, 10), changeB64: it.changeB64 }));
|
|
11530
|
-
const carriesAuxiliaryCustody = rows.some(
|
|
11531
|
-
|
|
11532
|
-
|
|
11709
|
+
const carriesAuxiliaryCustody = rows.some((it) => {
|
|
11710
|
+
switch (it.transportRequirement) {
|
|
11711
|
+
case IntentTransportRequirement.SEALED_CHANGE:
|
|
11712
|
+
return false;
|
|
11713
|
+
case IntentTransportRequirement.COMMIT_TREE:
|
|
11714
|
+
return true;
|
|
11715
|
+
case IntentTransportRequirement.UNSPECIFIED:
|
|
11716
|
+
throw new Error("kernel returned an intent without a transport requirement");
|
|
11717
|
+
}
|
|
11718
|
+
});
|
|
11533
11719
|
if (offers.length && carriesAuxiliaryCustody) {
|
|
11534
11720
|
if (!snap.localHead) throw new Error("lifecycle offer has no local candidate head");
|
|
11535
11721
|
const pushedCandidate = await pushCandidateCustody(snap.localHead, syncedBase);
|
|
@@ -11725,6 +11911,16 @@ ${String(commit).toLowerCase()}`;
|
|
|
11725
11911
|
result.stillAhead = await resolveBranchHead() !== syncedBase;
|
|
11726
11912
|
} catch {
|
|
11727
11913
|
}
|
|
11914
|
+
const admittedIntentIds = Array.from(new Set(
|
|
11915
|
+
(admission?.sessions || []).flatMap(
|
|
11916
|
+
(session) => [...session.admitted || [], ...session.skipped || []].map((entry) => typeof entry.intent === "string" ? entry.intent : "").filter(Boolean)
|
|
11917
|
+
)
|
|
11918
|
+
));
|
|
11919
|
+
if (admittedIntentIds.length) result.admittedIntentIds = admittedIntentIds;
|
|
11920
|
+
const convergenceDeferred = !!(result.converged && result.converged.deferred);
|
|
11921
|
+
if (admittedIntentIds.length && !convergenceDeferred && result.stillAhead !== true && result.offline !== true) {
|
|
11922
|
+
result.convergedIntentIds = admittedIntentIds;
|
|
11923
|
+
}
|
|
11728
11924
|
result.directOfferDeferred = directOfferDeferred;
|
|
11729
11925
|
if (pushError) {
|
|
11730
11926
|
result.pushError = pushError;
|
|
@@ -11899,6 +12095,15 @@ ${String(commit).toLowerCase()}`;
|
|
|
11899
12095
|
let t = null, retryTimer = null;
|
|
11900
12096
|
let lastOid = null, drains = 0, stopSub = null, reconnectBackoffMs = 500;
|
|
11901
12097
|
let _fireWindow = [];
|
|
12098
|
+
const scheduleTransportRetry = () => {
|
|
12099
|
+
if (retryTimer) clearTimeout(retryTimer);
|
|
12100
|
+
const waitMs = reconnectBackoffMs;
|
|
12101
|
+
reconnectBackoffMs = Math.min(reconnectBackoffMs * 2, 3e4);
|
|
12102
|
+
retryTimer = setTimeout(() => {
|
|
12103
|
+
retryTimer = null;
|
|
12104
|
+
fire("reconnect");
|
|
12105
|
+
}, waitMs);
|
|
12106
|
+
};
|
|
11902
12107
|
const announcePresence = async (reason = "heartbeat") => {
|
|
11903
12108
|
if (stopped || !stopSub || typeof stopSub.signal !== "function") return;
|
|
11904
12109
|
try {
|
|
@@ -11970,13 +12175,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
11970
12175
|
announcePresence(reason || "sync");
|
|
11971
12176
|
const transportDeferred = !!(r && (r.offline === true || r.pushFailed === true && r.pushError?.refused !== true));
|
|
11972
12177
|
if (transportDeferred) {
|
|
11973
|
-
|
|
11974
|
-
const waitMs = reconnectBackoffMs;
|
|
11975
|
-
reconnectBackoffMs = Math.min(reconnectBackoffMs * 2, 3e4);
|
|
11976
|
-
retryTimer = setTimeout(() => {
|
|
11977
|
-
retryTimer = null;
|
|
11978
|
-
fire("reconnect");
|
|
11979
|
-
}, waitMs);
|
|
12178
|
+
scheduleTransportRetry();
|
|
11980
12179
|
return;
|
|
11981
12180
|
}
|
|
11982
12181
|
reconnectBackoffMs = 500;
|
|
@@ -12007,6 +12206,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
12007
12206
|
}, (e) => {
|
|
12008
12207
|
if (stopped) return;
|
|
12009
12208
|
if (onError) onError(e, reason);
|
|
12209
|
+
if (remoteUnavailableAtConnect(e)) scheduleTransportRetry();
|
|
12010
12210
|
});
|
|
12011
12211
|
}, debounceMs);
|
|
12012
12212
|
};
|
|
@@ -12478,7 +12678,7 @@ async function nomosInternalOpenGeneratedChildApplication(parent, workspace, bin
|
|
|
12478
12678
|
const child = await context.open(workspace);
|
|
12479
12679
|
return bind(child);
|
|
12480
12680
|
}
|
|
12481
|
-
function generatedChildApplicationContext(root, onSync) {
|
|
12681
|
+
function generatedChildApplicationContext(root, onSync, onCredentialFailure, onStatus) {
|
|
12482
12682
|
const active = /* @__PURE__ */ new Map();
|
|
12483
12683
|
const context = {
|
|
12484
12684
|
open: async (workspace) => {
|
|
@@ -12488,11 +12688,18 @@ function generatedChildApplicationContext(root, onSync) {
|
|
|
12488
12688
|
const child = await root.__nomosOpenChild(workspace);
|
|
12489
12689
|
generatedChildApplicationContexts.set(child, context);
|
|
12490
12690
|
if (!active.has(child)) {
|
|
12491
|
-
|
|
12492
|
-
|
|
12493
|
-
|
|
12494
|
-
|
|
12495
|
-
|
|
12691
|
+
let stop = null;
|
|
12692
|
+
stop = child.autoSync({
|
|
12693
|
+
onResult: (result) => {
|
|
12694
|
+
if (syncNeedsCredentialRefresh(result)) onCredentialFailure?.(child, stop, result);
|
|
12695
|
+
else onSync(result);
|
|
12696
|
+
},
|
|
12697
|
+
onError: (error) => {
|
|
12698
|
+
if (syncNeedsCredentialRefresh(error)) onCredentialFailure?.(child, stop, error);
|
|
12699
|
+
},
|
|
12700
|
+
onStatus: (status) => onStatus?.(status)
|
|
12701
|
+
});
|
|
12702
|
+
active.set(child, stop);
|
|
12496
12703
|
}
|
|
12497
12704
|
return child;
|
|
12498
12705
|
},
|
|
@@ -12509,6 +12716,13 @@ function generatedChildApplicationContext(root, onSync) {
|
|
|
12509
12716
|
generatedChildApplicationContexts.set(root, context);
|
|
12510
12717
|
return context;
|
|
12511
12718
|
}
|
|
12719
|
+
function syncNeedsCredentialRefresh(value) {
|
|
12720
|
+
const record = typeof value === "object" && value !== null ? value : null;
|
|
12721
|
+
const push = record?.pushError && typeof record.pushError === "object" ? record.pushError : null;
|
|
12722
|
+
if (push?.status === 401 || push?.status === 403) return true;
|
|
12723
|
+
const text2 = `${record?.error ?? ""} ${push?.error ?? ""} ${push?.body ?? ""} ${String(value ?? "")}`.toLowerCase();
|
|
12724
|
+
return text2.includes("unauthenticated") || text2.includes("token expired") || text2.includes("invalid token");
|
|
12725
|
+
}
|
|
12512
12726
|
var utf8 = new TextEncoder();
|
|
12513
12727
|
var text = new TextDecoder();
|
|
12514
12728
|
function bytesToBase64(bytes) {
|
|
@@ -12717,6 +12931,30 @@ function applicationError(message, code, cause) {
|
|
|
12717
12931
|
if (cause !== void 0) error.cause = cause;
|
|
12718
12932
|
return error;
|
|
12719
12933
|
}
|
|
12934
|
+
async function ensureGeneratedModelCurrent(application, holon, generatedLawHash) {
|
|
12935
|
+
const status = await holon.lawStatus();
|
|
12936
|
+
if (status.installed.includes(generatedLawHash)) return;
|
|
12937
|
+
if (application.model?.adopt === void 0) {
|
|
12938
|
+
throw applicationError(
|
|
12939
|
+
"This generated application has no model lifecycle surface and cannot prove its plans are current.",
|
|
12940
|
+
"nomos.application.model_lifecycle_missing"
|
|
12941
|
+
);
|
|
12942
|
+
}
|
|
12943
|
+
const adoption = await application.model.adopt();
|
|
12944
|
+
if (adoption.status === "adopted") return;
|
|
12945
|
+
if (adoption.status === "needs-decision") {
|
|
12946
|
+
throw applicationError(
|
|
12947
|
+
"This application model changes prior business outcomes and needs an attributed migration decision before the app can write.",
|
|
12948
|
+
"nomos.application.model_decision_required",
|
|
12949
|
+
adoption
|
|
12950
|
+
);
|
|
12951
|
+
}
|
|
12952
|
+
throw applicationError(
|
|
12953
|
+
adoption.error?.trim() || adoption.summary || "Nomos could not prove and adopt this generated application model; the current model remains active.",
|
|
12954
|
+
"nomos.application.model_adoption_blocked",
|
|
12955
|
+
adoption
|
|
12956
|
+
);
|
|
12957
|
+
}
|
|
12720
12958
|
function statusFromSync(result, phase, message, locallyDurableRemoteDebt = 0) {
|
|
12721
12959
|
const admission = result?.admission;
|
|
12722
12960
|
const sessions = admission?.sessions ?? [];
|
|
@@ -12820,6 +13058,7 @@ async function nomosInternalOpenGeneratedApplication(options, bind, internals =
|
|
|
12820
13058
|
}
|
|
12821
13059
|
};
|
|
12822
13060
|
const applicationObject = bind(holon2, user);
|
|
13061
|
+
await ensureGeneratedModelCurrent(applicationObject, holon2, options.lawHash);
|
|
12823
13062
|
for (const name of Object.keys(lifecycle)) {
|
|
12824
13063
|
if (name in applicationObject) throw applicationError(`The business model declares '${name}', which is reserved by the generated application.`, "nomos.application.name_collision");
|
|
12825
13064
|
Object.defineProperty(applicationObject, name, { value: lifecycle[name], enumerable: true, configurable: false, writable: false });
|
|
@@ -12868,6 +13107,33 @@ async function nomosInternalOpenGeneratedApplication(options, bind, internals =
|
|
|
12868
13107
|
}
|
|
12869
13108
|
}
|
|
12870
13109
|
};
|
|
13110
|
+
const credentialRefreshes = /* @__PURE__ */ new WeakMap();
|
|
13111
|
+
const refreshCredential = (target, stop, failure) => {
|
|
13112
|
+
if (credentialRefreshes.has(target)) return;
|
|
13113
|
+
phase = "catching-up";
|
|
13114
|
+
lastMessage = "Refreshing the signed-in identity for continuous custody.";
|
|
13115
|
+
emit();
|
|
13116
|
+
const run = (async () => {
|
|
13117
|
+
try {
|
|
13118
|
+
const refreshed = (await options.signIn()).trim();
|
|
13119
|
+
if (!refreshed) throw new Error("sign in returned no refreshed credential");
|
|
13120
|
+
if (typeof target.refreshAuthToken !== "function") {
|
|
13121
|
+
throw new Error("the installed Nomos runtime cannot refresh credentials in place");
|
|
13122
|
+
}
|
|
13123
|
+
target.refreshAuthToken(refreshed);
|
|
13124
|
+
authToken = refreshed;
|
|
13125
|
+
lastMessage = null;
|
|
13126
|
+
stop?.trigger?.("credential-refresh");
|
|
13127
|
+
} catch (cause) {
|
|
13128
|
+
phase = "attention";
|
|
13129
|
+
lastMessage = `Nomos could not refresh the signed-in identity: ${String(cause || failure)}`;
|
|
13130
|
+
emit();
|
|
13131
|
+
} finally {
|
|
13132
|
+
credentialRefreshes.delete(target);
|
|
13133
|
+
}
|
|
13134
|
+
})();
|
|
13135
|
+
credentialRefreshes.set(target, run);
|
|
13136
|
+
};
|
|
12871
13137
|
const save = async () => {
|
|
12872
13138
|
if (saveRunning !== null) {
|
|
12873
13139
|
lifecycleTrace("save-coalesced", { requestedSave, completedSave });
|
|
@@ -13045,6 +13311,10 @@ async function nomosInternalOpenGeneratedApplication(options, bind, internals =
|
|
|
13045
13311
|
phase = "current";
|
|
13046
13312
|
autoSync = holon.autoSync({
|
|
13047
13313
|
onResult: (result) => {
|
|
13314
|
+
if (syncNeedsCredentialRefresh(result)) {
|
|
13315
|
+
refreshCredential(holon, autoSync, result);
|
|
13316
|
+
return;
|
|
13317
|
+
}
|
|
13048
13318
|
lifecycleTrace("remote-result");
|
|
13049
13319
|
lastResult = result;
|
|
13050
13320
|
locallyDurableRemoteDebt = 0;
|
|
@@ -13053,20 +13323,29 @@ async function nomosInternalOpenGeneratedApplication(options, bind, internals =
|
|
|
13053
13323
|
scheduleSave();
|
|
13054
13324
|
emit();
|
|
13055
13325
|
},
|
|
13326
|
+
onError: (error) => {
|
|
13327
|
+
if (syncNeedsCredentialRefresh(error)) refreshCredential(holon, autoSync, error);
|
|
13328
|
+
},
|
|
13056
13329
|
onStatus: (status) => {
|
|
13057
|
-
|
|
13058
|
-
|
|
13059
|
-
emit();
|
|
13060
|
-
}
|
|
13330
|
+
phase = status === "closed" ? "offline" : "catching-up";
|
|
13331
|
+
emit();
|
|
13061
13332
|
}
|
|
13062
13333
|
});
|
|
13063
|
-
const childApplications = generatedChildApplicationContext(
|
|
13064
|
-
|
|
13065
|
-
|
|
13066
|
-
|
|
13067
|
-
|
|
13068
|
-
|
|
13069
|
-
|
|
13334
|
+
const childApplications = generatedChildApplicationContext(
|
|
13335
|
+
holon,
|
|
13336
|
+
(result) => {
|
|
13337
|
+
lastResult = result;
|
|
13338
|
+
phase = "saving";
|
|
13339
|
+
lastMessage = null;
|
|
13340
|
+
scheduleSave();
|
|
13341
|
+
emit();
|
|
13342
|
+
},
|
|
13343
|
+
refreshCredential,
|
|
13344
|
+
(status) => {
|
|
13345
|
+
phase = status === "closed" ? "offline" : "catching-up";
|
|
13346
|
+
emit();
|
|
13347
|
+
}
|
|
13348
|
+
);
|
|
13070
13349
|
scheduleSave();
|
|
13071
13350
|
const interval = setInterval(scheduleSave, internals.saveIntervalMs ?? 45e3);
|
|
13072
13351
|
interval.unref?.();
|
|
@@ -13084,6 +13363,7 @@ async function nomosInternalOpenGeneratedApplication(options, bind, internals =
|
|
|
13084
13363
|
}
|
|
13085
13364
|
};
|
|
13086
13365
|
const applicationObject = bind(holon, user);
|
|
13366
|
+
await ensureGeneratedModelCurrent(applicationObject, holon, options.lawHash);
|
|
13087
13367
|
for (const name of Object.keys(lifecycle)) {
|
|
13088
13368
|
if (name in applicationObject) throw applicationError(`The business model declares '${name}', which is reserved by the generated application.`, "nomos.application.name_collision");
|
|
13089
13369
|
Object.defineProperty(applicationObject, name, { value: lifecycle[name], enumerable: true, configurable: false, writable: false });
|