@shipload/sdk 1.0.0-next.34 → 1.0.0-next.36
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/lib/shipload.d.ts +398 -51
- package/lib/shipload.js +1481 -400
- package/lib/shipload.js.map +1 -1
- package/lib/shipload.m.js +1442 -401
- package/lib/shipload.m.js.map +1 -1
- package/lib/testing.d.ts +101 -20
- package/lib/testing.js +201 -57
- package/lib/testing.js.map +1 -1
- package/lib/testing.m.js +201 -57
- package/lib/testing.m.js.map +1 -1
- package/package.json +1 -1
- package/src/capabilities/crafting.ts +2 -3
- package/src/capabilities/gathering.test.ts +16 -0
- package/src/capabilities/gathering.ts +8 -11
- package/src/contracts/server.ts +147 -29
- package/src/coordinates/address.ts +88 -0
- package/src/coordinates/constants.test.ts +15 -0
- package/src/coordinates/constants.ts +23 -0
- package/src/coordinates/index.ts +15 -0
- package/src/coordinates/memo.test.ts +47 -0
- package/src/coordinates/memo.ts +20 -0
- package/src/coordinates/permutation.ts +77 -0
- package/src/coordinates/regions.ts +48 -0
- package/src/coordinates/sectors.ts +115 -0
- package/src/data/capability-formulas.ts +0 -1
- package/src/data/entities.json +4 -4
- package/src/data/items.json +5 -5
- package/src/data/recipes.json +39 -65
- package/src/derivation/capabilities.test.ts +133 -0
- package/src/derivation/capabilities.ts +66 -14
- package/src/derivation/rollups.test.ts +55 -0
- package/src/derivation/rollups.ts +56 -0
- package/src/derivation/wormhole.ts +115 -0
- package/src/entities/makers.ts +30 -3
- package/src/errors.ts +2 -0
- package/src/index-module.ts +38 -2
- package/src/managers/actions.ts +79 -5
- package/src/managers/construction.ts +6 -4
- package/src/managers/context.ts +9 -0
- package/src/managers/coordinates.ts +14 -0
- package/src/managers/plot.ts +2 -4
- package/src/nft/description.ts +25 -6
- package/src/planner/index.ts +127 -0
- package/src/planner/planner.test.ts +319 -0
- package/src/resolution/resolve-item.ts +4 -1
- package/src/scheduling/availability.ts +1 -1
- package/src/scheduling/cancel.test.ts +348 -0
- package/src/scheduling/cancel.ts +209 -0
- package/src/scheduling/lanes.test.ts +249 -0
- package/src/scheduling/lanes.ts +140 -2
- package/src/scheduling/projection.ts +75 -16
- package/src/scheduling/schedule.ts +3 -1
- package/src/shipload.ts +5 -0
- package/src/testing/projection-parity.ts +26 -2
- package/src/travel/travel.ts +116 -105
- package/src/types/capabilities.ts +23 -6
- package/src/types/entity.ts +3 -3
- package/src/types.ts +2 -1
- package/src/utils/system.ts +11 -0
package/lib/shipload.js
CHANGED
|
@@ -448,7 +448,7 @@ var platform = /*#__PURE__*/Object.freeze({
|
|
|
448
448
|
Contract: Contract$1
|
|
449
449
|
});
|
|
450
450
|
|
|
451
|
-
const abiBlob = antelope.Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDisAQlhZGRtb2R1bGUABAllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgp0YXJnZXRfcmVmCmNhcmdvX3JlZj8IYWRkbmV4dXMAAwpuZXh1c19uYW1lBnN0cmluZwF4BWludDY0AXkFaW50NjQJYWRkb3JhY2xlAAEJb3JhY2xlX2lkBG5hbWUFYmxlbmQAAgJpZAZ1aW50NjQGaW5wdXRzDGNhcmdvX2l0ZW1bXQlidWlsZHBsb3QAAgpidWlsZGVyX2lkBnVpbnQ2NAdwbG90X2lkBnVpbnQ2NAZjYW5jZWwAAwJpZAZ1aW50NjQIbGFuZV9rZXkFdWludDgFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABQdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhxdWFudGl0eQZ1aW50MzIJZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcmVmAAQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10JZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcm93AAcCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdC3NlcXVlbmNlX2lkB3VpbnQ2ND8KY2FyZ29fdmlldwAGB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHF1YW50aXR5BnVpbnQzMgJpZAZ1aW50NjQJZW50aXR5X2lkB3VpbnQ2ND8JY2xhaW1fcm93AAEFb3duZXIEbmFtZQljbGFpbXBsb3QAAwpidWlsZGVyX2lkBnVpbnQ2NA50YXJnZXRfaXRlbV9pZAZ1aW50MTYGY29vcmRzC2Nvb3JkaW5hdGVzDGNsYWltc3RhcnRlcgABBW93bmVyBG5hbWUJY2xlYW5yc3ZwAAIFZXBvY2gGdWludDY0CG1heF9yb3dzBnVpbnQ2NApjbGVhcnRhYmxlAAMKdGFibGVfbmFtZQRuYW1lBXNjb3BlBW5hbWU/CG1heF9yb3dzB3VpbnQ2ND8GY29tbWl0AAMJb3JhY2xlX2lkBG5hbWUFZXBvY2gGdWludDY0BmNvbW1pdAtjaGVja3N1bTI1Ngpjb21taXRfcm93AAQCaWQGdWludDY0BWVwb2NoBnVpbnQ2NAlvcmFjbGVfaWQEbmFtZQZjb21taXQLY2hlY2tzdW0yNTYJY29uZmlnbG9nAAEGY29uZmlnC2dhbWVfY29uZmlnC2Nvb3JkaW5hdGVzAAMBeAVpbnQ2NAF5BWludDY0AXoHdWludDE2PwVjcmFmdAAFAmlkBnVpbnQ2NAlyZWNpcGVfaWQGdWludDE2CHF1YW50aXR5BnVpbnQzMgZpbnB1dHMMY2FyZ29faXRlbVtdBnRhcmdldAd1aW50NjQ/DWNyYWZ0ZXJfc3RhdHMAAgVzcGVlZAZ1aW50MTYFZHJhaW4GdWludDMyCGRlbW9saXNoAAEJZW50aXR5X2lkBnVpbnQ2NAZkZXBsb3kAAgJpZAZ1aW50NjQDcmVmCWNhcmdvX3JlZgpkZXNjZW50aXR5AAQHaXRlbV9pZAZ1aW50MTYKaHVsbF9zdGF0cwZ1aW50NjQMbW9kdWxlX2l0ZW1zCHVpbnQxNltdDG1vZHVsZV9zdGF0cwh1aW50NjRbXQZlbmFibGUAAQdlbmFibGVkBGJvb2wMZW5lcmd5X3N0YXRzAAIIY2FwYWNpdHkGdWludDMyCHJlY2hhcmdlBnVpbnQzMhRlbnRpdHlfY3VycmVudF9zdGF0ZQACC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzBmVuZXJneQZ1aW50MzIPZW50aXR5X2RlZmF1bHRzAAILd2FyZWhvdXNlX3oGdWludDE2C2NvbnRhaW5lcl96BnVpbnQxNgtlbnRpdHlfaW5mbwAVBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMHaXRlbV9pZAZ1aW50MTYJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb192aWV3W10HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQZlbmVyZ3kHdWludDMyPwhodWxsbWFzcwd1aW50MzI/CGNhcGFjaXR5B3VpbnQzMj8HZW5naW5lcw9tb3ZlbWVudF9zdGF0cz8Ed2FycAt3YXJwX3N0YXRzPwlnZW5lcmF0b3INZW5lcmd5X3N0YXRzPwhnYXRoZXJlcg9nYXRoZXJlcl9zdGF0cz8HbG9hZGVycw1sb2FkZXJfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/B2NyYWZ0ZXIOY3JhZnRlcl9zdGF0cz8FbGFuZXMGbGFuZVtdBWhvbGRzBmhvbGRbXQ1lbnRpdHlfbGF5b3V0AAIOZW50aXR5X2l0ZW1faWQGdWludDE2BXNsb3RzCnNsb3RfZGVmW10VZW50aXR5X2xheW91dHNfcmVzdWx0AAEIZW50aXRpZXMPZW50aXR5X2xheW91dFtdCmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKZW50aXR5X3JvdwAMAmlkBnVpbnQ2NAVvd25lcgRuYW1lBGtpbmQEbmFtZQdpdGVtX2lkBnVpbnQxNgRuYW1lBnN0cmluZwVzdGF0cwZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdBWxhbmVzBmxhbmVbXQVob2xkcwZob2xkW10OZW50aXR5X3NlcV9yb3cAAQduZXh0X2lkBnVpbnQ2NA5lbnRpdHlfc3VtbWFyeQAIBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMHaXNfaWRsZQRib29sDnJlc29sdmVkX2NvdW50BnVpbnQzMg1wZW5kaW5nX2NvdW50BnVpbnQzMhBlbnRpdHlfdGFza19pbmZvAAQJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lCnRhc2tfY291bnQFdWludDgQc2NoZWR1bGVfc3RhcnRlZAp0aW1lX3BvaW50D2VudGl0eWdyb3VwX3JvdwACAmlkBnVpbnQ2NAxwYXJ0aWNpcGFudHMMZW50aXR5X3JlZltdC2VudW1fbWVtYmVyAAIFdmFsdWUFdWludDgEbmFtZQZzdHJpbmcLZW51bV9yZXN1bHQAAQdtZW1iZXJzDWVudW1fbWVtYmVyW10JZXBvY2hfcm93AAQFZXBvY2gGdWludDY0Cm9yYWNsZV9pZHMGbmFtZVtdCXRocmVzaG9sZAV1aW50OARzZWVkC2NoZWNrc3VtMjU2DGZpeGNhcmdvbWFzcwABCWVudGl0eV9pZAZ1aW50NjQLZm9yY2VyZXZlYWwAAQVlcG9jaAZ1aW50NjQLZ2FtZV9jb25maWcAAwd2ZXJzaW9uBnVpbnQzMghkZWZhdWx0cw9lbnRpdHlfZGVmYXVsdHMFaXRlbXMKaXRlbV9kZWZbXQZnYXRoZXIABAlzb3VyY2VfaWQGdWludDY0DmRlc3RpbmF0aW9uX2lkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIOZ2F0aGVyZXJfc3RhdHMAAwV5aWVsZAZ1aW50MTYFZHJhaW4GdWludDMyBWRlcHRoBnVpbnQxNgxnZW5lc2lzZmxlZXQAAQhlbnRpdGllcwxlbnRpdHlfcm93W10JZ2V0Y29uZmlnAAAKZ2V0ZGVwb3NpdAACBW93bmVyBG5hbWUIYXNzZXRfaWQGdWludDY0C2dldGVsaWdpYmxlAAIGY29vcmRzC2Nvb3JkaW5hdGVzB3N0cmF0dW0GdWludDE2CWdldGVudGNscwAAC2dldGVudGl0aWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwlnZXRlbnRpdHkAAQllbnRpdHlfaWQGdWludDY0C2dldGl0ZW1kYXRhAAAKZ2V0aXRlbWlkcwAACGdldGl0ZW1zAAALZ2V0aXRlbXR5cGUAAQdpdGVtX2lkBnVpbnQxNgxnZXRpdGVtdHlwZXMAAAtnZXRraW5kbWV0YQAAC2dldGxvY2F0aW9uAAIBeAVpbnQ2NAF5BWludDY0CmdldGxvY2RhdGEAAgF4BWludDY0AXkFaW50NjQLZ2V0bW9kdHlwZXMAAApnZXRtb2R1bGVzAAAJZ2V0bmVhcmJ5AAIJZW50aXR5X2lkBnVpbnQ2NAhyZWNoYXJnZQRib29sCmdldG5mdGJhc2UAAApnZXRuZnRpbmZvAAAJZ2V0cGxheWVyAAEHYWNjb3VudARuYW1lDGdldHByb2pzdGF0ZQACCWVudGl0eV9pZAZ1aW50NjQKdGFza19jb3VudAZ1aW50OD8JZ2V0cmVjaXBlAAEOb3V0cHV0X2l0ZW1faWQGdWludDE2CmdldHJlY2lwZXMAAgtsb3dlcl9ib3VuZAZ1aW50MTYFbGltaXQFdWludDgKZ2V0cmVzY2F0cwAAC2dldHJlc2VydmVzAAIBeAVpbnQ2NAF5BWludDY0DGdldHJlc291cmNlcwAACGdldHNsb3RzAAAKZ2V0c3RyYXR1bQADAXgFaW50NjQBeQVpbnQ2NAdzdHJhdHVtBnVpbnQxNgxnZXRzdW1tYXJpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/C2dyb3VwdHJhdmVsAAQIZW50aXRpZXMMZW50aXR5X3JlZltdAXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sBGhhc2gAAQV2YWx1ZQZzdHJpbmcHaGFzaDUxMgABBXZhbHVlBnN0cmluZwxoYXVsZXJfc3RhdHMAAwhjYXBhY2l0eQV1aW50OAplZmZpY2llbmN5BnVpbnQxNgVkcmFpbgZ1aW50MzIEaG9sZAAFAmlkBnVpbnQ2NARraW5kBXVpbnQ4C2NvdW50ZXJwYXJ0CmVudGl0eV9yZWYFdW50aWwKdGltZV9wb2ludA1pbmNvbWluZ19tYXNzBnVpbnQzMgtpbXBvcnRjYXJnbwABA3JvdwljYXJnb19yb3cMaW1wb3J0ZW50aXR5AAEDcm93CmVudGl0eV9yb3cLaW1wb3J0Z3JvdXAAAQNyb3cPZW50aXR5Z3JvdXBfcm93DGltcG9ydHBsYXllcgABBW93bmVyBG5hbWUNaW1wb3J0cmVzZXJ2ZQACC2Vwb2NoX3Njb3BlBnVpbnQzMgNyb3cLcmVzZXJ2ZV9yb3cLaW1wb3J0c3RhdGUAAQNyb3cJc3RhdGVfcm93CGl0ZW1fZGVmAAUCaWQGdWludDE2BG1hc3MGdWludDMyBHR5cGUFdWludDgHc3VidHlwZQV1aW50OAR0aWVyBXVpbnQ4DGl0ZW1faWRfcGFpcgACAmlkBnVpbnQxNgRuYW1lBnN0cmluZw9pdGVtX2lkc19yZXN1bHQAAQVpdGVtcw5pdGVtX2lkX3BhaXJbXQ9pdGVtZGF0YV9yZXN1bHQAAgVpdGVtcwppdGVtX2RlZltdB3JlY2lwZXMOcmVjaXBlc19yZXN1bHQKaXRlbXNfaW5mbwABBWl0ZW1zCml0ZW1fZGVmW10Eam9pbgABB2FjY291bnQEbmFtZRBraW5kX21ldGFfcmVzdWx0AAIFa2luZHMPa2luZF9tZXRhX3Jvd1tdCXRlbXBsYXRlcxN0ZW1wbGF0ZV9tZXRhX3Jvd1tdDWtpbmRfbWV0YV9yb3cABQRraW5kBG5hbWUOY2xhc3NpZmljYXRpb24FdWludDgQY2FwYWJpbGl0eV9mbGFncwV1aW50OAd6X2Nvb3JkBnVpbnQzMg1kZWZhdWx0X2xhYmVsBnN0cmluZwRsYW5lAAIIbGFuZV9rZXkFdWludDgIc2NoZWR1bGUIc2NoZWR1bGUEbG9hZAADAmlkBnVpbnQ2NAdmcm9tX2lkBnVpbnQ2NAVpdGVtcwxjYXJnb19pdGVtW10MbG9hZGVyX3N0YXRzAAMEbWFzcwZ1aW50MzIGdGhydXN0BnVpbnQxNghxdWFudGl0eQV1aW50OBBsb2NhdGlvbl9kZXJpdmVkAAIMc3RhdGljX3Byb3BzD2xvY2F0aW9uX3N0YXRpYwRzaXplBnVpbnQxNg1sb2NhdGlvbl9pbmZvAAIGY29vcmRzC2Nvb3JkaW5hdGVzCWlzX3N5c3RlbQRib29sD2xvY2F0aW9uX3N0YXRpYwAFBmNvb3Jkcwtjb29yZGluYXRlcwR0eXBlDWxvY2F0aW9uX3R5cGUHc3VidHlwZQV1aW50OAVzZWVkMAV1aW50OAVzZWVkMQV1aW50OAxtb2R1bGVfZW50cnkAAgR0eXBlBXVpbnQ4CWluc3RhbGxlZA5wYWNrZWRfbW9kdWxlPwttb2R1bGVfaW5mbwAEAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgttb2R1bGVfdHlwZQV1aW50OAR0aWVyBXVpbnQ4Dm1vZHVsZXNfcmVzdWx0AAEHbW9kdWxlcw1tb2R1bGVfaW5mb1tdDm1vdmVtZW50X3N0YXRzAAIGdGhydXN0BnVpbnQzMgVkcmFpbgZ1aW50MzILbmVhcmJ5X2luZm8ABQpjYW5fdHJhdmVsBGJvb2wHY3VycmVudBRlbnRpdHlfY3VycmVudF9zdGF0ZQlwcm9qZWN0ZWQUZW50aXR5X2N1cnJlbnRfc3RhdGUKbWF4X2VuZXJneQZ1aW50MzIHc3lzdGVtcw9uZWFyYnlfc3lzdGVtW10NbmVhcmJ5X3N5c3RlbQAECGRpc3RhbmNlBnVpbnQ2NAtlbmVyZ3lfY29zdAZ1aW50NjQLZmxpZ2h0X3RpbWUGdWludDMyCGxvY2F0aW9uDWxvY2F0aW9uX2luZm8ObmZ0X2NhcmdvX2l0ZW0ABAdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhxdWFudGl0eQZ1aW50MzIQbmZ0X2l0ZW1fcGF5bG9hZAACBGl0ZW0ObmZ0X2NhcmdvX2l0ZW0IbG9jYXRpb24MY29vcmRpbmF0ZXM/Dm5mdF9zY2hlbWFfZGVmAAILc2NoZW1hX25hbWUEbmFtZQZmaWVsZHMOc2NoZW1hX2ZpZWxkW10QbmZ0X3RlbXBsYXRlX2RlZgADB2l0ZW1faWQGdWludDE2C3NjaGVtYV9uYW1lBG5hbWULdGVtcGxhdGVfaWQFaW50MzINbmZ0Y29uZmlnX3JvdwADB2l0ZW1faWQGdWludDE2C3RlbXBsYXRlX2lkBWludDMyC3NjaGVtYV9uYW1lBG5hbWUJbmZ0aW1ndXJsAAIEaXRlbQpjYXJnb19pdGVtCGxvY2F0aW9uDGNvb3JkaW5hdGVzPw5uZnRpbmZvX3Jlc3VsdAACB3NjaGVtYXMQbmZ0X3NjaGVtYV9kZWZbXQl0ZW1wbGF0ZXMSbmZ0X3RlbXBsYXRlX2RlZltdBm5vdGlmeQABBWV2ZW50CnRhc2tfZXZlbnQRb3JhY2xlX2NvbmZpZ19yb3cAAQl0aHJlc2hvbGQFdWludDgKb3JhY2xlX3JvdwABAmlkBG5hbWUNcGFja2VkX21vZHVsZQACB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NApwbGFjZWNhcmdvAAMFb3duZXIEbmFtZQdob3N0X2lkBnVpbnQ2NAhhc3NldF9pZAZ1aW50NjQLcGxhY2VlbnRpdHkAAwVvd25lcgRuYW1lCGFzc2V0X2lkBnVpbnQ2NA90YXJnZXRfbmV4dXNfaWQGdWludDY0C3BsYXllcl9pbmZvAAMFb3duZXIEbmFtZQlpc19wbGF5ZXIEYm9vbAxjb21wYW55X25hbWUGc3RyaW5nCnBsYXllcl9yb3cAAQVvd25lcgRuYW1lD3Byb2plY3RlZF9zdGF0ZQAOBW93bmVyBG5hbWULY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb192aWV3W10IaHVsbG1hc3MHdWludDMyPwhjYXBhY2l0eQd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/B2xvYWRlcnMNbG9hZGVyX3N0YXRzPwZoYXVsZXINaGF1bGVyX3N0YXRzPwdjcmFmdGVyDmNyYWZ0ZXJfc3RhdHM/CHJlY2hhcmdlAAECaWQGdWludDY0DHJlY2lwZV9pbnB1dAACB2l0ZW1faWQGdWludDE2CHF1YW50aXR5BnVpbnQzMhByZWNpcGVfaXRlbV9pbmZvAAICaWQGdWludDE2BG1hc3MGdWludDMyD3JlY2lwZV9yZXNwb25zZQAHDm91dHB1dF9pdGVtX2lkBnVpbnQxNgtvdXRwdXRfbWFzcwZ1aW50MzIGaW5wdXRzDnJlY2lwZV9pbnB1dFtdCnN0YXRfc2xvdHMUc3RhdF9zbG90X3Jlc3BvbnNlW10NYmxlbmRfd2VpZ2h0cwVieXRlcwtvdXRwdXRfaXRlbRByZWNpcGVfaXRlbV9pbmZvC2lucHV0X2l0ZW1zEnJlY2lwZV9pdGVtX2luZm9bXQ5yZWNpcGVzX3Jlc3VsdAABB3JlY2lwZXMRcmVjaXBlX3Jlc3BvbnNlW10McmVmcnNoZW50aXR5AAEJZW50aXR5X2lkBnVpbnQ2NAxyZW1vdmVvcmFjbGUAAQlvcmFjbGVfaWQEbmFtZQZyZW5hbWUAAgJpZAZ1aW50NjQEbmFtZQZzdHJpbmcLcmVzZXJ2ZV9yb3cABQJpZAZ1aW50NjQIY29vcmRfaWQGdWludDY0B3N0cmF0dW0GdWludDE2CXJlbWFpbmluZwZ1aW50MzIKbGFzdF9ibG9jaxRibG9ja190aW1lc3RhbXBfdHlwZQdyZXNvbHZlAAICaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CnJlc29sdmVhbGwAAQVvd25lcgRuYW1lEnJlc29sdmVhbGxfcmVzdWx0cwACB3NjYW5uZWQGdWludDMyCHJlc29sdmVkBnVpbnQzMg1yZXNvdXJjZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyCGNhdGVnb3J5BXVpbnQ4BHRpZXIFdWludDgOcmVzb3VyY2Vfc3RhdHMAAwVzdGF0MQZ1aW50MTYFc3RhdDIGdWludDE2BXN0YXQzBnVpbnQxNhByZXNvdXJjZXNfcmVzdWx0AAEJcmVzb3VyY2VzD3Jlc291cmNlX2luZm9bXQZyZXZlYWwAAwlvcmFjbGVfaWQEbmFtZQVlcG9jaAZ1aW50NjQGcmV2ZWFsC2NoZWNrc3VtMjU2CnJldmVhbF9yb3cABAJpZAZ1aW50NjQFZXBvY2gGdWludDY0CW9yYWNsZV9pZARuYW1lBnJldmVhbAtjaGVja3N1bTI1NghybW1vZHVsZQADCWVudGl0eV9pZAZ1aW50NjQMbW9kdWxlX2luZGV4BXVpbnQ4CnRhcmdldF9yZWYKY2FyZ29fcmVmPwhybW5mdGNmZwABB2l0ZW1faWQGdWludDE2CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwlzZXRuZnRjZmcAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lDHNldHRocmVzaG9sZAABCXRocmVzaG9sZAV1aW50OAtzZXR3cmFwY29zdAADCWl0ZW1fdHlwZQV1aW50OAR0aWVyBXVpbnQ4BmFtb3VudAZ1aW50NjQKc2V0d3JhcGZlZQACB2ZlZV9wY3QGdWludDE2C2ZlZV9hY2NvdW50BG5hbWUIc2xvdF9kZWYAAgR0eXBlBXVpbnQ4Cm91dHB1dF9wY3QGdWludDE2EnN0YXRfc2xvdF9yZXNwb25zZQABB3NvdXJjZXMNc3RhdF9zb3VyY2VbXQtzdGF0X3NvdXJjZQACC2lucHV0X2luZGV4BXVpbnQ4EGlucHV0X3N0YXRfaW5kZXgFdWludDgJc3RhdGVfcm93AAMHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2CXN0b3djYXJnbwAFBW93bmVyBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhuZXh1c19pZAZ1aW50NjQIY2FyZ29faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NApzdG93ZW50aXR5AAMFb3duZXIEbmFtZQllbnRpdHlfaWQGdWludDY0CG5leHVzX2lkBnVpbnQ2NAxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABQdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzILcmVzZXJ2ZV9tYXgGdWludDMyEXN0cmF0dW1fcmVtYWluaW5nAAMHc3RyYXR1bQZ1aW50MTYJcmVtYWluaW5nBnVpbnQzMgpsYXN0X2Jsb2NrFGJsb2NrX3RpbWVzdGFtcF90eXBlCnN3YXBtb2R1bGUAAwllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgR0YXNrAAkEdHlwZQV1aW50OAhkdXJhdGlvbgZ1aW50MzIKY2FuY2VsYWJsZQV1aW50OAtjb29yZGluYXRlcwxjb29yZGluYXRlcz8FY2FyZ28MY2FyZ29faXRlbVtdDGVudGl0eXRhcmdldAtlbnRpdHlfcmVmPwtlbnRpdHlncm91cAd1aW50NjQ/C2VuZXJneV9jb3N0B3VpbnQzMj8EaG9sZAd1aW50NjQ/CnRhc2tfZXZlbnQACgpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDMyPwhsYW5lX2tleQV1aW50OAx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10RdGVtcGxhdGVfbWV0YV9yb3cAAwdpdGVtX2lkBnVpbnQxNgRraW5kBG5hbWUNZGlzcGxheV9sYWJlbAZzdHJpbmcGdHJhdmVsAAQCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sCXR5cGVzX3JvdwAFAmlkBnVpbnQ2NBNlbnRpdHlfc3VtbWFyeV90eXBlDmVudGl0eV9zdW1tYXJ5EGdhbWVfY29uZmlnX3R5cGULZ2FtZV9jb25maWcWc3RyYXR1bV9yZW1haW5pbmdfdHlwZRFzdHJhdHVtX3JlbWFpbmluZxVuZnRfaXRlbV9wYXlsb2FkX3R5cGUQbmZ0X2l0ZW1fcGF5bG9hZAh1bmRlcGxveQACB2hvc3RfaWQGdWludDY0CXRhcmdldF9pZAZ1aW50NjQGdW5sb2FkAAMCaWQGdWludDY0BXRvX2lkBnVpbnQ2NAVpdGVtcwxjYXJnb19pdGVtW10Ed2FycAADAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQKd2FycF9zdGF0cwABBXJhbmdlBnVpbnQzMgR3aXBlAAAOd3JhcGNvbmZpZ19yb3cAAgdmZWVfcGN0BnVpbnQxNgtmZWVfYWNjb3VudARuYW1lDHdyYXBjb3N0X3JvdwADCWl0ZW1fdHlwZQV1aW50OAR0aWVyBXVpbnQ4BmFtb3VudAZ1aW50NjRWAABQUScqUzIJYWRkbW9kdWxlxwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbW9kdWxlCnN1bW1hcnk6ICdJbnN0YWxsIGEgbW9kdWxlIGludG8gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YWxsIGEgbW9kdWxlIGZyb20gY2FyZ28gaW50byBhIG1vZHVsZSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSB0eXBlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgc2xvdCB0eXBlLiBUaGUgbW9kdWxlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIGNhcmdvIHVwb24gaW5zdGFsbGF0aW9uLgAAAFh3NVMyCGFkZG5leHVzpwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbmV4dXMKc3VtbWFyeTogJ0FkZCBhIG5leHVzIGxvY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDcmVhdGUgYSBuZXcgbmV4dXMgZW50aXR5IGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy4gTmV4dXNlcyBhcmUgb3duZWQgYnkgdGhlIGNvbnRyYWN0IGFuZCBzZXJ2ZSBhcyBmaXhlZCBnYXRoZXJpbmcgcG9pbnRzIHdoZXJlIHBsYXllcnMgY2FuIHdyYXAsIHVud3JhcCwgZGVwbG95LCBhbmQgb3RoZXJ3aXNlIGludGVyYWN0IHdpdGggTkZULWJhY2tlZCBhc3NldHMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAFARmUtTMglhZGRvcmFjbGUAAAAAAIA0VTwFYmxlbmT8Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBibGVuZApzdW1tYXJ5OiAnQmxlbmQgY2FyZ28gc3RhY2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDb21iaW5lIG11bHRpcGxlIGNhcmdvIHN0YWNrcyBvZiB0aGUgc2FtZSBpdGVtIHR5cGUgaW50byBhIHNpbmdsZSBzdGFjayB3aXRoIG5ldyBibGVuZGVkIHN0YXRzLiBBbGwgaW5wdXQgc3RhY2tzIG11c3Qgc2hhcmUgdGhlIHNhbWUgaXRlbSBpZC4gVGhlIG91dHB1dCBzdGFjayBoYXMgdGhlIGNvbWJpbmVkIHF1YW50aXR5IG9mIGFsbCBpbnB1dHMuAADINNYUnT4JYnVpbGRwbG90AAAAAABEhaZBBmNhbmNlbMICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNhbmNlbApzdW1tYXJ5OiAnQ2FuY2VsIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FuY2VsIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRhc2tzIGZyb20gdGhlIGVuZCBvZiBhbiBlbnRpdHkncyBzY2hlZHVsZS4gVGFza3MgdGhhdCBhcmUgaW1tdXRhYmxlIGFuZCBpbiBwcm9ncmVzcyBjYW5ub3QgYmUgY2FuY2VsbGVkLgAAyDRW6UxECWNsYWltcGxvdABwVb4mY+lMRAxjbGFpbXN0YXJ0ZXIAAACoG99pVEQJY2xlYW5yc3Zw7AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYW5yc3ZwCnN1bW1hcnk6ICdDbGVhbiB1cCBwYXN0IGVwb2NoIHJlc2VydmVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFcmFzZSByZXNlcnZlIHRhYmxlIHJvd3MgZnJvbSBhIHBhc3QgZXBvY2guIENhbm5vdCBjbGVhbiB0aGUgY3VycmVudCBvciBmdXR1cmUgZXBvY2hzLiBUaGUgbWF4X3Jvd3MgcGFyYW1ldGVyIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIGVyYXNlZCBwZXIgY2FsbCB0byBsaW1pdCBDUFUgdXNhZ2UuAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdOwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4AAGA0MrcmRQljb25maWdsb2fdAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjb25maWdsb2cKc3VtbWFyeTogJ0xvZyBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IGxvZ3MgdGhlIGN1cnJlbnQgZ2FtZSBjb25maWd1cmF0aW9uLiBDYWxsZWQgaW5saW5lIGFmdGVyIGluaXRpYWxpemF0aW9uIHRvIGJyb2FkY2FzdCBjb25maWcgdmlhIGFjdGlvbiB0cmFjZXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAgLzMRQVjcmFmdMgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNyYWZ0CnN1bW1hcnk6ICdDcmFmdCBpdGVtcyBmcm9tIGEgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2Zvcm0gY2FyZ28gaXRlbXMgaW50byBhIG5ldyBpdGVtIHVzaW5nIGEgcmVjaXBlLiBUaGUgZW50aXR5IG11c3QgaGF2ZSBhIGNyYWZ0ZXIgbW9kdWxlIGluc3RhbGxlZC4gQ29uc3VtZXMgZW5lcmd5IGFuZCBzY2hlZHVsZXMgYSBjcmFmdGluZyB0YXNrIHdpdGggZHVyYXRpb24gYmFzZWQgb24gdG90YWwgaW5wdXQgbWFzcyBhbmQgY3JhZnRlciBzcGVlZC4gSW5wdXQgcXVhbnRpdGllcyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2lwZSByZXF1aXJlbWVudHMuAAAADbtIpUoIZGVtb2xpc2jxAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBkZW1vbGlzaApzdW1tYXJ5OiAnRGVtb2xpc2ggYSBzdGF0aW9uYXJ5IGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRGVjb21taXNzaW9uIGFuIGVudGl0eSwgZXJhc2luZyBpdCBmcm9tIHRoZSBnYW1lLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSwgaGF2ZSBlbXB0eSBjYXJnbywgYW5kIGhhdmUgbm8gaW5zdGFsbGVkIG1vZHVsZXMgKHJlbW92ZSBlYWNoIHZpYSBybW1vZHVsZSBmaXJzdCkuIFNjaGVkdWxlcyBhIGRlbW9saXNoIHRhc2sgdGhhdCBlcmFzZXMgdGhlIGVudGl0eSBvbiByZXNvbHV0aW9uLiBPbmx5IHZhbGlkIGZvciBlbnRpdGllcyB0aGF0IGNhbm5vdCBtb3ZlOyB1c2UgdW5kZXBsb3kgb3Igd3JhcGVudGl0eSBmb3IgdGhlIHJlc3QuAAAAAHgaq0oGZGVwbG957AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVwbG95CnN1bW1hcnk6ICdEZXBsb3kgYSBwYWNrZWQgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpVbnBhY2sgYSBwYWNrZWQgZW50aXR5IGl0ZW0gKHBhY2tlZCBzaGlwIG9yIHBhY2tlZCBjb250YWluZXIpIGZyb20gY2FyZ28sIHNjaGVkdWxpbmcgYSBkZXBsb3kgdGFzayB0aGF0IGNyZWF0ZXMgdGhlIG5ldyBlbnRpdHkgYXQgdGhlIGRlcGxveWluZyBlbnRpdHkncyBsb2NhdGlvbiB1cG9uIHJlc29sdXRpb24uAIDPLk+FsEoKZGVzY2VudGl0eckDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlc2NlbnRpdHkKc3VtbWFyeTogJ0Rlc2NyaWJlIGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIGEgcGFja2VkIGVudGl0eSwgZGVyaXZlZCBmcm9tIHRoZSBlbnRpdHkgaXRlbSBpZCwgaHVsbCBzdGF0cywgYW5kIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBtb2R1bGUgaXRlbSBpZHMgYW5kIHN0YXRzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBORlQgcmVuZGVyZXJzIHRvIGRpc3BsYXkgcGFja2VkIGVudGl0aWVzLgAAAACoeMxUBmVuYWJsZd0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC6AsZGUXYO6WwxmaXhjYXJnb21hc3OQAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBmaXhjYXJnb21hc3MKc3VtbWFyeTogJ0RFQlVHOiByZWNvbXB1dGUgZW50aXR5IGNhcmdvIG1hc3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlY29tcHV0ZSBhbmQgcmV3cml0ZSBhbiBlbnRpdHkncyBjYXJnbyBtYXNzIGZyb20gaXRzIGN1cnJlbnQgY2FyZ28uIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4gQXZhaWxhYmxlIGZvciByZXBhaXJpbmcgZHJpZnQgYmV0d2VlbiBjYWNoZWQgY2FyZ28gbWFzcyBhbmQgdGhlIHRydWUgbWFzcyBkZXJpdmVkIGZyb20gY2FyZ28gcm93cy4AolFbXYUuXQtmb3JjZXJldmVhbL4ELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGZvcmNlcmV2ZWFsCnN1bW1hcnk6ICdERUJVRzogZm9yY2UtZmluYWxpemUgYW4gZXBvY2ggZnJvbSBleGlzdGluZyByZXZlYWxzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpGaW5hbGl6ZSBhIHN0dWNrIGVwb2NoIGJ5IGNvbXB1dGluZyBpdHMgc2VlZCBmcm9tIHRoZSByZXZlYWxzIGFscmVhZHkgc3VibWl0dGVkLCB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LiBUaGUgc2VlZCBpcyBkZXJpdmVkIHNvbGVseSBmcm9tIHRoZSBwcmUtaW1hZ2UtbG9ja2VkIHJldmVhbHMgYWxyZWFkeSBvbiBjaGFpbjsgbm8gYWRtaW4tc3VwcGxpZWQgZW50cm9weSBpcyBpbnRyb2R1Y2VkLiBVc2VkIHRvIHVuYmxvY2sgZXBvY2ggcHJvZ3Jlc3Npb24gd2hlbiB0aGUgdGhyZXNob2xkIGNhbm5vdCBvdGhlcndpc2UgYmUgbWV0LgAAAABc1bJhBmdhdGhlcpcDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdhdGhlcgpzdW1tYXJ5OiAnR2F0aGVyIHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKR2F0aGVyIHJlc291cmNlcyBhdCB0aGUgc2hpcCdzIGN1cnJlbnQgbG9jYXRpb24uIE9ubHkgd29ya3MgYXQgZ2F0aGVyYWJsZSBsb2NhdGlvbiB0eXBlcy4gU2NoZWR1bGVzIGEgZ2F0aGVyIHRhc2sgdGhhdCBjb25zdW1lcyBlbmVyZ3kgYW5kIHlpZWxkcyBjYXJnbyBiYXNlZCBvbiB0aGUgc2hpcCdzIGdhdGhlcmVyIHN0YXRzIGFuZCB0aGUgbG9jYXRpb24ncyByZXNvdXJjZSBjb21wb3NpdGlvbi6QlYoLO6ymYgxnZW5lc2lzZmxlZXSpBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZW5lc2lzZmxlZXQKc3VtbWFyeTogJ01pbnQgdGhlIG9uZS10aW1lIGdlbmVzaXMgZmxlZXQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVtcGxhY2UgdGhlIG9uZS10aW1lIGdlbmVzaXMgZmxlZXQ6IGEgY2FsbGVyLXN1cHBsaWVkIHNldCBvZiBlbnRpdGllcyAoc2hpcHMsIHN0cnVjdHVyZXMsIGFuZCBjb250YWluZXJzKSB3cml0dGVuIHRvIHRoZSB3b3JsZCBhcy1pcy4gVmFsaWQgb25seSBkdXJpbmcgdGhlIHByZS1nZW5lc2lzIHdpbmRvdywgYmVmb3JlIGVwb2NoIDEgaXMgZmluYWxpemVkLiBUaGUgc3VwcGxpZWQgZW50aXR5IGlkcyBhcmUgaG9ub3JlZCBhbmQgdGhlIGlkIHNlcXVlbmNlIGlzIGFkdmFuY2VkIHBhc3QgdGhlbTsgaWQgMCBpcyByZXNlcnZlZCBmb3IgdGhlIEdlbmVzaXMgTmV4dXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAGBuTYqyYglnZXRjb25maWfKAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRjb25maWcKc3VtbWFyeTogJ0dldCBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgdGhlIGdhbWUgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgZGVmYXVsdCBlbnRpdHkgc3RhdHMgZm9yIHdhcmVob3VzZXMgYW5kIGNvbnRhaW5lcnMsIGFuZCB0aGUgZnVsbCBpdGVtIGRlZmluaXRpb25zIHRhYmxlLgBAdphWlbJiCmdldGRlcG9zaXQAAFQ8jrmosmILZ2V0ZWxpZ2libGXIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbGlnaWJsZQpzdW1tYXJ5OiAnR2V0IGVsaWdpYmxlIHJlc291cmNlIGl0ZW0gSURzIGF0IGEgbG9jYXRpb24gYW5kIHN0cmF0dW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBsaXN0IG9mIHJlc291cmNlIGl0ZW0gSURzIGVsaWdpYmxlIHRvIGJlIGdhdGhlcmVkIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcyBhbmQgc3RyYXR1bSBkZXB0aC4gSXRlbXMgYXJlIGdhdGVkIGJ5IGJvdGggdGhlIGxvY2F0aW9uJ3MgcmVzb3VyY2UgcHJvZmlsZSBhbmQgdGhlIGRlcHRoIHRocmVzaG9sZCBmb3IgZWFjaCB0aWVyLgAAwBHlqbJiCWdldGVudGNsc4wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGNscwpzdW1tYXJ5OiAnR2V0IGVudGl0eSBjbGFzcyBlbnVtIHZhbHVlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgc2V0IG9mIGVudGl0eSBjbGFzcyBlbnVtIHZhbHVlcyBhbmQgdGhlaXIgc3RyaW5nIG5hbWVzIChPcmJpdGFsVmVzc2VsLCBQbGFuZXRhcnlTdHJ1Y3R1cmUpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBlbnRpdHkgY2xhc3MgaWRlbnRpZmllcnMuALBy2eWpsmILZ2V0ZW50aXRpZXOkAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbnRpdGllcwpzdW1tYXJ5OiAnR2V0IGFsbCBlbnRpdGllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgZnVsbCBlbnRpdHkgaW5mbyBmb3IgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4AAPDZ5amyYglnZXRlbnRpdHmiAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbnRpdHkKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4gZW50aXR5IGluY2x1ZGluZyBpZGVudGl0eSwgY2FyZ28sIHNjaGVkdWxlIHN0YXRlLCBhbmQgdHlwZS1zcGVjaWZpYyBmaWVsZHMuAEw2SarssmILZ2V0aXRlbWRhdGGoAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtZGF0YQpzdW1tYXJ5OiAnR2V0IGZ1bGwgaXRlbSBjYXRhbG9nJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgY29tcGxldGUgaXRlbSBjYXRhbG9nIGFzIHRoZSBjb250cmFjdCBzZWVzIGl0LCBpbmNsdWRpbmcgdHlwZSwgc3VidHlwZSwgdGllciwgbWFzcywgYW5kIG90aGVyIHN0YXRpYyBtZXRhZGF0YS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgY2xpZW50cyB0byBtaXJyb3IgdGhlIGNvbnRyYWN0J3MgaXRlbSBkZWZpbml0aW9ucy4AAE5OquyyYgpnZXRpdGVtaWRzhgMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbWlkcwpzdW1tYXJ5OiAnR2V0IGl0ZW0gaWQgdG8gbmFtZSBtYXBwaW5ncycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgbWFwcGluZyBvZiBpdGVtIGlkIGNvbnN0YW50cyB0byB0aGVpciBjYW5vbmljYWwgc3RyaW5nIG5hbWVzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHJlc29sdmUgbnVtZXJpYyBpdGVtIGlkcyB0byBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVycy4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuAFT1WarssmILZ2V0aXRlbXR5cGUAgFX1WarssmIMZ2V0aXRlbXR5cGVziAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXR5cGVzCnN1bW1hcnk6ICdHZXQgaXRlbSB0eXBlIGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgaXRlbSB0eXBlIGVudW0gdmFsdWVzIGFuZCB0aGVpciBzdHJpbmcgbmFtZXMgKHJlc291cmNlLCBjb21wb25lbnQsIG1vZHVsZSwgZW50aXR5KS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgaXRlbSB0eXBlIGlkZW50aWZpZXJzLgBMVjJNB7NiC2dldGtpbmRtZXRh+AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0a2luZG1ldGEKc3VtbWFyeTogJ0dldCBlbnRpdHkga2luZCBtZXRhZGF0YScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGVudGl0eSBraW5kIHJlZ2lzdHJ5IGFuZCB0ZW1wbGF0ZSByZWdpc3RyeSwgaW5jbHVkaW5nIGVhY2gga2luZCdzIGNsYXNzaWZpY2F0aW9uLCBjYXBhYmlsaXR5IGZsYWdzLCBaLWNvb3JkaW5hdGUsIGFuZCBkZWZhdWx0IGxhYmVsLCBwbHVzIHRoZSBtYXBwaW5nIG9mIGVudGl0eSBpdGVtIGlkcyB0byBraW5kcyB3aXRoIGRpc3BsYXkgbGFiZWxzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGludGVycHJldCBlbnRpdHkga2luZHMgYW5kIGNhcGFiaWxpdGllcy4AJnXZIBqzYgtnZXRsb2NhdGlvbuICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2F0aW9uCnN1bW1hcnk6ICdHZXQgbG9jYXRpb24gaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2NhdGlvbiBpbmNsdWRpbmcgd2hldGhlciBhIHN5c3RlbSBleGlzdHMsIGFuZCBmb3IgZWFjaCBpdGVtOiBwcmljZSwgc3VwcGx5LCByYXJpdHkgbXVsdGlwbGllciwgYW5kIGxvY2F0aW9uIG11bHRpcGxpZXIuAIDJJiEas2IKZ2V0bG9jZGF0Yf4CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2RhdGEKc3VtbWFyeTogJ0dldCBkZXJpdmVkIGxvY2F0aW9uIGRhdGEnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgZGVyaXZlZCBsb2NhdGlvbiBkYXRhIGluY2x1ZGluZyBzdGF0aWMgcHJvcGVydGllcyAodHlwZSwgZGlmZmljdWx0eSwgc2VlZHMpIGZyb20gdGhlIGdhbWUgc2VlZCBhbmQgZXBvY2gtc3BlY2lmaWMgcHJvcGVydGllcyAoYWN0aXZlLCBzZWVkcykgZnJvbSB0aGUgY3VycmVudCBlcG9jaCBzZWVkLgCwqj4nKrNiC2dldG1vZHR5cGVz1gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bW9kdHlwZXMKc3VtbWFyeTogJ0dldCBtb2R1bGUgdHlwZSBlbnVtIHZhbHVlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgc2V0IG9mIG1vZHVsZSB0eXBlIGVudW0gdmFsdWVzIGFuZCB0aGVpciBzdHJpbmcgbmFtZXMgKGFueSwgZW5naW5lLCBnZW5lcmF0b3IsIGdhdGhlcmVyLCBsb2FkZXIsIHdhcnAsIGNyYWZ0ZXIsIGxhdW5jaGVyLCBzdG9yYWdlLCBoYXVsZXIpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBtb2R1bGUgc3VidHlwZSBpZGVudGlmaWVycyBhbmQgc2xvdCBjb21wYXRpYmlsaXR5LgAAVlEnKrNiCmdldG1vZHVsZXOAAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRtb2R1bGVzCnN1bW1hcnk6ICdHZXQgYWxsIG1vZHVsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIG1vZHVsZXMsIGluY2x1ZGluZyBlYWNoIG1vZHVsZSdzIGlkLCBtYXNzLCBzdWJ0eXBlLCBhbmQgdGllci4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBlbnVtZXJhdGUgaW5zdGFsbGFibGUgZXF1aXBtZW50LgAA8OcaNbNiCWdldG5lYXJied4DLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5lYXJieQpzdW1tYXJ5OiAnR2V0IG5lYXJieSByZWFjaGFibGUgc3lzdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBuZWFyYnkgc3lzdGVtcyByZWFjaGFibGUgYnkgYW4gZW50aXR5IGZyb20gaXRzIHByb2plY3RlZCBsb2NhdGlvbi4gUmV0dXJucyBjdXJyZW50IHN0YXRlICh3aXRoIGNvbXBsZXRlZCB0YXNrcyByZXNvbHZlZCksIHByb2plY3RlZCBzdGF0ZSAoYWZ0ZXIgYWxsIHNjaGVkdWxlZCB0YXNrcyksIGFuZCBhIGxpc3Qgb2YgcmVhY2hhYmxlIHN5c3RlbXMgd2l0aCBkaXN0YW5jZSwgZW5lcmd5IGNvc3QsIGZsaWdodCB0aW1lLCBhbmQgbWFya2V0IGluZm9ybWF0aW9uLgCAwubkNbNiCmdldG5mdGJhc2UAAABd0+U1s2IKZ2V0bmZ0aW5mb/ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5mdGluZm8Kc3VtbWFyeTogJ0dldCBORlQgc2NoZW1hIGFuZCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgQXRvbWljQXNzZXRzIHNjaGVtYXMgYW5kIHRlbXBsYXRlcyB0aGUgZ2FtZSBjb250cmFjdCBleHBlY3RzLCBwbHVzIHRoZSBjdXJyZW50IGBpdGVtX2lkIOKGkiAodGVtcGxhdGVfaWQsIHNjaGVtYV9uYW1lKWAgbWFwcGluZyBzdG9yZWQgaW4gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHN5bmMgYXRvbWljYXNzZXRzIHN0YXRlIHdpdGggdGhlIGNvbnRyYWN0LgAAuMqbWLNiCWdldHBsYXllcv0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHBsYXllcgpzdW1tYXJ5OiAnR2V0IHBsYXllciBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBsYXllciBpbmNsdWRpbmcgYmFsYW5jZSwgZGVidCwgbmV0d29ydGgsIGVudGl0eSBjb3VudHMsIGFuZCBwcmljaW5nIGZvciBuZXh0IHB1cmNoYXNlcy4gUmV0dXJucyBpc19wbGF5ZXI9ZmFsc2UgaWYgdGhlIGFjY291bnQgaGFzIG5vdCBqb2luZWQgdGhlIGdhbWUuoLLJ+NFbs2IMZ2V0cHJvanN0YXRlywMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cHJvanN0YXRlCnN1bW1hcnk6ICdHZXQgcHJvamVjdGVkIGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHByb2plY3RlZCBzdGF0ZSBvZiBhbiBlbnRpdHkgYWZ0ZXIgYXBwbHlpbmcgdGhlIG5leHQgdGFza19jb3VudCBzY2hlZHVsZWQgdGFza3MgKG9yIGFsbCB0YXNrcyBpZiB0YXNrX2NvdW50IGlzIG9taXR0ZWQpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHByZXZpZXcgdGhlIHJlc3VsdCBvZiBhbiBlbnRpdHkncyBzY2hlZHVsZSB3aXRob3V0IHJlc29sdmluZyBvbi1jaGFpbi4AAFDVIXWzYglnZXRyZWNpcGWmAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZWNpcGUKc3VtbWFyeTogJ0dldCBhIHNpbmdsZSBjcmFmdGluZyByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSByZWNpcGUgd2hvc2Ugb3V0cHV0IG1hdGNoZXMgdGhlIGdpdmVuIGl0ZW0gaWQsIGluY2x1ZGluZyBpdHMgaW5wdXRzLCBibGVuZCB3ZWlnaHRzLCBzdGF0IHNsb3RzLCBhbmQgcmVzb2x2ZWQgaXRlbSBtYXNzIGluZm8uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGlzcGxheSBjcmFmdGluZyByZXF1aXJlbWVudHMuAABW1SF1s2IKZ2V0cmVjaXBlc6wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4AAM4GYXWzYgpnZXRyZXNjYXRzngMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzY2F0cwpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIGNhdGVnb3J5IGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAob3JlLCBnYXMsIHJlZ29saXRoLCBiaW9tYXNzLCBjcnlzdGFsKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgcmVzb3VyY2Ugc3VidHlwZSBpZGVudGlmaWVycy4AsNpXYXWzYgtnZXRyZXNlcnZlc/wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc2VydmVzCnN1bW1hcnk6ICdHZXQgY3VycmVudCByZXNlcnZlIG1vZGlmaWNhdGlvbnMgYXQgYSBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyB0aGUgY2hhaW4ncyBtb2RpZmljYXRpb25zIHRvIGRlcml2ZWQgcmVzZXJ2ZXMgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGUgZm9yIHRoZSBjdXJyZW50IGVwb2NoIGFzIGEgbGlzdCBvZiB7c3RyYXR1bSwgcmVtYWluaW5nfSBwYWlycy4gU3RyYXRhIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZSB1c2UgdGhlaXIgZGVyaXZlZCBpbml0aWFsIHJlc2VydmUuIENvbXBvc2Ugd2l0aCBTREsgZGVyaXZhdGlvbiB0byBnZXQgdGhlIGZ1bGwgcGVyLWxvY2F0aW9uIHN0cmF0YSB2aWV3LoAVuppidbNiDGdldHJlc291cmNlc4cDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc291cmNlcwpzdW1tYXJ5OiAnR2V0IGFsbCByZXNvdXJjZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIHJlc291cmNlcywgaW5jbHVkaW5nIGVhY2ggcmVzb3VyY2UncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGdhdGhlcmFibGUgbWF0ZXJpYWxzLgAAADjTiLNiCGdldHNsb3RzuwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c2xvdHMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc2xvdCBsYXlvdXRzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgbW9kdWxlIHNsb3QgbGF5b3V0IGZvciBldmVyeSBlbnRpdHkgaXRlbSB0eXBlLCBsaXN0aW5nIHRoZSBvcmRlcmVkIHNsb3QgdHlwZXMgYXZhaWxhYmxlIGZvciBtb2R1bGUgaW5zdGFsbGF0aW9uLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRldGVybWluZSB3aGljaCBtb2R1bGUgdHlwZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBhIGdpdmVuIGVudGl0eSBodWxsLgCA1NncjLNiCmdldHN0cmF0dW3SAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdHJhdHVtCnN1bW1hcnk6ICdHZXQgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHJlc291cmNlIHN0cmF0dW0gZGF0YSBmb3IgYSBzcGVjaWZpYyBkZXB0aCBsYXllciBhdCBhIGNvb3JkaW5hdGUsIGluY2x1ZGluZyB0aGUgc3RyYXR1bSBzZWVkIGluZm8gYW5kIGRlcml2ZWQgcmVzb3VyY2Ugc3RhdHMugJW7RkqNs2IMZ2V0c3VtbWFyaWVz6AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3VtbWFyaWVzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHN1bW1hcmllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgbGlnaHR3ZWlnaHQgc3VtbWFyaWVzIG9mIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllciBpbmNsdWRpbmcgdHlwZSwgaWQsIG93bmVyLCBuYW1lLCBsb2NhdGlvbiwgYW5kIGlkbGUgc3RhdHVzLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4Aotrm5qrpZQtncm91cHRyYXZlbJoELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdyb3VwdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIG11bHRpcGxlIGVudGl0aWVzIHRvZ2V0aGVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSBncm91cCB0cmF2ZWwgZm9yIG11bHRpcGxlIGVudGl0aWVzIHRvIGEgZGVzdGluYXRpb24uIEFsbCBlbnRpdGllcyBtdXN0IGJlIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFuZCBvd25lZCBieSB0aGUgY2FsbGVyLiBBdCBsZWFzdCBvbmUgZW50aXR5IHdpdGggZW5naW5lcyBpcyByZXF1aXJlZCB0byBwcm92aWRlIHRocnVzdC4gRmxpZ2h0IGR1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgZnJvbSBjb21iaW5lZCB0aHJ1c3QgYW5kIHRvdGFsIG1hc3Mgb2YgYWxsIGVudGl0aWVzLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGZvciBhdG9taWMgcmVzb2x1dGlvbiBhbmQgY2FuY2VsbGF0aW9uLgAAAAAA0LBpBGhhc2j4AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhMjU2IGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTI1NiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAQITSsGkHaGFzaDUxMvsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2g1MTIKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGE1MTIgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhNTEyIGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4AKLsG5UurdAtpbXBvcnRjYXJnbwDgs8tT5UurdAxpbXBvcnRlbnRpdHkAAKqml+VLq3QLaW1wb3J0Z3JvdXAAcJU3seZLq3QMaW1wb3J0cGxheWVyALqvwurmS6t0DWltcG9ydHJlc2VydmUAAFQ2GedLq3QLaW1wb3J0c3RhdGUAAAAAAAAwHX0Eam9pbsQBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGpvaW4Kc3VtbWFyeTogJ0pvaW4gYSBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpKb2luIGEgZ2FtZSBvZiBTaGlwbG9hZAAAAAAAkAyNBGxvYWQAAACIVzPp8poJbmZ0aW1ndXJssgMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogbmZ0aW1ndXJsCnN1bW1hcnk6ICdHZXQgTkZUIGltYWdlIFVSTCBmb3IgYSBjYXJnbyBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgaW1hZ2UgVVJMIHRoZSBjb250cmFjdCBlbWl0cyBmb3IgYSBnaXZlbiBjYXJnbyBpdGVtLCBvcHRpb25hbGx5IHNjb3BlZCB0byBhIGxvY2F0aW9uLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBORlQgcmVuZGVyZXJzIHRvIGZldGNoIHRoZSBjYW5vbmljYWwgYXJ0d29yayBmb3IgYW4gaXRlbSBvciBwYWNrZWQgZW50aXR5LgAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAZdcghUysCnBsYWNlY2FyZ2/JBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBwbGFjZWNhcmdvCnN1bW1hcnk6ICdSZXN0b3JlIE5GVCBjYXJnbyBvbnRvIGEgaG9zdCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IHRoZSBwbGF0Zm9ybSBjb250cmFjdCBvbmx5LiBSZXN0b3JlcyB0aGUgY2FyZ28gcmVjb3JkZWQgaW4gYW4gdW53cmFwcGVkIE5GVCBvbnRvIGEgaG9zdCBlbnRpdHkuIFZhbGlkYXRlcyBob3N0IG93bmVyc2hpcCwgbG9hZGVycywgYW5kIHJlbWFpbmluZyBjYXBhY2l0eSwgZGVzZXJpYWxpemVzIHRoZSBORlQncyBpdGVtIGRhdGEsIGFuZCBhcHBlbmRzIGFuIHVud3JhcCB0YXNrIHRvIGRlbGl2ZXIgdGhlIGNhcmdvIHRvIHRoZSBob3N0LiBUaGUgcGxhdGZvcm0gY29udHJhY3QgY3JlZGl0cyB0aGUgZGVwb3NpdCByZWZ1bmQgYW5kIGJ1cm5zIHRoZSBhc3NldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgB8dnkqhUysC3BsYWNlZW50aXR5wAQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcGxhY2VlbnRpdHkKc3VtbWFyeTogJ01hdGVyaWFsaXplIGEgcGFja2VkLWVudGl0eSBORlQgYXMgYSBsaXZlIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIGNhbGxlZCBpbmxpbmUgYnkgdGhlIHBsYXRmb3JtIGNvbnRyYWN0IG9ubHkuIEVtcGxhY2VzIGEgbGl2ZSBvcmJpdGFsIHZlc3NlbCAoc2hpcCBvciBjb250YWluZXIpIGZyb20gaXRzIHBhY2tlZC1lbnRpdHkgTkZUIGRhdGEgYXQgdGhlIHJlY29yZGVkIHdyYXAgb3JpZ2luLCB0aGVuIHF1ZXVlcyB0cmF2ZWwgYW5kIHJlY2hhcmdlIHRhc2tzIHRvIGRlbGl2ZXIgaXQgdG8gdGhlIHRhcmdldCBuZXh1cyBhdCBmdWxsIGVuZXJneS4gVGhlIHBsYXRmb3JtIGNvbnRyYWN0IGNyZWRpdHMgdGhlIGRlcG9zaXQgcmVmdW5kIGFuZCBidXJucyB0aGUgYXNzZXQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAACKXdOQughyZWNoYXJnZc0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlY2hhcmdlCnN1bW1hcnk6ICdSZWNoYXJnZSBzaGlwIGVuZXJneScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2NoZWR1bGUgYSByZWNoYXJnZSB0YXNrIGZvciBhbiBlbnRpdHkgdG8gcmVzdG9yZSBlbmVyZ3kgdG8gZnVsbCBjYXBhY2l0eS4gVGhlIHJlY2hhcmdlIGR1cmF0aW9uIGRlcGVuZHMgb24gY3VycmVudCBlbmVyZ3kgbGV2ZWwgYW5kIHJlY2hhcmdlIHJhdGUu4LPLUzV8l7oMcmVmcnNoZW50aXR5uAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVmcnNoZW50aXR5CnN1bW1hcnk6ICdSZWZyZXNoIGRlcml2ZWQgZW50aXR5IHN0YXRlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZWNvbXB1dGUgZGVyaXZlZCBmaWVsZHMgb24gYW4gZW50aXR5IGZyb20gaXRzIGN1cnJlbnQgY2FyZ28gYW5kIG1vZHVsZXMsIHJlZnJlc2hpbmcgY2FwYWJpbGl0eSBzdGF0cyBhbmQgY2FyZ28gbWFzcy4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBubyBzY2hlZHVsZWQgdGFza3MuIFVzZWQgdG8gcmVjb25jaWxlIGRlcml2ZWQgc3RhdGUgYWZ0ZXIgZGF0YSBtaWdyYXRpb25zIG9yIGNvbnRyYWN0IHVwZ3JhZGVzLqAiMpeqTaW6DHJlbW92ZW9yYWNsZQAAAAAAKGmmugZyZW5hbWUAAAAAQO1IsboHcmVzb2x2ZdADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlc29sdmUKc3VtbWFyeTogJ0NvbXBsZXRlIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVzb2x2ZSBjb21wbGV0ZWQgdGFza3MgaW4gYW4gZW50aXR5J3Mgc2NoZWR1bGUsIGFwcGx5aW5nIHRoZWlyIGVmZmVjdHMgKHJlY2hhcmdlIGVuZXJneSwgdXBkYXRlIGxvY2F0aW9uLCBsb2FkL3VubG9hZCBjYXJnbykuIElmIGNvdW50IGlzIHNwZWNpZmllZCwgcmVzb2x2ZSBleGFjdGx5IHRoYXQgbWFueSB0YXNrczsgb3RoZXJ3aXNlIHJlc29sdmUgYWxsIGNvbXBsZXRlZCB0YXNrcy4gRmFpbHMgaWYgY291bnQgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlZCB0YXNrcy4AQIxG7UixugpyZXNvbHZlYWxsAAAAAABEo7a6BnJldmVhbAAAAAAq6kSlvAhybW1vZHVsZbwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJtbW9kdWxlCnN1bW1hcnk6ICdSZW1vdmUgYSBtb2R1bGUgZnJvbSBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlbW92ZSBhbiBpbnN0YWxsZWQgbW9kdWxlIGZyb20gYSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSBpcyByZXR1cm5lZCB0byBjYXJnby4gRmFpbHMgaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBoYXZlIGVub3VnaCBjYXJnbyBjYXBhY2l0eSB0byBob2xkIHRoZSByZXR1cm5lZCBtb2R1bGUuAAAAbKG8prwIcm1uZnRjZmehAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW5mdGNmZwpzdW1tYXJ5OiAnUmVtb3ZlIE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgdGhlIEF0b21pY0Fzc2V0cyB0ZW1wbGF0ZSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gaWQgZnJvbSB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIEFmdGVyIHJlbW92YWwgdGhlIGl0ZW0gY2FuIG5vIGxvbmdlciBiZSB3cmFwcGVkIG9yIHVud3JhcHBlZCB1bnRpbCBhIG5ldyBtYXBwaW5nIGlzIHNldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAYAvlNbPCCXNldG5mdGNmZ8QDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNldG5mdGNmZwpzdW1tYXJ5OiAnU2V0IE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpCaW5kIGFuIGl0ZW0gaWQgdG8gYW4gQXRvbWljQXNzZXRzIHRlbXBsYXRlIGlkIGFuZCBzY2hlbWEgbmFtZS4gVXNlZCB0byBjb25maWd1cmUgaG93IHRoZSBjb250cmFjdCBtaW50cyBhbmQgcmVjb2duaXplcyBORlRzIGZvciBhIGdpdmVuIGl0ZW0uIEluc2VydHMgYSBuZXcgbWFwcGluZyBpZiBvbmUgZG9lcyBub3QgZXhpc3QsIG9yIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIG1hcHBpbmcuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS6QIm1Y3ZazwgxzZXR0aHJlc2hvbGQAADKmqJrLs8ILc2V0d3JhcGNvc3QAAIBSq5rLs8IKc2V0d3JhcGZlZQAAAKDsGsRpxglzdG93Y2FyZ2/VBS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzdG93Y2FyZ28Kc3VtbWFyeTogJ1Jlc2VydmUgYSBjYXJnbyBzdGFjayBmb3Igd3JhcHBpbmcgaW50byBhbiBORlQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IHRoZSBwbGF0Zm9ybSBjb250cmFjdCBvbmx5LiBSZXNlcnZlcyBhbmQgY29uc3VtZXMgYSBjYXJnbyBzdGFjayBvbiBhIGxpdmUgZW50aXR5IGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVC4gVmFsaWRhdGVzIGVudGl0eSBvd25lcnNoaXAsIGxvYWRlcnMsIGFuZCBwcmVzZW5jZSBhdCB0aGUgbmV4dXMsIGFuZCBjb25maXJtcyB0aGUgdGFyZ2V0IGNhcmdvIHN0YWNrIGlzIGF2YWlsYWJsZSBhbmQgbm90IHJlc2VydmVkIGJ5IGEgcGVuZGluZyB0YXNrLiBDb21wdXRlcyB0aGUgd3JhcCBjb3N0IGFuZCBmZWUsIGRlYml0cyB0aGVtIGZyb20gdGhlIG93bmVyJ3MgcGxhdGZvcm0gZGVwb3NpdCBiYWxhbmNlLCBkZXJpdmVzIHRoZSBORlQncyBpbW11dGFibGUgZGF0YSwgYW5kIG1pbnRzIHRoZSBORlQgaW5saW5lIGFzIHRoZSBnYW1lIGNvbnRyYWN0IGJlZm9yZSBjb25zdW1pbmcgdGhlIGNhcmdvLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAIDPLk/FacYKc3Rvd2VudGl0eZkFLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHN0b3dlbnRpdHkKc3VtbWFyeTogJ1Jlc2VydmUgYW4gZW50aXR5IGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIGNhbGxlZCBpbmxpbmUgYnkgdGhlIHBsYXRmb3JtIGNvbnRyYWN0IG9ubHkuIFJlc2VydmVzIGEgd2hvbGUgZW50aXR5IChzaGlwLCBjb250YWluZXIsIG9yIHBsYW5ldGFyeSBzdHJ1Y3R1cmUpIGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVC4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBlbXB0eSBjYXJnbyBhbmQgbm8gc2NoZWR1bGVkIHRhc2tzLiBDb21wdXRlcyB0aGUgd3JhcCBjb3N0IGFuZCBmZWUsIGRlYml0cyB0aGVtIGZyb20gdGhlIG93bmVyJ3MgcGxhdGZvcm0gZGVwb3NpdCBiYWxhbmNlLCBkZXJpdmVzIHRoZSBlbnRpdHkgTkZUJ3MgaW1tdXRhYmxlIGRhdGEsIG1pbnRzIHRoZSBORlQgaW5saW5lIGFzIHRoZSBnYW1lIGNvbnRyYWN0LCBhbmQgZXJhc2VzIHRoZSBlbnRpdHkgZnJvbSB0aGUgd29ybGQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AgIo6UVkNxwpzd2FwbW9kdWxlAAAAAABEtc3NBnRyYXZlbPsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBhIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIHRyYXZlbCBvZiBhbiBlbnRpdHkgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBhIG5ldyBkZXN0aW5hdGlvbi4AAACexqrS1Ah1bmRlcGxveecELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHVuZGVwbG95CnN1bW1hcnk6ICdQYWNrIGEgZGVwbG95ZWQgZW50aXR5IGludG8gYSBob3N0JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpQYWNrIGFuIGVudGl0eSBpbnRvIGEgaG9zdCBlbnRpdHkncyBjYXJnbyBhcyBhIHBhY2tlZC1lbnRpdHkgaXRlbS4gSG9zdCBhbmQgdGFyZ2V0IG11c3Qgc2hhcmUgdGhlIHNhbWUgb3duZXIgYW5kIGNvb3JkaW5hdGVzLCB0aGUgaG9zdCBtdXN0IGhhdmUgbG9hZGVycyBhbmQgZW5vdWdoIGNhcGFjaXR5IGZvciB0aGUgcGFja2VkIG1hc3MsIGFuZCB0aGUgdGFyZ2V0IG11c3QgYmUgaWRsZSB3aXRoIGVtcHR5IGNhcmdvLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGFuZCBzY2hlZHVsZXMgdW5kZXBsb3kgdGFza3Mgb24gYm90aCBlbnRpdGllczsgb24gcmVzb2x1dGlvbiB0aGUgdGFyZ2V0IGlzIGVyYXNlZCBhbmQgdGhlIHBhY2tlZCBlbnRpdHkgaXMgYWRkZWQgdG8gdGhlIGhvc3QncyBjYXJnby4gSW52ZXJzZSBvZiBkZXBsb3kuAAAAACRD49QGdW5sb2FkAAAAAAAAUK/hBHdhcnCfAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3YXJwCnN1bW1hcnk6ICdXYXJwIHRvIGEgZGVzdGluYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluc3RhbnRseSB0ZWxlcG9ydCBhbiBlbnRpdHkgdG8gYSBkZXN0aW5hdGlvbiBzeXN0ZW0uIFJlcXVpcmVzIHdhcnAgY2FwYWJpbGl0eSwgZnVsbCBlbmVyZ3ksIGVtcHR5IGNhcmdvLCBhbmQgYW4gZW1wdHkgc2NoZWR1bGUuIFRoZSBkZXN0aW5hdGlvbiBtdXN0IGJlIGEgdmFsaWQgc3lzdGVtIHdpdGhpbiB3YXJwIHJhbmdlLiBSZXNvbHZlcyBpbW1lZGlhdGVseSBhcyBhIHplcm8tZHVyYXRpb24gdGFzay4AAAAAAKCq4wR3aXBlsgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2lwZQpzdW1tYXJ5OiAnREVCVUc6IHdpcGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tEQAAAAAAyq5BA2k2NAAACWNhcmdvX3JvdwAAAABg6UxEA2k2NAAACWNsYWltX3JvdwAAAABkJyVFA2k2NAAACmNvbW1pdF9yb3cAAAAA+OzyVANpNjQAAAplbnRpdHlfcm93AKqml/ns8lQDaTY0AAAPZW50aXR5Z3JvdXBfcm93AACwCvvs8lQDaTY0AAAOZW50aXR5X3NlcV9yb3cAAAAAgIZoVQNpNjQAAAllcG9jaF9yb3cAAGBuTYrymgNpNjQAAA1uZnRjb25maWdfcm93AABgC6mIzKUDaTY0AAARb3JhY2xlX2NvbmZpZ19yb3cAAAAAq4jMpQNpNjQAAApvcmFjbGVfcm93AAAAAFzlTawDaTY0AAAKcGxheWVyX3JvdwAAAEDtq7C6A2k2NAAAC3Jlc2VydmVfcm93AAAAAESjtroDaTY0AAAKcmV2ZWFsX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwAAAAAArKrPA2k2NAAACXR5cGVzX3JvdwAAc2tSVM3lA2k2NAAADndyYXBjb25maWdfcm93AAAAGVNUzeUDaTY0AAAMd3JhcGNvc3Rfcm93ARFTaGlwbG9hZCAoU2VydmVyKRFTaGlwbG9hZCAoU2VydmVyKQAAADUAAMg01hSdPgx0YXNrX3Jlc3VsdHMAAAAARIWmQQ5jYW5jZWxfcmVzdWx0cwAAyDRW6UxEDHRhc2tfcmVzdWx0cwAAAACAvMxFDHRhc2tfcmVzdWx0cwAAAA27SKVKDHRhc2tfcmVzdWx0cwAAAAB4GqtKDHRhc2tfcmVzdWx0cwCAzy5PhbBKBnN0cmluZwAAAABc1bJhDHRhc2tfcmVzdWx0cwAAYG5NirJiC2dhbWVfY29uZmlnAEB2mFaVsmIOZXh0ZW5kZWRfYXNzZXQAVDyOuaiyYgh1aW50MTZbXQAAwBHlqbJiC2VudW1fcmVzdWx0ALBy2eWpsmINZW50aXR5X2luZm9bXQAA8NnlqbJiC2VudGl0eV9pbmZvAEw2SarssmIPaXRlbWRhdGFfcmVzdWx0AABOTqrssmIPaXRlbV9pZHNfcmVzdWx0AAAAWKrssmIKaXRlbXNfaW5mbwBU9Vmq7LJiBXVpbnQ4gFX1WarssmILZW51bV9yZXN1bHQATFYyTQezYhBraW5kX21ldGFfcmVzdWx0ACZ12SAas2INbG9jYXRpb25faW5mbwCAySYhGrNiEGxvY2F0aW9uX2Rlcml2ZWQAsKo+JyqzYgtlbnVtX3Jlc3VsdAAAVlEnKrNiDm1vZHVsZXNfcmVzdWx0AADw5xo1s2ILbmVhcmJ5X2luZm8AgMLm5DWzYghzdHJpbmdbXQAAXdPlNbNiDm5mdGluZm9fcmVzdWx0AAC4yptYs2ILcGxheWVyX2luZm+gssn40VuzYg9wcm9qZWN0ZWRfc3RhdGUAAFDVIXWzYg5yZWNpcGVzX3Jlc3VsdAAAVtUhdbNiDnJlY2lwZXNfcmVzdWx0AADOBmF1s2ILZW51bV9yZXN1bHQAsNpXYXWzYhNzdHJhdHVtX3JlbWFpbmluZ1tdgBW6mmJ1s2IQcmVzb3VyY2VzX3Jlc3VsdAAAADjTiLNiFWVudGl0eV9sYXlvdXRzX3Jlc3VsdACA1NncjLNiDHN0cmF0dW1fZGF0YYCVu0ZKjbNiEGVudGl0eV9zdW1tYXJ5W10Aotrm5qrpZQx0YXNrX3Jlc3VsdHMAAAAAANCwaQtjaGVja3N1bTI1NgAAAECE0rBpC2NoZWNrc3VtNTEyAAAAAACQDI0MdGFza19yZXN1bHRzAACIVzPp8poGc3RyaW5nAABl1yCFTKwMdGFza19yZXN1bHRzAHx2eSqFTKwMdGFza19yZXN1bHRzAAAAil3TkLoMdGFza19yZXN1bHRzAAAAQO1IsboPcmVzb2x2ZV9yZXN1bHRzAECMRu1IsboScmVzb2x2ZWFsbF9yZXN1bHRzAACg7BrEacYMdGFza19yZXN1bHRzAIDPLk/FacYMdGFza19yZXN1bHRzAAAAAES1zc0MdGFza19yZXN1bHRzAAAAnsaq0tQMdGFza19yZXN1bHRzAAAAACRD49QMdGFza19yZXN1bHRzAAAAAABQr+EMdGFza19yZXN1bHRz');
|
|
451
|
+
const abiBlob = antelope.Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDiyAQlhZGRtb2R1bGUABAllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgp0YXJnZXRfcmVmCmNhcmdvX3JlZj8IYWRkbmV4dXMAAwpuZXh1c19uYW1lBnN0cmluZwF4BWludDY0AXkFaW50NjQJYWRkb3JhY2xlAAEJb3JhY2xlX2lkBG5hbWUFYmxlbmQAAgJpZAZ1aW50NjQGaW5wdXRzDGNhcmdvX2l0ZW1bXQlidWlsZHBsb3QAAgpidWlsZGVyX2lkBnVpbnQ2NAdwbG90X2lkBnVpbnQ2NAZjYW5jZWwAAwJpZAZ1aW50NjQIbGFuZV9rZXkFdWludDgFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABQdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhxdWFudGl0eQZ1aW50MzIJZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcmVmAAQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10JZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcm93AAcCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdC3NlcXVlbmNlX2lkB3VpbnQ2ND8KY2FyZ29fdmlldwAGB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHF1YW50aXR5BnVpbnQzMgJpZAZ1aW50NjQJZW50aXR5X2lkB3VpbnQ2ND8JY2xhaW1fcm93AAEFb3duZXIEbmFtZQljbGFpbXBsb3QAAwpidWlsZGVyX2lkBnVpbnQ2NA50YXJnZXRfaXRlbV9pZAZ1aW50MTYGY29vcmRzC2Nvb3JkaW5hdGVzDGNsYWltc3RhcnRlcgABBW93bmVyBG5hbWUJY2xlYW5yc3ZwAAIFZXBvY2gGdWludDY0CG1heF9yb3dzBnVpbnQ2NApjbGVhcnRhYmxlAAMKdGFibGVfbmFtZQRuYW1lBXNjb3BlBW5hbWU/CG1heF9yb3dzB3VpbnQ2ND8GY29tbWl0AAMJb3JhY2xlX2lkBG5hbWUFZXBvY2gGdWludDY0BmNvbW1pdAtjaGVja3N1bTI1Ngpjb21taXRfcm93AAQCaWQGdWludDY0BWVwb2NoBnVpbnQ2NAlvcmFjbGVfaWQEbmFtZQZjb21taXQLY2hlY2tzdW0yNTYJY29uZmlnbG9nAAEGY29uZmlnC2dhbWVfY29uZmlnC2Nvb3JkaW5hdGVzAAMBeAVpbnQ2NAF5BWludDY0AXoHdWludDE2PwVjcmFmdAAGAmlkBnVpbnQ2NAlyZWNpcGVfaWQGdWludDE2CHF1YW50aXR5BnVpbnQzMgZpbnB1dHMMY2FyZ29faXRlbVtdBnRhcmdldAd1aW50NjQ/BHNsb3QGdWludDg/DGNyYWZ0ZXJfbGFuZQAECnNsb3RfaW5kZXgFdWludDgFc3BlZWQGdWludDE2BWRyYWluBnVpbnQzMgpvdXRwdXRfcGN0BnVpbnQxNghkZW1vbGlzaAABCWVudGl0eV9pZAZ1aW50NjQGZGVwbG95AAICaWQGdWludDY0A3JlZgljYXJnb19yZWYKZGVzY2VudGl0eQAEB2l0ZW1faWQGdWludDE2Cmh1bGxfc3RhdHMGdWludDY0DG1vZHVsZV9pdGVtcwh1aW50MTZbXQxtb2R1bGVfc3RhdHMIdWludDY0W10GZW5hYmxlAAEHZW5hYmxlZARib29sDGVuZXJneV9zdGF0cwACCGNhcGFjaXR5BnVpbnQzMghyZWNoYXJnZQZ1aW50MzIUZW50aXR5X2N1cnJlbnRfc3RhdGUAAgtjb29yZGluYXRlcwtjb29yZGluYXRlcwZlbmVyZ3kGdWludDMyD2VudGl0eV9kZWZhdWx0cwACC3dhcmVob3VzZV96BnVpbnQxNgtjb250YWluZXJfegZ1aW50MTYLZW50aXR5X2luZm8AFQR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzB2l0ZW1faWQGdWludDE2CWNhcmdvbWFzcwZ1aW50MzIFY2FyZ28MY2FyZ29fdmlld1tdB21vZHVsZXMObW9kdWxlX2VudHJ5W10GZW5lcmd5B3VpbnQzMj8IaHVsbG1hc3MHdWludDMyPwhjYXBhY2l0eQd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8GaGF1bGVyDWhhdWxlcl9zdGF0cz8OZ2F0aGVyZXJfbGFuZXMPZ2F0aGVyZXJfbGFuZVtdDWNyYWZ0ZXJfbGFuZXMOY3JhZnRlcl9sYW5lW10MbG9hZGVyX2xhbmVzDWxvYWRlcl9sYW5lW10FbGFuZXMGbGFuZVtdBWhvbGRzBmhvbGRbXQ1lbnRpdHlfbGF5b3V0AAIOZW50aXR5X2l0ZW1faWQGdWludDE2BXNsb3RzCnNsb3RfZGVmW10VZW50aXR5X2xheW91dHNfcmVzdWx0AAEIZW50aXRpZXMPZW50aXR5X2xheW91dFtdCmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKZW50aXR5X3JvdwAMAmlkBnVpbnQ2NAVvd25lcgRuYW1lBGtpbmQEbmFtZQdpdGVtX2lkBnVpbnQxNgRuYW1lBnN0cmluZwVzdGF0cwZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdBWxhbmVzBmxhbmVbXQVob2xkcwZob2xkW10OZW50aXR5X3NlcV9yb3cAAQduZXh0X2lkBnVpbnQ2NA5lbnRpdHlfc3VtbWFyeQAIBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMHaXNfaWRsZQRib29sDnJlc29sdmVkX2NvdW50BnVpbnQzMg1wZW5kaW5nX2NvdW50BnVpbnQzMhBlbnRpdHlfdGFza19pbmZvAAQJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lCnRhc2tfY291bnQFdWludDgQc2NoZWR1bGVfc3RhcnRlZAp0aW1lX3BvaW50D2VudGl0eWdyb3VwX3JvdwACAmlkBnVpbnQ2NAxwYXJ0aWNpcGFudHMMZW50aXR5X3JlZltdC2VudW1fbWVtYmVyAAIFdmFsdWUFdWludDgEbmFtZQZzdHJpbmcLZW51bV9yZXN1bHQAAQdtZW1iZXJzDWVudW1fbWVtYmVyW10JZXBvY2hfcm93AAQFZXBvY2gGdWludDY0Cm9yYWNsZV9pZHMGbmFtZVtdCXRocmVzaG9sZAV1aW50OARzZWVkC2NoZWNrc3VtMjU2DGZpeGNhcmdvbWFzcwABCWVudGl0eV9pZAZ1aW50NjQLZm9yY2VyZXZlYWwAAQVlcG9jaAZ1aW50NjQLZ2FtZV9jb25maWcAAwd2ZXJzaW9uBnVpbnQzMghkZWZhdWx0cw9lbnRpdHlfZGVmYXVsdHMFaXRlbXMKaXRlbV9kZWZbXQZnYXRoZXIABQlzb3VyY2VfaWQGdWludDY0DmRlc3RpbmF0aW9uX2lkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIEc2xvdAZ1aW50OD8NZ2F0aGVyZXJfbGFuZQAFCnNsb3RfaW5kZXgFdWludDgFeWllbGQGdWludDE2BWRyYWluBnVpbnQzMgVkZXB0aAZ1aW50MTYKb3V0cHV0X3BjdAZ1aW50MTYMZ2VuZXNpc2ZsZWV0AAEIZW50aXRpZXMMZW50aXR5X3Jvd1tdCWdldGNvbmZpZwAACmdldGRlcG9zaXQAAgVvd25lcgRuYW1lCGFzc2V0X2lkBnVpbnQ2NAtnZXRkaXN0YW5jZQAEAmF4BWludDY0AmF5BWludDY0AmJ4BWludDY0AmJ5BWludDY0C2dldGVsaWdpYmxlAAIGY29vcmRzC2Nvb3JkaW5hdGVzB3N0cmF0dW0GdWludDE2CWdldGVudGNscwAAC2dldGVudGl0aWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwlnZXRlbnRpdHkAAQllbnRpdHlfaWQGdWludDY0C2dldGl0ZW1kYXRhAAAKZ2V0aXRlbWlkcwAACGdldGl0ZW1zAAALZ2V0aXRlbXR5cGUAAQdpdGVtX2lkBnVpbnQxNgxnZXRpdGVtdHlwZXMAAAtnZXRraW5kbWV0YQAAC2dldGxvY2F0aW9uAAIBeAVpbnQ2NAF5BWludDY0CmdldGxvY2RhdGEAAgF4BWludDY0AXkFaW50NjQLZ2V0bW9kdHlwZXMAAApnZXRtb2R1bGVzAAAJZ2V0bmVhcmJ5AAIJZW50aXR5X2lkBnVpbnQ2NAhyZWNoYXJnZQRib29sCmdldG5mdGJhc2UAAApnZXRuZnRpbmZvAAAJZ2V0cGxheWVyAAEHYWNjb3VudARuYW1lDGdldHByb2pzdGF0ZQACCWVudGl0eV9pZAZ1aW50NjQKdGFza19jb3VudAZ1aW50OD8JZ2V0cmVjaXBlAAEOb3V0cHV0X2l0ZW1faWQGdWludDE2CmdldHJlY2lwZXMAAgtsb3dlcl9ib3VuZAZ1aW50MTYFbGltaXQFdWludDgKZ2V0cmVzY2F0cwAAC2dldHJlc2VydmVzAAIBeAVpbnQ2NAF5BWludDY0DGdldHJlc291cmNlcwAACGdldHNsb3RzAAAKZ2V0c3RyYXR1bQADAXgFaW50NjQBeQVpbnQ2NAdzdHJhdHVtBnVpbnQxNgxnZXRzdW1tYXJpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/C2dldHdvcm1ob2xlAAIBeAVpbnQ2NAF5BWludDY0DGdyb3VwdHJhbnNpdAAFCGVudGl0aWVzDGVudGl0eV9yZWZbXQJheAVpbnQ2NAJheQVpbnQ2NAJieAVpbnQ2NAJieQVpbnQ2NAtncm91cHRyYXZlbAAECGVudGl0aWVzDGVudGl0eV9yZWZbXQF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbARoYXNoAAEFdmFsdWUGc3RyaW5nB2hhc2g1MTIAAQV2YWx1ZQZzdHJpbmcMaGF1bGVyX3N0YXRzAAMIY2FwYWNpdHkFdWludDgKZWZmaWNpZW5jeQZ1aW50MTYFZHJhaW4GdWludDMyBGhvbGQABQJpZAZ1aW50NjQEa2luZAV1aW50OAtjb3VudGVycGFydAplbnRpdHlfcmVmBXVudGlsCnRpbWVfcG9pbnQNaW5jb21pbmdfbWFzcwZ1aW50MzILaW1wb3J0Y2FyZ28AAQNyb3cJY2FyZ29fcm93DGltcG9ydGVudGl0eQABA3JvdwplbnRpdHlfcm93C2ltcG9ydGdyb3VwAAEDcm93D2VudGl0eWdyb3VwX3JvdwxpbXBvcnRwbGF5ZXIAAQVvd25lcgRuYW1lDWltcG9ydHJlc2VydmUAAgtlcG9jaF9zY29wZQZ1aW50MzIDcm93C3Jlc2VydmVfcm93C2ltcG9ydHN0YXRlAAEDcm93CXN0YXRlX3JvdwhpdGVtX2RlZgAFAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgR0eXBlBXVpbnQ4B3N1YnR5cGUFdWludDgEdGllcgV1aW50OAxpdGVtX2lkX3BhaXIAAgJpZAZ1aW50MTYEbmFtZQZzdHJpbmcPaXRlbV9pZHNfcmVzdWx0AAEFaXRlbXMOaXRlbV9pZF9wYWlyW10PaXRlbWRhdGFfcmVzdWx0AAIFaXRlbXMKaXRlbV9kZWZbXQdyZWNpcGVzDnJlY2lwZXNfcmVzdWx0Cml0ZW1zX2luZm8AAQVpdGVtcwppdGVtX2RlZltdBGpvaW4AAQdhY2NvdW50BG5hbWUQa2luZF9tZXRhX3Jlc3VsdAACBWtpbmRzD2tpbmRfbWV0YV9yb3dbXQl0ZW1wbGF0ZXMTdGVtcGxhdGVfbWV0YV9yb3dbXQ1raW5kX21ldGFfcm93AAUEa2luZARuYW1lDmNsYXNzaWZpY2F0aW9uBXVpbnQ4EGNhcGFiaWxpdHlfZmxhZ3MFdWludDgHel9jb29yZAZ1aW50MzINZGVmYXVsdF9sYWJlbAZzdHJpbmcEbGFuZQACCGxhbmVfa2V5BXVpbnQ4CHNjaGVkdWxlCHNjaGVkdWxlBGxvYWQAAwJpZAZ1aW50NjQHZnJvbV9pZAZ1aW50NjQFaXRlbXMMY2FyZ29faXRlbVtdC2xvYWRlcl9sYW5lAAQKc2xvdF9pbmRleAV1aW50OARtYXNzBnVpbnQzMgZ0aHJ1c3QGdWludDE2Cm91dHB1dF9wY3QGdWludDE2EGxvY2F0aW9uX2Rlcml2ZWQAAgxzdGF0aWNfcHJvcHMPbG9jYXRpb25fc3RhdGljBHNpemUGdWludDE2DWxvY2F0aW9uX2luZm8AAwZjb29yZHMLY29vcmRpbmF0ZXMJaXNfc3lzdGVtBGJvb2wLaXNfd29ybWhvbGUEYm9vbA9sb2NhdGlvbl9zdGF0aWMABQZjb29yZHMLY29vcmRpbmF0ZXMEdHlwZQ1sb2NhdGlvbl90eXBlB3N1YnR5cGUFdWludDgFc2VlZDAFdWludDgFc2VlZDEFdWludDgMbW9kdWxlX2VudHJ5AAIEdHlwZQV1aW50OAlpbnN0YWxsZWQOcGFja2VkX21vZHVsZT8LbW9kdWxlX2luZm8ABAJpZAZ1aW50MTYEbWFzcwZ1aW50MzILbW9kdWxlX3R5cGUFdWludDgEdGllcgV1aW50OA5tb2R1bGVzX3Jlc3VsdAABB21vZHVsZXMNbW9kdWxlX2luZm9bXQ5tb3ZlbWVudF9zdGF0cwACBnRocnVzdAZ1aW50MzIFZHJhaW4GdWludDMyC25lYXJieV9pbmZvAAUKY2FuX3RyYXZlbARib29sB2N1cnJlbnQUZW50aXR5X2N1cnJlbnRfc3RhdGUJcHJvamVjdGVkFGVudGl0eV9jdXJyZW50X3N0YXRlCm1heF9lbmVyZ3kGdWludDMyB3N5c3RlbXMPbmVhcmJ5X3N5c3RlbVtdDW5lYXJieV9zeXN0ZW0ABAhkaXN0YW5jZQZ1aW50NjQLZW5lcmd5X2Nvc3QGdWludDY0C2ZsaWdodF90aW1lBnVpbnQzMghsb2NhdGlvbg1sb2NhdGlvbl9pbmZvDm5mdF9jYXJnb19pdGVtAAQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10IcXVhbnRpdHkGdWludDMyEG5mdF9pdGVtX3BheWxvYWQAAgRpdGVtDm5mdF9jYXJnb19pdGVtCGxvY2F0aW9uDGNvb3JkaW5hdGVzPw5uZnRfc2NoZW1hX2RlZgACC3NjaGVtYV9uYW1lBG5hbWUGZmllbGRzDnNjaGVtYV9maWVsZFtdEG5mdF90ZW1wbGF0ZV9kZWYAAwdpdGVtX2lkBnVpbnQxNgtzY2hlbWFfbmFtZQRuYW1lC3RlbXBsYXRlX2lkBWludDMyDW5mdGNvbmZpZ19yb3cAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lCW5mdGltZ3VybAACBGl0ZW0KY2FyZ29faXRlbQhsb2NhdGlvbgxjb29yZGluYXRlcz8ObmZ0aW5mb19yZXN1bHQAAgdzY2hlbWFzEG5mdF9zY2hlbWFfZGVmW10JdGVtcGxhdGVzEm5mdF90ZW1wbGF0ZV9kZWZbXQZub3RpZnkAAQVldmVudAp0YXNrX2V2ZW50EW9yYWNsZV9jb25maWdfcm93AAEJdGhyZXNob2xkBXVpbnQ4Cm9yYWNsZV9yb3cAAQJpZARuYW1lDXBhY2tlZF9tb2R1bGUAAgdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQKcGxhY2VjYXJnbwADBW93bmVyBG5hbWUHaG9zdF9pZAZ1aW50NjQIYXNzZXRfaWQGdWludDY0C3BsYWNlZW50aXR5AAMFb3duZXIEbmFtZQhhc3NldF9pZAZ1aW50NjQPdGFyZ2V0X25leHVzX2lkBnVpbnQ2NAtwbGF5ZXJfaW5mbwADBW93bmVyBG5hbWUJaXNfcGxheWVyBGJvb2wMY29tcGFueV9uYW1lBnN0cmluZwpwbGF5ZXJfcm93AAEFb3duZXIEbmFtZQ9wcm9qZWN0ZWRfc3RhdGUADgVvd25lcgRuYW1lC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzBmVuZXJneQd1aW50MzI/CWNhcmdvbWFzcwZ1aW50MzIFY2FyZ28MY2FyZ29fdmlld1tdCGh1bGxtYXNzB3VpbnQzMj8IY2FwYWNpdHkHdWludDMyPwdlbmdpbmVzD21vdmVtZW50X3N0YXRzPwR3YXJwC3dhcnBfc3RhdHM/CWdlbmVyYXRvcg1lbmVyZ3lfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/DmdhdGhlcmVyX2xhbmVzD2dhdGhlcmVyX2xhbmVbXQ1jcmFmdGVyX2xhbmVzDmNyYWZ0ZXJfbGFuZVtdDGxvYWRlcl9sYW5lcw1sb2FkZXJfbGFuZVtdCHJlY2hhcmdlAAECaWQGdWludDY0DHJlY2lwZV9pbnB1dAACB2l0ZW1faWQGdWludDE2CHF1YW50aXR5BnVpbnQzMhByZWNpcGVfaXRlbV9pbmZvAAICaWQGdWludDE2BG1hc3MGdWludDMyD3JlY2lwZV9yZXNwb25zZQAHDm91dHB1dF9pdGVtX2lkBnVpbnQxNgtvdXRwdXRfbWFzcwZ1aW50MzIGaW5wdXRzDnJlY2lwZV9pbnB1dFtdCnN0YXRfc2xvdHMUc3RhdF9zbG90X3Jlc3BvbnNlW10NYmxlbmRfd2VpZ2h0cwVieXRlcwtvdXRwdXRfaXRlbRByZWNpcGVfaXRlbV9pbmZvC2lucHV0X2l0ZW1zEnJlY2lwZV9pdGVtX2luZm9bXQ5yZWNpcGVzX3Jlc3VsdAABB3JlY2lwZXMRcmVjaXBlX3Jlc3BvbnNlW10McmVmcnNoZW50aXR5AAEJZW50aXR5X2lkBnVpbnQ2NAxyZW1vdmVvcmFjbGUAAQlvcmFjbGVfaWQEbmFtZQZyZW5hbWUAAgJpZAZ1aW50NjQEbmFtZQZzdHJpbmcLcmVzZXJ2ZV9yb3cABQJpZAZ1aW50NjQIY29vcmRfaWQGdWludDY0B3N0cmF0dW0GdWludDE2CXJlbWFpbmluZwZ1aW50MzIKbGFzdF9ibG9jaxRibG9ja190aW1lc3RhbXBfdHlwZQdyZXNvbHZlAAICaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CnJlc29sdmVhbGwAAQVvd25lcgRuYW1lEnJlc29sdmVhbGxfcmVzdWx0cwACB3NjYW5uZWQGdWludDMyCHJlc29sdmVkBnVpbnQzMg1yZXNvdXJjZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyCGNhdGVnb3J5BXVpbnQ4BHRpZXIFdWludDgOcmVzb3VyY2Vfc3RhdHMAAwVzdGF0MQZ1aW50MTYFc3RhdDIGdWludDE2BXN0YXQzBnVpbnQxNhByZXNvdXJjZXNfcmVzdWx0AAEJcmVzb3VyY2VzD3Jlc291cmNlX2luZm9bXQZyZXZlYWwAAwlvcmFjbGVfaWQEbmFtZQVlcG9jaAZ1aW50NjQGcmV2ZWFsC2NoZWNrc3VtMjU2CnJldmVhbF9yb3cABAJpZAZ1aW50NjQFZXBvY2gGdWludDY0CW9yYWNsZV9pZARuYW1lBnJldmVhbAtjaGVja3N1bTI1NghybW1vZHVsZQADCWVudGl0eV9pZAZ1aW50NjQMbW9kdWxlX2luZGV4BXVpbnQ4CnRhcmdldF9yZWYKY2FyZ29fcmVmPwhybW5mdGNmZwABB2l0ZW1faWQGdWludDE2CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwlzZXRjb29yZHMAAwllbnRpdHlfaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAlzZXRuZnRjZmcAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lDHNldHRocmVzaG9sZAABCXRocmVzaG9sZAV1aW50OAtzZXR3cmFwY29zdAADCWl0ZW1fdHlwZQV1aW50OAR0aWVyBXVpbnQ4BmFtb3VudAZ1aW50NjQKc2V0d3JhcGZlZQACB2ZlZV9wY3QGdWludDE2C2ZlZV9hY2NvdW50BG5hbWUIc2xvdF9kZWYAAgR0eXBlBXVpbnQ4Cm91dHB1dF9wY3QGdWludDE2EnN0YXRfc2xvdF9yZXNwb25zZQABB3NvdXJjZXMNc3RhdF9zb3VyY2VbXQtzdGF0X3NvdXJjZQACC2lucHV0X2luZGV4BXVpbnQ4EGlucHV0X3N0YXRfaW5kZXgFdWludDgJc3RhdGVfcm93AAMHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2CXN0b3djYXJnbwAFBW93bmVyBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhuZXh1c19pZAZ1aW50NjQIY2FyZ29faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NApzdG93ZW50aXR5AAMFb3duZXIEbmFtZQllbnRpdHlfaWQGdWludDY0CG5leHVzX2lkBnVpbnQ2NAxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABQdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzILcmVzZXJ2ZV9tYXgGdWludDMyEXN0cmF0dW1fcmVtYWluaW5nAAMHc3RyYXR1bQZ1aW50MTYJcmVtYWluaW5nBnVpbnQzMgpsYXN0X2Jsb2NrFGJsb2NrX3RpbWVzdGFtcF90eXBlCnN3YXBtb2R1bGUAAwllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgR0YXNrAAkEdHlwZQV1aW50OAhkdXJhdGlvbgZ1aW50MzIKY2FuY2VsYWJsZQV1aW50OAtjb29yZGluYXRlcwxjb29yZGluYXRlcz8FY2FyZ28MY2FyZ29faXRlbVtdDGVudGl0eXRhcmdldAtlbnRpdHlfcmVmPwtlbnRpdHlncm91cAd1aW50NjQ/C2VuZXJneV9jb3N0B3VpbnQzMj8EaG9sZAd1aW50NjQ/CnRhc2tfZXZlbnQACgpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDMyPwhsYW5lX2tleQV1aW50OAx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10RdGVtcGxhdGVfbWV0YV9yb3cAAwdpdGVtX2lkBnVpbnQxNgRraW5kBG5hbWUNZGlzcGxheV9sYWJlbAZzdHJpbmcHdHJhbnNpdAAFAmlkBnVpbnQ2NAJheAVpbnQ2NAJheQVpbnQ2NAJieAVpbnQ2NAJieQVpbnQ2NAZ0cmF2ZWwABAJpZAZ1aW50NjQBeAVpbnQ2NAF5BWludDY0CHJlY2hhcmdlBGJvb2wJdHlwZXNfcm93AAUCaWQGdWludDY0E2VudGl0eV9zdW1tYXJ5X3R5cGUOZW50aXR5X3N1bW1hcnkQZ2FtZV9jb25maWdfdHlwZQtnYW1lX2NvbmZpZxZzdHJhdHVtX3JlbWFpbmluZ190eXBlEXN0cmF0dW1fcmVtYWluaW5nFW5mdF9pdGVtX3BheWxvYWRfdHlwZRBuZnRfaXRlbV9wYXlsb2FkCHVuZGVwbG95AAIHaG9zdF9pZAZ1aW50NjQJdGFyZ2V0X2lkBnVpbnQ2NAZ1bmxvYWQAAwJpZAZ1aW50NjQFdG9faWQGdWludDY0BWl0ZW1zDGNhcmdvX2l0ZW1bXQR3YXJwAAMCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAp3YXJwX3N0YXRzAAEFcmFuZ2UGdWludDMyBHdpcGUAAA13b3JtaG9sZV9pbmZvAAMGY29vcmRzC2Nvb3JkaW5hdGVzC2lzX3dvcm1ob2xlBGJvb2wLZGVzdGluYXRpb24LY29vcmRpbmF0ZXMOd3JhcGNvbmZpZ19yb3cAAgdmZWVfcGN0BnVpbnQxNgtmZWVfYWNjb3VudARuYW1lDHdyYXBjb3N0X3JvdwADCWl0ZW1fdHlwZQV1aW50OAR0aWVyBXVpbnQ4BmFtb3VudAZ1aW50NjRbAABQUScqUzIJYWRkbW9kdWxlxwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbW9kdWxlCnN1bW1hcnk6ICdJbnN0YWxsIGEgbW9kdWxlIGludG8gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YWxsIGEgbW9kdWxlIGZyb20gY2FyZ28gaW50byBhIG1vZHVsZSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSB0eXBlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgc2xvdCB0eXBlLiBUaGUgbW9kdWxlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIGNhcmdvIHVwb24gaW5zdGFsbGF0aW9uLgAAAFh3NVMyCGFkZG5leHVzpwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbmV4dXMKc3VtbWFyeTogJ0FkZCBhIG5leHVzIGxvY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDcmVhdGUgYSBuZXcgbmV4dXMgZW50aXR5IGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy4gTmV4dXNlcyBhcmUgb3duZWQgYnkgdGhlIGNvbnRyYWN0IGFuZCBzZXJ2ZSBhcyBmaXhlZCBnYXRoZXJpbmcgcG9pbnRzIHdoZXJlIHBsYXllcnMgY2FuIHdyYXAsIHVud3JhcCwgZGVwbG95LCBhbmQgb3RoZXJ3aXNlIGludGVyYWN0IHdpdGggTkZULWJhY2tlZCBhc3NldHMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAFARmUtTMglhZGRvcmFjbGUAAAAAAIA0VTwFYmxlbmT8Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBibGVuZApzdW1tYXJ5OiAnQmxlbmQgY2FyZ28gc3RhY2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDb21iaW5lIG11bHRpcGxlIGNhcmdvIHN0YWNrcyBvZiB0aGUgc2FtZSBpdGVtIHR5cGUgaW50byBhIHNpbmdsZSBzdGFjayB3aXRoIG5ldyBibGVuZGVkIHN0YXRzLiBBbGwgaW5wdXQgc3RhY2tzIG11c3Qgc2hhcmUgdGhlIHNhbWUgaXRlbSBpZC4gVGhlIG91dHB1dCBzdGFjayBoYXMgdGhlIGNvbWJpbmVkIHF1YW50aXR5IG9mIGFsbCBpbnB1dHMuAADINNYUnT4JYnVpbGRwbG90AAAAAABEhaZBBmNhbmNlbMICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNhbmNlbApzdW1tYXJ5OiAnQ2FuY2VsIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FuY2VsIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRhc2tzIGZyb20gdGhlIGVuZCBvZiBhbiBlbnRpdHkncyBzY2hlZHVsZS4gVGFza3MgdGhhdCBhcmUgaW1tdXRhYmxlIGFuZCBpbiBwcm9ncmVzcyBjYW5ub3QgYmUgY2FuY2VsbGVkLgAAyDRW6UxECWNsYWltcGxvdABwVb4mY+lMRAxjbGFpbXN0YXJ0ZXIAAACoG99pVEQJY2xlYW5yc3Zw7AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYW5yc3ZwCnN1bW1hcnk6ICdDbGVhbiB1cCBwYXN0IGVwb2NoIHJlc2VydmVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFcmFzZSByZXNlcnZlIHRhYmxlIHJvd3MgZnJvbSBhIHBhc3QgZXBvY2guIENhbm5vdCBjbGVhbiB0aGUgY3VycmVudCBvciBmdXR1cmUgZXBvY2hzLiBUaGUgbWF4X3Jvd3MgcGFyYW1ldGVyIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIGVyYXNlZCBwZXIgY2FsbCB0byBsaW1pdCBDUFUgdXNhZ2UuAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdOwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4AAGA0MrcmRQljb25maWdsb2fdAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjb25maWdsb2cKc3VtbWFyeTogJ0xvZyBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IGxvZ3MgdGhlIGN1cnJlbnQgZ2FtZSBjb25maWd1cmF0aW9uLiBDYWxsZWQgaW5saW5lIGFmdGVyIGluaXRpYWxpemF0aW9uIHRvIGJyb2FkY2FzdCBjb25maWcgdmlhIGFjdGlvbiB0cmFjZXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAgLzMRQVjcmFmdMgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNyYWZ0CnN1bW1hcnk6ICdDcmFmdCBpdGVtcyBmcm9tIGEgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2Zvcm0gY2FyZ28gaXRlbXMgaW50byBhIG5ldyBpdGVtIHVzaW5nIGEgcmVjaXBlLiBUaGUgZW50aXR5IG11c3QgaGF2ZSBhIGNyYWZ0ZXIgbW9kdWxlIGluc3RhbGxlZC4gQ29uc3VtZXMgZW5lcmd5IGFuZCBzY2hlZHVsZXMgYSBjcmFmdGluZyB0YXNrIHdpdGggZHVyYXRpb24gYmFzZWQgb24gdG90YWwgaW5wdXQgbWFzcyBhbmQgY3JhZnRlciBzcGVlZC4gSW5wdXQgcXVhbnRpdGllcyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2lwZSByZXF1aXJlbWVudHMuAAAADbtIpUoIZGVtb2xpc2jxAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBkZW1vbGlzaApzdW1tYXJ5OiAnRGVtb2xpc2ggYSBzdGF0aW9uYXJ5IGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRGVjb21taXNzaW9uIGFuIGVudGl0eSwgZXJhc2luZyBpdCBmcm9tIHRoZSBnYW1lLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSwgaGF2ZSBlbXB0eSBjYXJnbywgYW5kIGhhdmUgbm8gaW5zdGFsbGVkIG1vZHVsZXMgKHJlbW92ZSBlYWNoIHZpYSBybW1vZHVsZSBmaXJzdCkuIFNjaGVkdWxlcyBhIGRlbW9saXNoIHRhc2sgdGhhdCBlcmFzZXMgdGhlIGVudGl0eSBvbiByZXNvbHV0aW9uLiBPbmx5IHZhbGlkIGZvciBlbnRpdGllcyB0aGF0IGNhbm5vdCBtb3ZlOyB1c2UgdW5kZXBsb3kgb3Igd3JhcGVudGl0eSBmb3IgdGhlIHJlc3QuAAAAAHgaq0oGZGVwbG957AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVwbG95CnN1bW1hcnk6ICdEZXBsb3kgYSBwYWNrZWQgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpVbnBhY2sgYSBwYWNrZWQgZW50aXR5IGl0ZW0gKHBhY2tlZCBzaGlwIG9yIHBhY2tlZCBjb250YWluZXIpIGZyb20gY2FyZ28sIHNjaGVkdWxpbmcgYSBkZXBsb3kgdGFzayB0aGF0IGNyZWF0ZXMgdGhlIG5ldyBlbnRpdHkgYXQgdGhlIGRlcGxveWluZyBlbnRpdHkncyBsb2NhdGlvbiB1cG9uIHJlc29sdXRpb24uAIDPLk+FsEoKZGVzY2VudGl0eckDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlc2NlbnRpdHkKc3VtbWFyeTogJ0Rlc2NyaWJlIGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIGEgcGFja2VkIGVudGl0eSwgZGVyaXZlZCBmcm9tIHRoZSBlbnRpdHkgaXRlbSBpZCwgaHVsbCBzdGF0cywgYW5kIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBtb2R1bGUgaXRlbSBpZHMgYW5kIHN0YXRzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBORlQgcmVuZGVyZXJzIHRvIGRpc3BsYXkgcGFja2VkIGVudGl0aWVzLgAAAACoeMxUBmVuYWJsZd0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC6AsZGUXYO6WwxmaXhjYXJnb21hc3OQAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBmaXhjYXJnb21hc3MKc3VtbWFyeTogJ0RFQlVHOiByZWNvbXB1dGUgZW50aXR5IGNhcmdvIG1hc3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlY29tcHV0ZSBhbmQgcmV3cml0ZSBhbiBlbnRpdHkncyBjYXJnbyBtYXNzIGZyb20gaXRzIGN1cnJlbnQgY2FyZ28uIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4gQXZhaWxhYmxlIGZvciByZXBhaXJpbmcgZHJpZnQgYmV0d2VlbiBjYWNoZWQgY2FyZ28gbWFzcyBhbmQgdGhlIHRydWUgbWFzcyBkZXJpdmVkIGZyb20gY2FyZ28gcm93cy4AolFbXYUuXQtmb3JjZXJldmVhbL4ELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGZvcmNlcmV2ZWFsCnN1bW1hcnk6ICdERUJVRzogZm9yY2UtZmluYWxpemUgYW4gZXBvY2ggZnJvbSBleGlzdGluZyByZXZlYWxzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpGaW5hbGl6ZSBhIHN0dWNrIGVwb2NoIGJ5IGNvbXB1dGluZyBpdHMgc2VlZCBmcm9tIHRoZSByZXZlYWxzIGFscmVhZHkgc3VibWl0dGVkLCB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LiBUaGUgc2VlZCBpcyBkZXJpdmVkIHNvbGVseSBmcm9tIHRoZSBwcmUtaW1hZ2UtbG9ja2VkIHJldmVhbHMgYWxyZWFkeSBvbiBjaGFpbjsgbm8gYWRtaW4tc3VwcGxpZWQgZW50cm9weSBpcyBpbnRyb2R1Y2VkLiBVc2VkIHRvIHVuYmxvY2sgZXBvY2ggcHJvZ3Jlc3Npb24gd2hlbiB0aGUgdGhyZXNob2xkIGNhbm5vdCBvdGhlcndpc2UgYmUgbWV0LgAAAABc1bJhBmdhdGhlcpcDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdhdGhlcgpzdW1tYXJ5OiAnR2F0aGVyIHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKR2F0aGVyIHJlc291cmNlcyBhdCB0aGUgc2hpcCdzIGN1cnJlbnQgbG9jYXRpb24uIE9ubHkgd29ya3MgYXQgZ2F0aGVyYWJsZSBsb2NhdGlvbiB0eXBlcy4gU2NoZWR1bGVzIGEgZ2F0aGVyIHRhc2sgdGhhdCBjb25zdW1lcyBlbmVyZ3kgYW5kIHlpZWxkcyBjYXJnbyBiYXNlZCBvbiB0aGUgc2hpcCdzIGdhdGhlcmVyIHN0YXRzIGFuZCB0aGUgbG9jYXRpb24ncyByZXNvdXJjZSBjb21wb3NpdGlvbi6QlYoLO6ymYgxnZW5lc2lzZmxlZXSpBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZW5lc2lzZmxlZXQKc3VtbWFyeTogJ01pbnQgdGhlIG9uZS10aW1lIGdlbmVzaXMgZmxlZXQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVtcGxhY2UgdGhlIG9uZS10aW1lIGdlbmVzaXMgZmxlZXQ6IGEgY2FsbGVyLXN1cHBsaWVkIHNldCBvZiBlbnRpdGllcyAoc2hpcHMsIHN0cnVjdHVyZXMsIGFuZCBjb250YWluZXJzKSB3cml0dGVuIHRvIHRoZSB3b3JsZCBhcy1pcy4gVmFsaWQgb25seSBkdXJpbmcgdGhlIHByZS1nZW5lc2lzIHdpbmRvdywgYmVmb3JlIGVwb2NoIDEgaXMgZmluYWxpemVkLiBUaGUgc3VwcGxpZWQgZW50aXR5IGlkcyBhcmUgaG9ub3JlZCBhbmQgdGhlIGlkIHNlcXVlbmNlIGlzIGFkdmFuY2VkIHBhc3QgdGhlbTsgaWQgMCBpcyByZXNlcnZlZCBmb3IgdGhlIEdlbmVzaXMgTmV4dXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAGBuTYqyYglnZXRjb25maWfKAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRjb25maWcKc3VtbWFyeTogJ0dldCBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgdGhlIGdhbWUgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgZGVmYXVsdCBlbnRpdHkgc3RhdHMgZm9yIHdhcmVob3VzZXMgYW5kIGNvbnRhaW5lcnMsIGFuZCB0aGUgZnVsbCBpdGVtIGRlZmluaXRpb25zIHRhYmxlLgBAdphWlbJiCmdldGRlcG9zaXQAABSaJmOXsmILZ2V0ZGlzdGFuY2UAAFQ8jrmosmILZ2V0ZWxpZ2libGXIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbGlnaWJsZQpzdW1tYXJ5OiAnR2V0IGVsaWdpYmxlIHJlc291cmNlIGl0ZW0gSURzIGF0IGEgbG9jYXRpb24gYW5kIHN0cmF0dW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBsaXN0IG9mIHJlc291cmNlIGl0ZW0gSURzIGVsaWdpYmxlIHRvIGJlIGdhdGhlcmVkIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcyBhbmQgc3RyYXR1bSBkZXB0aC4gSXRlbXMgYXJlIGdhdGVkIGJ5IGJvdGggdGhlIGxvY2F0aW9uJ3MgcmVzb3VyY2UgcHJvZmlsZSBhbmQgdGhlIGRlcHRoIHRocmVzaG9sZCBmb3IgZWFjaCB0aWVyLgAAwBHlqbJiCWdldGVudGNsc4wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGNscwpzdW1tYXJ5OiAnR2V0IGVudGl0eSBjbGFzcyBlbnVtIHZhbHVlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgc2V0IG9mIGVudGl0eSBjbGFzcyBlbnVtIHZhbHVlcyBhbmQgdGhlaXIgc3RyaW5nIG5hbWVzIChPcmJpdGFsVmVzc2VsLCBQbGFuZXRhcnlTdHJ1Y3R1cmUpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBlbnRpdHkgY2xhc3MgaWRlbnRpZmllcnMuALBy2eWpsmILZ2V0ZW50aXRpZXOkAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbnRpdGllcwpzdW1tYXJ5OiAnR2V0IGFsbCBlbnRpdGllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgZnVsbCBlbnRpdHkgaW5mbyBmb3IgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4AAPDZ5amyYglnZXRlbnRpdHmiAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbnRpdHkKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4gZW50aXR5IGluY2x1ZGluZyBpZGVudGl0eSwgY2FyZ28sIHNjaGVkdWxlIHN0YXRlLCBhbmQgdHlwZS1zcGVjaWZpYyBmaWVsZHMuAEw2SarssmILZ2V0aXRlbWRhdGGoAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtZGF0YQpzdW1tYXJ5OiAnR2V0IGZ1bGwgaXRlbSBjYXRhbG9nJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgY29tcGxldGUgaXRlbSBjYXRhbG9nIGFzIHRoZSBjb250cmFjdCBzZWVzIGl0LCBpbmNsdWRpbmcgdHlwZSwgc3VidHlwZSwgdGllciwgbWFzcywgYW5kIG90aGVyIHN0YXRpYyBtZXRhZGF0YS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgY2xpZW50cyB0byBtaXJyb3IgdGhlIGNvbnRyYWN0J3MgaXRlbSBkZWZpbml0aW9ucy4AAE5OquyyYgpnZXRpdGVtaWRzhgMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbWlkcwpzdW1tYXJ5OiAnR2V0IGl0ZW0gaWQgdG8gbmFtZSBtYXBwaW5ncycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgbWFwcGluZyBvZiBpdGVtIGlkIGNvbnN0YW50cyB0byB0aGVpciBjYW5vbmljYWwgc3RyaW5nIG5hbWVzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHJlc29sdmUgbnVtZXJpYyBpdGVtIGlkcyB0byBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVycy4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuAFT1WarssmILZ2V0aXRlbXR5cGUAgFX1WarssmIMZ2V0aXRlbXR5cGVziAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXR5cGVzCnN1bW1hcnk6ICdHZXQgaXRlbSB0eXBlIGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgaXRlbSB0eXBlIGVudW0gdmFsdWVzIGFuZCB0aGVpciBzdHJpbmcgbmFtZXMgKHJlc291cmNlLCBjb21wb25lbnQsIG1vZHVsZSwgZW50aXR5KS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgaXRlbSB0eXBlIGlkZW50aWZpZXJzLgBMVjJNB7NiC2dldGtpbmRtZXRh+AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0a2luZG1ldGEKc3VtbWFyeTogJ0dldCBlbnRpdHkga2luZCBtZXRhZGF0YScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGVudGl0eSBraW5kIHJlZ2lzdHJ5IGFuZCB0ZW1wbGF0ZSByZWdpc3RyeSwgaW5jbHVkaW5nIGVhY2gga2luZCdzIGNsYXNzaWZpY2F0aW9uLCBjYXBhYmlsaXR5IGZsYWdzLCBaLWNvb3JkaW5hdGUsIGFuZCBkZWZhdWx0IGxhYmVsLCBwbHVzIHRoZSBtYXBwaW5nIG9mIGVudGl0eSBpdGVtIGlkcyB0byBraW5kcyB3aXRoIGRpc3BsYXkgbGFiZWxzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGludGVycHJldCBlbnRpdHkga2luZHMgYW5kIGNhcGFiaWxpdGllcy4AJnXZIBqzYgtnZXRsb2NhdGlvbuICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2F0aW9uCnN1bW1hcnk6ICdHZXQgbG9jYXRpb24gaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2NhdGlvbiBpbmNsdWRpbmcgd2hldGhlciBhIHN5c3RlbSBleGlzdHMsIGFuZCBmb3IgZWFjaCBpdGVtOiBwcmljZSwgc3VwcGx5LCByYXJpdHkgbXVsdGlwbGllciwgYW5kIGxvY2F0aW9uIG11bHRpcGxpZXIuAIDJJiEas2IKZ2V0bG9jZGF0Yf4CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2RhdGEKc3VtbWFyeTogJ0dldCBkZXJpdmVkIGxvY2F0aW9uIGRhdGEnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgZGVyaXZlZCBsb2NhdGlvbiBkYXRhIGluY2x1ZGluZyBzdGF0aWMgcHJvcGVydGllcyAodHlwZSwgZGlmZmljdWx0eSwgc2VlZHMpIGZyb20gdGhlIGdhbWUgc2VlZCBhbmQgZXBvY2gtc3BlY2lmaWMgcHJvcGVydGllcyAoYWN0aXZlLCBzZWVkcykgZnJvbSB0aGUgY3VycmVudCBlcG9jaCBzZWVkLgCwqj4nKrNiC2dldG1vZHR5cGVz1gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bW9kdHlwZXMKc3VtbWFyeTogJ0dldCBtb2R1bGUgdHlwZSBlbnVtIHZhbHVlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgc2V0IG9mIG1vZHVsZSB0eXBlIGVudW0gdmFsdWVzIGFuZCB0aGVpciBzdHJpbmcgbmFtZXMgKGFueSwgZW5naW5lLCBnZW5lcmF0b3IsIGdhdGhlcmVyLCBsb2FkZXIsIHdhcnAsIGNyYWZ0ZXIsIGxhdW5jaGVyLCBzdG9yYWdlLCBoYXVsZXIpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBtb2R1bGUgc3VidHlwZSBpZGVudGlmaWVycyBhbmQgc2xvdCBjb21wYXRpYmlsaXR5LgAAVlEnKrNiCmdldG1vZHVsZXOAAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRtb2R1bGVzCnN1bW1hcnk6ICdHZXQgYWxsIG1vZHVsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIG1vZHVsZXMsIGluY2x1ZGluZyBlYWNoIG1vZHVsZSdzIGlkLCBtYXNzLCBzdWJ0eXBlLCBhbmQgdGllci4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBlbnVtZXJhdGUgaW5zdGFsbGFibGUgZXF1aXBtZW50LgAA8OcaNbNiCWdldG5lYXJied4DLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5lYXJieQpzdW1tYXJ5OiAnR2V0IG5lYXJieSByZWFjaGFibGUgc3lzdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBuZWFyYnkgc3lzdGVtcyByZWFjaGFibGUgYnkgYW4gZW50aXR5IGZyb20gaXRzIHByb2plY3RlZCBsb2NhdGlvbi4gUmV0dXJucyBjdXJyZW50IHN0YXRlICh3aXRoIGNvbXBsZXRlZCB0YXNrcyByZXNvbHZlZCksIHByb2plY3RlZCBzdGF0ZSAoYWZ0ZXIgYWxsIHNjaGVkdWxlZCB0YXNrcyksIGFuZCBhIGxpc3Qgb2YgcmVhY2hhYmxlIHN5c3RlbXMgd2l0aCBkaXN0YW5jZSwgZW5lcmd5IGNvc3QsIGZsaWdodCB0aW1lLCBhbmQgbWFya2V0IGluZm9ybWF0aW9uLgCAwubkNbNiCmdldG5mdGJhc2UAAABd0+U1s2IKZ2V0bmZ0aW5mb/ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5mdGluZm8Kc3VtbWFyeTogJ0dldCBORlQgc2NoZW1hIGFuZCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgQXRvbWljQXNzZXRzIHNjaGVtYXMgYW5kIHRlbXBsYXRlcyB0aGUgZ2FtZSBjb250cmFjdCBleHBlY3RzLCBwbHVzIHRoZSBjdXJyZW50IGBpdGVtX2lkIOKGkiAodGVtcGxhdGVfaWQsIHNjaGVtYV9uYW1lKWAgbWFwcGluZyBzdG9yZWQgaW4gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHN5bmMgYXRvbWljYXNzZXRzIHN0YXRlIHdpdGggdGhlIGNvbnRyYWN0LgAAuMqbWLNiCWdldHBsYXllcv0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHBsYXllcgpzdW1tYXJ5OiAnR2V0IHBsYXllciBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBsYXllciBpbmNsdWRpbmcgYmFsYW5jZSwgZGVidCwgbmV0d29ydGgsIGVudGl0eSBjb3VudHMsIGFuZCBwcmljaW5nIGZvciBuZXh0IHB1cmNoYXNlcy4gUmV0dXJucyBpc19wbGF5ZXI9ZmFsc2UgaWYgdGhlIGFjY291bnQgaGFzIG5vdCBqb2luZWQgdGhlIGdhbWUuoLLJ+NFbs2IMZ2V0cHJvanN0YXRlywMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cHJvanN0YXRlCnN1bW1hcnk6ICdHZXQgcHJvamVjdGVkIGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHByb2plY3RlZCBzdGF0ZSBvZiBhbiBlbnRpdHkgYWZ0ZXIgYXBwbHlpbmcgdGhlIG5leHQgdGFza19jb3VudCBzY2hlZHVsZWQgdGFza3MgKG9yIGFsbCB0YXNrcyBpZiB0YXNrX2NvdW50IGlzIG9taXR0ZWQpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHByZXZpZXcgdGhlIHJlc3VsdCBvZiBhbiBlbnRpdHkncyBzY2hlZHVsZSB3aXRob3V0IHJlc29sdmluZyBvbi1jaGFpbi4AAFDVIXWzYglnZXRyZWNpcGWmAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZWNpcGUKc3VtbWFyeTogJ0dldCBhIHNpbmdsZSBjcmFmdGluZyByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSByZWNpcGUgd2hvc2Ugb3V0cHV0IG1hdGNoZXMgdGhlIGdpdmVuIGl0ZW0gaWQsIGluY2x1ZGluZyBpdHMgaW5wdXRzLCBibGVuZCB3ZWlnaHRzLCBzdGF0IHNsb3RzLCBhbmQgcmVzb2x2ZWQgaXRlbSBtYXNzIGluZm8uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGlzcGxheSBjcmFmdGluZyByZXF1aXJlbWVudHMuAABW1SF1s2IKZ2V0cmVjaXBlc6wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4AAM4GYXWzYgpnZXRyZXNjYXRzngMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzY2F0cwpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIGNhdGVnb3J5IGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAob3JlLCBnYXMsIHJlZ29saXRoLCBiaW9tYXNzLCBjcnlzdGFsKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgcmVzb3VyY2Ugc3VidHlwZSBpZGVudGlmaWVycy4AsNpXYXWzYgtnZXRyZXNlcnZlc/wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc2VydmVzCnN1bW1hcnk6ICdHZXQgY3VycmVudCByZXNlcnZlIG1vZGlmaWNhdGlvbnMgYXQgYSBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyB0aGUgY2hhaW4ncyBtb2RpZmljYXRpb25zIHRvIGRlcml2ZWQgcmVzZXJ2ZXMgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGUgZm9yIHRoZSBjdXJyZW50IGVwb2NoIGFzIGEgbGlzdCBvZiB7c3RyYXR1bSwgcmVtYWluaW5nfSBwYWlycy4gU3RyYXRhIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZSB1c2UgdGhlaXIgZGVyaXZlZCBpbml0aWFsIHJlc2VydmUuIENvbXBvc2Ugd2l0aCBTREsgZGVyaXZhdGlvbiB0byBnZXQgdGhlIGZ1bGwgcGVyLWxvY2F0aW9uIHN0cmF0YSB2aWV3LoAVuppidbNiDGdldHJlc291cmNlc4cDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc291cmNlcwpzdW1tYXJ5OiAnR2V0IGFsbCByZXNvdXJjZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIHJlc291cmNlcywgaW5jbHVkaW5nIGVhY2ggcmVzb3VyY2UncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGdhdGhlcmFibGUgbWF0ZXJpYWxzLgAAADjTiLNiCGdldHNsb3RzuwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c2xvdHMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc2xvdCBsYXlvdXRzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgbW9kdWxlIHNsb3QgbGF5b3V0IGZvciBldmVyeSBlbnRpdHkgaXRlbSB0eXBlLCBsaXN0aW5nIHRoZSBvcmRlcmVkIHNsb3QgdHlwZXMgYXZhaWxhYmxlIGZvciBtb2R1bGUgaW5zdGFsbGF0aW9uLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRldGVybWluZSB3aGljaCBtb2R1bGUgdHlwZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBhIGdpdmVuIGVudGl0eSBodWxsLgCA1NncjLNiCmdldHN0cmF0dW3SAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdHJhdHVtCnN1bW1hcnk6ICdHZXQgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHJlc291cmNlIHN0cmF0dW0gZGF0YSBmb3IgYSBzcGVjaWZpYyBkZXB0aCBsYXllciBhdCBhIGNvb3JkaW5hdGUsIGluY2x1ZGluZyB0aGUgc3RyYXR1bSBzZWVkIGluZm8gYW5kIGRlcml2ZWQgcmVzb3VyY2Ugc3RhdHMugJW7RkqNs2IMZ2V0c3VtbWFyaWVz6AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3VtbWFyaWVzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHN1bW1hcmllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgbGlnaHR3ZWlnaHQgc3VtbWFyaWVzIG9mIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllciBpbmNsdWRpbmcgdHlwZSwgaWQsIG93bmVyLCBuYW1lLCBsb2NhdGlvbiwgYW5kIGlkbGUgc3RhdHVzLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4AVKRNXsqzYgtnZXR3b3JtaG9sZQCQHZ7m5qrpZQxncm91cHRyYW5zaXQAAKLa5uaq6WULZ3JvdXB0cmF2ZWyaBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBncm91cHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBtdWx0aXBsZSBlbnRpdGllcyB0b2dldGhlcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhdGUgZ3JvdXAgdHJhdmVsIGZvciBtdWx0aXBsZSBlbnRpdGllcyB0byBhIGRlc3RpbmF0aW9uLiBBbGwgZW50aXRpZXMgbXVzdCBiZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhbmQgb3duZWQgYnkgdGhlIGNhbGxlci4gQXQgbGVhc3Qgb25lIGVudGl0eSB3aXRoIGVuZ2luZXMgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aHJ1c3QuIEZsaWdodCBkdXJhdGlvbiBpcyBjYWxjdWxhdGVkIGZyb20gY29tYmluZWQgdGhydXN0IGFuZCB0b3RhbCBtYXNzIG9mIGFsbCBlbnRpdGllcy4gQ3JlYXRlcyBhbiBlbnRpdHlncm91cCBmb3IgYXRvbWljIHJlc29sdXRpb24gYW5kIGNhbmNlbGxhdGlvbi4AAAAAANCwaQRoYXNo+AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaGFzaApzdW1tYXJ5OiAnQ2FsY3VsYXRlIHNoYTI1NiBoYXNoJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYWxjdWxhdGVzIHRoZSBzaGEyNTYgaGFzaCBvZiBhIHN0cmluZyBiYXNlZCB1c2luZyB0aGUgZ2FtZSBzZWVkLgAAAECE0rBpB2hhc2g1MTL7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoNTEyCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhNTEyIGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTUxMiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuACi7BuVLq3QLaW1wb3J0Y2FyZ28A4LPLU+VLq3QMaW1wb3J0ZW50aXR5AACqppflS6t0C2ltcG9ydGdyb3VwAHCVN7HmS6t0DGltcG9ydHBsYXllcgC6r8Lq5kurdA1pbXBvcnRyZXNlcnZlAABUNhnnS6t0C2ltcG9ydHN0YXRlAAAAAAAAMB19BGpvaW7EAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBqb2luCnN1bW1hcnk6ICdKb2luIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSm9pbiBhIGdhbWUgb2YgU2hpcGxvYWQAAAAAAJAMjQRsb2FkAAAAiFcz6fKaCW5mdGltZ3VybLIDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5mdGltZ3VybApzdW1tYXJ5OiAnR2V0IE5GVCBpbWFnZSBVUkwgZm9yIGEgY2FyZ28gaXRlbScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGltYWdlIFVSTCB0aGUgY29udHJhY3QgZW1pdHMgZm9yIGEgZ2l2ZW4gY2FyZ28gaXRlbSwgb3B0aW9uYWxseSBzY29wZWQgdG8gYSBsb2NhdGlvbi4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgTkZUIHJlbmRlcmVycyB0byBmZXRjaCB0aGUgY2Fub25pY2FsIGFydHdvcmsgZm9yIGFuIGl0ZW0gb3IgcGFja2VkIGVudGl0eS4AAAAA+OUynQZub3RpZnmKAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBub3RpZnkKc3VtbWFyeTogJ1Rhc2sgbGlmZWN5Y2xlIG5vdGlmaWNhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIHRoYXQgbm90aWZpZXMgZW50aXR5IG93bmVycyBvZiB0YXNrIGxpZmVjeWNsZSBldmVudHMgKHJlc29sdmVkLCBjYW5jZWxsZWQpLiBDYWxsZWQgaW5saW5lIHdoZW4gdGFza3MgY2hhbmdlIHN0YXRlLiBVc2VzIHJlcXVpcmVfcmVjaXBpZW50IHRvIGVuYWJsZSBvZmYtY2hhaW4gbW9uaXRvcmluZyB2aWEgYWN0aW9uIHRyYWNlcy4AAGXXIIVMrApwbGFjZWNhcmdvyQQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcGxhY2VjYXJnbwpzdW1tYXJ5OiAnUmVzdG9yZSBORlQgY2FyZ28gb250byBhIGhvc3QgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gY2FsbGVkIGlubGluZSBieSB0aGUgcGxhdGZvcm0gY29udHJhY3Qgb25seS4gUmVzdG9yZXMgdGhlIGNhcmdvIHJlY29yZGVkIGluIGFuIHVud3JhcHBlZCBORlQgb250byBhIGhvc3QgZW50aXR5LiBWYWxpZGF0ZXMgaG9zdCBvd25lcnNoaXAsIGxvYWRlcnMsIGFuZCByZW1haW5pbmcgY2FwYWNpdHksIGRlc2VyaWFsaXplcyB0aGUgTkZUJ3MgaXRlbSBkYXRhLCBhbmQgYXBwZW5kcyBhbiB1bndyYXAgdGFzayB0byBkZWxpdmVyIHRoZSBjYXJnbyB0byB0aGUgaG9zdC4gVGhlIHBsYXRmb3JtIGNvbnRyYWN0IGNyZWRpdHMgdGhlIGRlcG9zaXQgcmVmdW5kIGFuZCBidXJucyB0aGUgYXNzZXQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AfHZ5KoVMrAtwbGFjZWVudGl0ecAELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHBsYWNlZW50aXR5CnN1bW1hcnk6ICdNYXRlcmlhbGl6ZSBhIHBhY2tlZC1lbnRpdHkgTkZUIGFzIGEgbGl2ZSBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IHRoZSBwbGF0Zm9ybSBjb250cmFjdCBvbmx5LiBFbXBsYWNlcyBhIGxpdmUgb3JiaXRhbCB2ZXNzZWwgKHNoaXAgb3IgY29udGFpbmVyKSBmcm9tIGl0cyBwYWNrZWQtZW50aXR5IE5GVCBkYXRhIGF0IHRoZSByZWNvcmRlZCB3cmFwIG9yaWdpbiwgdGhlbiBxdWV1ZXMgdHJhdmVsIGFuZCByZWNoYXJnZSB0YXNrcyB0byBkZWxpdmVyIGl0IHRvIHRoZSB0YXJnZXQgbmV4dXMgYXQgZnVsbCBlbmVyZ3kuIFRoZSBwbGF0Zm9ybSBjb250cmFjdCBjcmVkaXRzIHRoZSBkZXBvc2l0IHJlZnVuZCBhbmQgYnVybnMgdGhlIGFzc2V0LiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAAAAil3TkLoIcmVjaGFyZ2XNAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZWNoYXJnZQpzdW1tYXJ5OiAnUmVjaGFyZ2Ugc2hpcCBlbmVyZ3knCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClNjaGVkdWxlIGEgcmVjaGFyZ2UgdGFzayBmb3IgYW4gZW50aXR5IHRvIHJlc3RvcmUgZW5lcmd5IHRvIGZ1bGwgY2FwYWNpdHkuIFRoZSByZWNoYXJnZSBkdXJhdGlvbiBkZXBlbmRzIG9uIGN1cnJlbnQgZW5lcmd5IGxldmVsIGFuZCByZWNoYXJnZSByYXRlLuCzy1M1fJe6DHJlZnJzaGVudGl0ebgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlZnJzaGVudGl0eQpzdW1tYXJ5OiAnUmVmcmVzaCBkZXJpdmVkIGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVjb21wdXRlIGRlcml2ZWQgZmllbGRzIG9uIGFuIGVudGl0eSBmcm9tIGl0cyBjdXJyZW50IGNhcmdvIGFuZCBtb2R1bGVzLCByZWZyZXNoaW5nIGNhcGFiaWxpdHkgc3RhdHMgYW5kIGNhcmdvIG1hc3MuIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlIHdpdGggbm8gc2NoZWR1bGVkIHRhc2tzLiBVc2VkIHRvIHJlY29uY2lsZSBkZXJpdmVkIHN0YXRlIGFmdGVyIGRhdGEgbWlncmF0aW9ucyBvciBjb250cmFjdCB1cGdyYWRlcy6gIjKXqk2lugxyZW1vdmVvcmFjbGUAAAAAAChpproGcmVuYW1lAAAAAEDtSLG6B3Jlc29sdmXQAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZXNvbHZlCnN1bW1hcnk6ICdDb21wbGV0ZSBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlc29sdmUgY29tcGxldGVkIHRhc2tzIGluIGFuIGVudGl0eSdzIHNjaGVkdWxlLCBhcHBseWluZyB0aGVpciBlZmZlY3RzIChyZWNoYXJnZSBlbmVyZ3ksIHVwZGF0ZSBsb2NhdGlvbiwgbG9hZC91bmxvYWQgY2FyZ28pLiBJZiBjb3VudCBpcyBzcGVjaWZpZWQsIHJlc29sdmUgZXhhY3RseSB0aGF0IG1hbnkgdGFza3M7IG90aGVyd2lzZSByZXNvbHZlIGFsbCBjb21wbGV0ZWQgdGFza3MuIEZhaWxzIGlmIGNvdW50IGV4Y2VlZHMgdGhlIG51bWJlciBvZiBjb21wbGV0ZWQgdGFza3MuAECMRu1IsboKcmVzb2x2ZWFsbAAAAAAARKO2ugZyZXZlYWwAAAAAKupEpbwIcm1tb2R1bGW8Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW1vZHVsZQpzdW1tYXJ5OiAnUmVtb3ZlIGEgbW9kdWxlIGZyb20gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgYW4gaW5zdGFsbGVkIG1vZHVsZSBmcm9tIGEgc2xvdCBvbiBhIGxpdmUgZW50aXR5IG9yIGEgcGFja2VkIGVudGl0eSBpbiBjYXJnby4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBubyBzY2hlZHVsZWQgdGFza3MuIFRoZSBtb2R1bGUgaXMgcmV0dXJuZWQgdG8gY2FyZ28uIEZhaWxzIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgaGF2ZSBlbm91Z2ggY2FyZ28gY2FwYWNpdHkgdG8gaG9sZCB0aGUgcmV0dXJuZWQgbW9kdWxlLgAAAGyhvKa8CHJtbmZ0Y2ZnoQMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcm1uZnRjZmcKc3VtbWFyeTogJ1JlbW92ZSBORlQgdGVtcGxhdGUgbWFwcGluZyBmb3IgYW4gaXRlbScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVtb3ZlIHRoZSBBdG9taWNBc3NldHMgdGVtcGxhdGUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIGlkIGZyb20gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBBZnRlciByZW1vdmFsIHRoZSBpdGVtIGNhbiBubyBsb25nZXIgYmUgd3JhcHBlZCBvciB1bndyYXBwZWQgdW50aWwgYSBuZXcgbWFwcGluZyBpcyBzZXQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAMDpUoqywglzZXRjb29yZHMAAABgC+U1s8IJc2V0bmZ0Y2ZnxAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc2V0bmZ0Y2ZnCnN1bW1hcnk6ICdTZXQgTkZUIHRlbXBsYXRlIG1hcHBpbmcgZm9yIGFuIGl0ZW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkJpbmQgYW4gaXRlbSBpZCB0byBhbiBBdG9taWNBc3NldHMgdGVtcGxhdGUgaWQgYW5kIHNjaGVtYSBuYW1lLiBVc2VkIHRvIGNvbmZpZ3VyZSBob3cgdGhlIGNvbnRyYWN0IG1pbnRzIGFuZCByZWNvZ25pemVzIE5GVHMgZm9yIGEgZ2l2ZW4gaXRlbS4gSW5zZXJ0cyBhIG5ldyBtYXBwaW5nIGlmIG9uZSBkb2VzIG5vdCBleGlzdCwgb3IgdXBkYXRlcyB0aGUgZXhpc3RpbmcgbWFwcGluZy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LpAibVjdlrPCDHNldHRocmVzaG9sZAAAMqaomsuzwgtzZXR3cmFwY29zdAAAgFKrmsuzwgpzZXR3cmFwZmVlAAAAoOwaxGnGCXN0b3djYXJnb9UFLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHN0b3djYXJnbwpzdW1tYXJ5OiAnUmVzZXJ2ZSBhIGNhcmdvIHN0YWNrIGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIGNhbGxlZCBpbmxpbmUgYnkgdGhlIHBsYXRmb3JtIGNvbnRyYWN0IG9ubHkuIFJlc2VydmVzIGFuZCBjb25zdW1lcyBhIGNhcmdvIHN0YWNrIG9uIGEgbGl2ZSBlbnRpdHkgZm9yIHdyYXBwaW5nIGludG8gYW4gTkZULiBWYWxpZGF0ZXMgZW50aXR5IG93bmVyc2hpcCwgbG9hZGVycywgYW5kIHByZXNlbmNlIGF0IHRoZSBuZXh1cywgYW5kIGNvbmZpcm1zIHRoZSB0YXJnZXQgY2FyZ28gc3RhY2sgaXMgYXZhaWxhYmxlIGFuZCBub3QgcmVzZXJ2ZWQgYnkgYSBwZW5kaW5nIHRhc2suIENvbXB1dGVzIHRoZSB3cmFwIGNvc3QgYW5kIGZlZSwgZGViaXRzIHRoZW0gZnJvbSB0aGUgb3duZXIncyBwbGF0Zm9ybSBkZXBvc2l0IGJhbGFuY2UsIGRlcml2ZXMgdGhlIE5GVCdzIGltbXV0YWJsZSBkYXRhLCBhbmQgbWludHMgdGhlIE5GVCBpbmxpbmUgYXMgdGhlIGdhbWUgY29udHJhY3QgYmVmb3JlIGNvbnN1bWluZyB0aGUgY2FyZ28uIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AgM8uT8VpxgpzdG93ZW50aXR5mQUtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Rvd2VudGl0eQpzdW1tYXJ5OiAnUmVzZXJ2ZSBhbiBlbnRpdHkgZm9yIHdyYXBwaW5nIGludG8gYW4gTkZUJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gY2FsbGVkIGlubGluZSBieSB0aGUgcGxhdGZvcm0gY29udHJhY3Qgb25seS4gUmVzZXJ2ZXMgYSB3aG9sZSBlbnRpdHkgKHNoaXAsIGNvbnRhaW5lciwgb3IgcGxhbmV0YXJ5IHN0cnVjdHVyZSkgZm9yIHdyYXBwaW5nIGludG8gYW4gTkZULiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIGVtcHR5IGNhcmdvIGFuZCBubyBzY2hlZHVsZWQgdGFza3MuIENvbXB1dGVzIHRoZSB3cmFwIGNvc3QgYW5kIGZlZSwgZGViaXRzIHRoZW0gZnJvbSB0aGUgb3duZXIncyBwbGF0Zm9ybSBkZXBvc2l0IGJhbGFuY2UsIGRlcml2ZXMgdGhlIGVudGl0eSBORlQncyBpbW11dGFibGUgZGF0YSwgbWludHMgdGhlIE5GVCBpbmxpbmUgYXMgdGhlIGdhbWUgY29udHJhY3QsIGFuZCBlcmFzZXMgdGhlIGVudGl0eSBmcm9tIHRoZSB3b3JsZC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgCAijpRWQ3HCnN3YXBtb2R1bGUAAAAAIDs8zc0HdHJhbnNpdAAAAAAARLXNzQZ0cmF2ZWz7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB0cmF2ZWwKc3VtbWFyeTogJ01vdmUgYSBzaGlwJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSB0cmF2ZWwgb2YgYW4gZW50aXR5IGZyb20gaXRzIGN1cnJlbnQgbG9jYXRpb24gdG8gYSBuZXcgZGVzdGluYXRpb24uAAAAnsaq0tQIdW5kZXBsb3nnBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB1bmRlcGxveQpzdW1tYXJ5OiAnUGFjayBhIGRlcGxveWVkIGVudGl0eSBpbnRvIGEgaG9zdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUGFjayBhbiBlbnRpdHkgaW50byBhIGhvc3QgZW50aXR5J3MgY2FyZ28gYXMgYSBwYWNrZWQtZW50aXR5IGl0ZW0uIEhvc3QgYW5kIHRhcmdldCBtdXN0IHNoYXJlIHRoZSBzYW1lIG93bmVyIGFuZCBjb29yZGluYXRlcywgdGhlIGhvc3QgbXVzdCBoYXZlIGxvYWRlcnMgYW5kIGVub3VnaCBjYXBhY2l0eSBmb3IgdGhlIHBhY2tlZCBtYXNzLCBhbmQgdGhlIHRhcmdldCBtdXN0IGJlIGlkbGUgd2l0aCBlbXB0eSBjYXJnby4gQ3JlYXRlcyBhbiBlbnRpdHlncm91cCBhbmQgc2NoZWR1bGVzIHVuZGVwbG95IHRhc2tzIG9uIGJvdGggZW50aXRpZXM7IG9uIHJlc29sdXRpb24gdGhlIHRhcmdldCBpcyBlcmFzZWQgYW5kIHRoZSBwYWNrZWQgZW50aXR5IGlzIGFkZGVkIHRvIHRoZSBob3N0J3MgY2FyZ28uIEludmVyc2Ugb2YgZGVwbG95LgAAAAAkQ+PUBnVubG9hZAAAAAAAAFCv4QR3YXJwnwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2FycApzdW1tYXJ5OiAnV2FycCB0byBhIGRlc3RpbmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YW50bHkgdGVsZXBvcnQgYW4gZW50aXR5IHRvIGEgZGVzdGluYXRpb24gc3lzdGVtLiBSZXF1aXJlcyB3YXJwIGNhcGFiaWxpdHksIGZ1bGwgZW5lcmd5LCBlbXB0eSBjYXJnbywgYW5kIGFuIGVtcHR5IHNjaGVkdWxlLiBUaGUgZGVzdGluYXRpb24gbXVzdCBiZSBhIHZhbGlkIHN5c3RlbSB3aXRoaW4gd2FycCByYW5nZS4gUmVzb2x2ZXMgaW1tZWRpYXRlbHkgYXMgYSB6ZXJvLWR1cmF0aW9uIHRhc2suAAAAAACgquMEd2lwZbIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGUKc3VtbWFyeTogJ0RFQlVHOiB3aXBlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLREAAAAAAMquQQNpNjQAAAljYXJnb19yb3cAAAAAYOlMRANpNjQAAAljbGFpbV9yb3cAAAAAZCclRQNpNjQAAApjb21taXRfcm93AAAAAPjs8lQDaTY0AAAKZW50aXR5X3JvdwCqppf57PJUA2k2NAAAD2VudGl0eWdyb3VwX3JvdwAAsAr77PJUA2k2NAAADmVudGl0eV9zZXFfcm93AAAAAICGaFUDaTY0AAAJZXBvY2hfcm93AABgbk2K8poDaTY0AAANbmZ0Y29uZmlnX3JvdwAAYAupiMylA2k2NAAAEW9yYWNsZV9jb25maWdfcm93AAAAAKuIzKUDaTY0AAAKb3JhY2xlX3JvdwAAAABc5U2sA2k2NAAACnBsYXllcl9yb3cAAABA7auwugNpNjQAAAtyZXNlcnZlX3JvdwAAAABEo7a6A2k2NAAACnJldmVhbF9yb3cAAAAAAJVNxgNpNjQAAAlzdGF0ZV9yb3cAAAAAAKyqzwNpNjQAAAl0eXBlc19yb3cAAHNrUlTN5QNpNjQAAA53cmFwY29uZmlnX3JvdwAAABlTVM3lA2k2NAAADHdyYXBjb3N0X3JvdwERU2hpcGxvYWQgKFNlcnZlcikRU2hpcGxvYWQgKFNlcnZlcikAAAA5AADINNYUnT4MdGFza19yZXN1bHRzAAAAAESFpkEOY2FuY2VsX3Jlc3VsdHMAAMg0VulMRAx0YXNrX3Jlc3VsdHMAAAAAgLzMRQx0YXNrX3Jlc3VsdHMAAAANu0ilSgx0YXNrX3Jlc3VsdHMAAAAAeBqrSgx0YXNrX3Jlc3VsdHMAgM8uT4WwSgZzdHJpbmcAAAAAXNWyYQx0YXNrX3Jlc3VsdHMAAGBuTYqyYgtnYW1lX2NvbmZpZwBAdphWlbJiDmV4dGVuZGVkX2Fzc2V0ABSaJmOXsmIGdWludDY0AFQ8jrmosmIIdWludDE2W10AAMAR5amyYgtlbnVtX3Jlc3VsdACwctnlqbJiDWVudGl0eV9pbmZvW10AAPDZ5amyYgtlbnRpdHlfaW5mbwBMNkmq7LJiD2l0ZW1kYXRhX3Jlc3VsdAAATk6q7LJiD2l0ZW1faWRzX3Jlc3VsdAAAAFiq7LJiCml0ZW1zX2luZm8AVPVZquyyYgV1aW50OIBV9Vmq7LJiC2VudW1fcmVzdWx0AExWMk0Hs2IQa2luZF9tZXRhX3Jlc3VsdAAmddkgGrNiDWxvY2F0aW9uX2luZm8AgMkmIRqzYhBsb2NhdGlvbl9kZXJpdmVkALCqPicqs2ILZW51bV9yZXN1bHQAAFZRJyqzYg5tb2R1bGVzX3Jlc3VsdAAA8OcaNbNiC25lYXJieV9pbmZvAIDC5uQ1s2IIc3RyaW5nW10AAF3T5TWzYg5uZnRpbmZvX3Jlc3VsdAAAuMqbWLNiC3BsYXllcl9pbmZvoLLJ+NFbs2IPcHJvamVjdGVkX3N0YXRlAABQ1SF1s2IOcmVjaXBlc19yZXN1bHQAAFbVIXWzYg5yZWNpcGVzX3Jlc3VsdAAAzgZhdbNiC2VudW1fcmVzdWx0ALDaV2F1s2ITc3RyYXR1bV9yZW1haW5pbmdbXYAVuppidbNiEHJlc291cmNlc19yZXN1bHQAAAA404izYhVlbnRpdHlfbGF5b3V0c19yZXN1bHQAgNTZ3IyzYgxzdHJhdHVtX2RhdGGAlbtGSo2zYhBlbnRpdHlfc3VtbWFyeVtdAFSkTV7Ks2INd29ybWhvbGVfaW5mb5AdnubmqullDHRhc2tfcmVzdWx0cwCi2ubmqullDHRhc2tfcmVzdWx0cwAAAAAA0LBpC2NoZWNrc3VtMjU2AAAAQITSsGkLY2hlY2tzdW01MTIAAAAAAJAMjQx0YXNrX3Jlc3VsdHMAAIhXM+nymgZzdHJpbmcAAGXXIIVMrAx0YXNrX3Jlc3VsdHMAfHZ5KoVMrAx0YXNrX3Jlc3VsdHMAAACKXdOQugx0YXNrX3Jlc3VsdHMAAABA7Uixug9yZXNvbHZlX3Jlc3VsdHMAQIxG7UixuhJyZXNvbHZlYWxsX3Jlc3VsdHMAAKDsGsRpxgx0YXNrX3Jlc3VsdHMAgM8uT8Vpxgx0YXNrX3Jlc3VsdHMAAAAgOzzNzQx0YXNrX3Jlc3VsdHMAAAAARLXNzQx0YXNrX3Jlc3VsdHMAAACexqrS1Ax0YXNrX3Jlc3VsdHMAAAAAJEPj1Ax0YXNrX3Jlc3VsdHMAAAAAAFCv4Qx0YXNrX3Jlc3VsdHM=');
|
|
452
452
|
const abi = antelope.ABI.from(abiBlob);
|
|
453
453
|
exports.ServerTypes = void 0;
|
|
454
454
|
(function (Types) {
|
|
@@ -865,22 +865,31 @@ exports.ServerTypes = void 0;
|
|
|
865
865
|
tslib.__decorate([
|
|
866
866
|
antelope.Struct.field(antelope.UInt64, { optional: true })
|
|
867
867
|
], craft.prototype, "target", void 0);
|
|
868
|
+
tslib.__decorate([
|
|
869
|
+
antelope.Struct.field(antelope.UInt8, { optional: true })
|
|
870
|
+
], craft.prototype, "slot", void 0);
|
|
868
871
|
craft = tslib.__decorate([
|
|
869
872
|
antelope.Struct.type('craft')
|
|
870
873
|
], craft);
|
|
871
874
|
Types.craft = craft;
|
|
872
|
-
let
|
|
875
|
+
let crafter_lane = class crafter_lane extends antelope.Struct {
|
|
873
876
|
};
|
|
877
|
+
tslib.__decorate([
|
|
878
|
+
antelope.Struct.field(antelope.UInt8)
|
|
879
|
+
], crafter_lane.prototype, "slot_index", void 0);
|
|
874
880
|
tslib.__decorate([
|
|
875
881
|
antelope.Struct.field(antelope.UInt16)
|
|
876
|
-
],
|
|
882
|
+
], crafter_lane.prototype, "speed", void 0);
|
|
877
883
|
tslib.__decorate([
|
|
878
884
|
antelope.Struct.field(antelope.UInt32)
|
|
879
|
-
],
|
|
880
|
-
|
|
881
|
-
antelope.Struct.
|
|
882
|
-
],
|
|
883
|
-
|
|
885
|
+
], crafter_lane.prototype, "drain", void 0);
|
|
886
|
+
tslib.__decorate([
|
|
887
|
+
antelope.Struct.field(antelope.UInt16)
|
|
888
|
+
], crafter_lane.prototype, "output_pct", void 0);
|
|
889
|
+
crafter_lane = tslib.__decorate([
|
|
890
|
+
antelope.Struct.type('crafter_lane')
|
|
891
|
+
], crafter_lane);
|
|
892
|
+
Types.crafter_lane = crafter_lane;
|
|
884
893
|
let demolish = class demolish extends antelope.Struct {
|
|
885
894
|
};
|
|
886
895
|
tslib.__decorate([
|
|
@@ -974,51 +983,60 @@ exports.ServerTypes = void 0;
|
|
|
974
983
|
antelope.Struct.type('warp_stats')
|
|
975
984
|
], warp_stats);
|
|
976
985
|
Types.warp_stats = warp_stats;
|
|
977
|
-
let
|
|
986
|
+
let hauler_stats = class hauler_stats extends antelope.Struct {
|
|
978
987
|
};
|
|
988
|
+
tslib.__decorate([
|
|
989
|
+
antelope.Struct.field(antelope.UInt8)
|
|
990
|
+
], hauler_stats.prototype, "capacity", void 0);
|
|
979
991
|
tslib.__decorate([
|
|
980
992
|
antelope.Struct.field(antelope.UInt16)
|
|
981
|
-
],
|
|
993
|
+
], hauler_stats.prototype, "efficiency", void 0);
|
|
982
994
|
tslib.__decorate([
|
|
983
995
|
antelope.Struct.field(antelope.UInt32)
|
|
984
|
-
],
|
|
996
|
+
], hauler_stats.prototype, "drain", void 0);
|
|
997
|
+
hauler_stats = tslib.__decorate([
|
|
998
|
+
antelope.Struct.type('hauler_stats')
|
|
999
|
+
], hauler_stats);
|
|
1000
|
+
Types.hauler_stats = hauler_stats;
|
|
1001
|
+
let gatherer_lane = class gatherer_lane extends antelope.Struct {
|
|
1002
|
+
};
|
|
1003
|
+
tslib.__decorate([
|
|
1004
|
+
antelope.Struct.field(antelope.UInt8)
|
|
1005
|
+
], gatherer_lane.prototype, "slot_index", void 0);
|
|
985
1006
|
tslib.__decorate([
|
|
986
1007
|
antelope.Struct.field(antelope.UInt16)
|
|
987
|
-
],
|
|
988
|
-
gatherer_stats = tslib.__decorate([
|
|
989
|
-
antelope.Struct.type('gatherer_stats')
|
|
990
|
-
], gatherer_stats);
|
|
991
|
-
Types.gatherer_stats = gatherer_stats;
|
|
992
|
-
let loader_stats = class loader_stats extends antelope.Struct {
|
|
993
|
-
};
|
|
1008
|
+
], gatherer_lane.prototype, "yield", void 0);
|
|
994
1009
|
tslib.__decorate([
|
|
995
1010
|
antelope.Struct.field(antelope.UInt32)
|
|
996
|
-
],
|
|
1011
|
+
], gatherer_lane.prototype, "drain", void 0);
|
|
997
1012
|
tslib.__decorate([
|
|
998
1013
|
antelope.Struct.field(antelope.UInt16)
|
|
999
|
-
],
|
|
1014
|
+
], gatherer_lane.prototype, "depth", void 0);
|
|
1000
1015
|
tslib.__decorate([
|
|
1001
|
-
antelope.Struct.field(antelope.
|
|
1002
|
-
],
|
|
1003
|
-
|
|
1004
|
-
antelope.Struct.type('
|
|
1005
|
-
],
|
|
1006
|
-
Types.
|
|
1007
|
-
let
|
|
1016
|
+
antelope.Struct.field(antelope.UInt16)
|
|
1017
|
+
], gatherer_lane.prototype, "output_pct", void 0);
|
|
1018
|
+
gatherer_lane = tslib.__decorate([
|
|
1019
|
+
antelope.Struct.type('gatherer_lane')
|
|
1020
|
+
], gatherer_lane);
|
|
1021
|
+
Types.gatherer_lane = gatherer_lane;
|
|
1022
|
+
let loader_lane = class loader_lane extends antelope.Struct {
|
|
1008
1023
|
};
|
|
1009
1024
|
tslib.__decorate([
|
|
1010
1025
|
antelope.Struct.field(antelope.UInt8)
|
|
1011
|
-
],
|
|
1026
|
+
], loader_lane.prototype, "slot_index", void 0);
|
|
1027
|
+
tslib.__decorate([
|
|
1028
|
+
antelope.Struct.field(antelope.UInt32)
|
|
1029
|
+
], loader_lane.prototype, "mass", void 0);
|
|
1012
1030
|
tslib.__decorate([
|
|
1013
1031
|
antelope.Struct.field(antelope.UInt16)
|
|
1014
|
-
],
|
|
1032
|
+
], loader_lane.prototype, "thrust", void 0);
|
|
1015
1033
|
tslib.__decorate([
|
|
1016
|
-
antelope.Struct.field(antelope.
|
|
1017
|
-
],
|
|
1018
|
-
|
|
1019
|
-
antelope.Struct.type('
|
|
1020
|
-
],
|
|
1021
|
-
Types.
|
|
1034
|
+
antelope.Struct.field(antelope.UInt16)
|
|
1035
|
+
], loader_lane.prototype, "output_pct", void 0);
|
|
1036
|
+
loader_lane = tslib.__decorate([
|
|
1037
|
+
antelope.Struct.type('loader_lane')
|
|
1038
|
+
], loader_lane);
|
|
1039
|
+
Types.loader_lane = loader_lane;
|
|
1022
1040
|
let task = class task extends antelope.Struct {
|
|
1023
1041
|
};
|
|
1024
1042
|
tslib.__decorate([
|
|
@@ -1144,18 +1162,18 @@ exports.ServerTypes = void 0;
|
|
|
1144
1162
|
tslib.__decorate([
|
|
1145
1163
|
antelope.Struct.field(energy_stats, { optional: true })
|
|
1146
1164
|
], entity_info.prototype, "generator", void 0);
|
|
1147
|
-
tslib.__decorate([
|
|
1148
|
-
antelope.Struct.field(gatherer_stats, { optional: true })
|
|
1149
|
-
], entity_info.prototype, "gatherer", void 0);
|
|
1150
|
-
tslib.__decorate([
|
|
1151
|
-
antelope.Struct.field(loader_stats, { optional: true })
|
|
1152
|
-
], entity_info.prototype, "loaders", void 0);
|
|
1153
1165
|
tslib.__decorate([
|
|
1154
1166
|
antelope.Struct.field(hauler_stats, { optional: true })
|
|
1155
1167
|
], entity_info.prototype, "hauler", void 0);
|
|
1156
1168
|
tslib.__decorate([
|
|
1157
|
-
antelope.Struct.field(
|
|
1158
|
-
], entity_info.prototype, "
|
|
1169
|
+
antelope.Struct.field(gatherer_lane, { array: true })
|
|
1170
|
+
], entity_info.prototype, "gatherer_lanes", void 0);
|
|
1171
|
+
tslib.__decorate([
|
|
1172
|
+
antelope.Struct.field(crafter_lane, { array: true })
|
|
1173
|
+
], entity_info.prototype, "crafter_lanes", void 0);
|
|
1174
|
+
tslib.__decorate([
|
|
1175
|
+
antelope.Struct.field(loader_lane, { array: true })
|
|
1176
|
+
], entity_info.prototype, "loader_lanes", void 0);
|
|
1159
1177
|
tslib.__decorate([
|
|
1160
1178
|
antelope.Struct.field(lane, { array: true })
|
|
1161
1179
|
], entity_info.prototype, "lanes", void 0);
|
|
@@ -1381,6 +1399,9 @@ exports.ServerTypes = void 0;
|
|
|
1381
1399
|
tslib.__decorate([
|
|
1382
1400
|
antelope.Struct.field(antelope.UInt32)
|
|
1383
1401
|
], gather.prototype, "quantity", void 0);
|
|
1402
|
+
tslib.__decorate([
|
|
1403
|
+
antelope.Struct.field(antelope.UInt8, { optional: true })
|
|
1404
|
+
], gather.prototype, "slot", void 0);
|
|
1384
1405
|
gather = tslib.__decorate([
|
|
1385
1406
|
antelope.Struct.type('gather')
|
|
1386
1407
|
], gather);
|
|
@@ -1412,6 +1433,24 @@ exports.ServerTypes = void 0;
|
|
|
1412
1433
|
antelope.Struct.type('getdeposit')
|
|
1413
1434
|
], getdeposit);
|
|
1414
1435
|
Types.getdeposit = getdeposit;
|
|
1436
|
+
let getdistance = class getdistance extends antelope.Struct {
|
|
1437
|
+
};
|
|
1438
|
+
tslib.__decorate([
|
|
1439
|
+
antelope.Struct.field(antelope.Int64)
|
|
1440
|
+
], getdistance.prototype, "ax", void 0);
|
|
1441
|
+
tslib.__decorate([
|
|
1442
|
+
antelope.Struct.field(antelope.Int64)
|
|
1443
|
+
], getdistance.prototype, "ay", void 0);
|
|
1444
|
+
tslib.__decorate([
|
|
1445
|
+
antelope.Struct.field(antelope.Int64)
|
|
1446
|
+
], getdistance.prototype, "bx", void 0);
|
|
1447
|
+
tslib.__decorate([
|
|
1448
|
+
antelope.Struct.field(antelope.Int64)
|
|
1449
|
+
], getdistance.prototype, "by", void 0);
|
|
1450
|
+
getdistance = tslib.__decorate([
|
|
1451
|
+
antelope.Struct.type('getdistance')
|
|
1452
|
+
], getdistance);
|
|
1453
|
+
Types.getdistance = getdistance;
|
|
1415
1454
|
let geteligible = class geteligible extends antelope.Struct {
|
|
1416
1455
|
};
|
|
1417
1456
|
tslib.__decorate([
|
|
@@ -1649,6 +1688,39 @@ exports.ServerTypes = void 0;
|
|
|
1649
1688
|
antelope.Struct.type('getsummaries')
|
|
1650
1689
|
], getsummaries);
|
|
1651
1690
|
Types.getsummaries = getsummaries;
|
|
1691
|
+
let getwormhole = class getwormhole extends antelope.Struct {
|
|
1692
|
+
};
|
|
1693
|
+
tslib.__decorate([
|
|
1694
|
+
antelope.Struct.field(antelope.Int64)
|
|
1695
|
+
], getwormhole.prototype, "x", void 0);
|
|
1696
|
+
tslib.__decorate([
|
|
1697
|
+
antelope.Struct.field(antelope.Int64)
|
|
1698
|
+
], getwormhole.prototype, "y", void 0);
|
|
1699
|
+
getwormhole = tslib.__decorate([
|
|
1700
|
+
antelope.Struct.type('getwormhole')
|
|
1701
|
+
], getwormhole);
|
|
1702
|
+
Types.getwormhole = getwormhole;
|
|
1703
|
+
let grouptransit = class grouptransit extends antelope.Struct {
|
|
1704
|
+
};
|
|
1705
|
+
tslib.__decorate([
|
|
1706
|
+
antelope.Struct.field(entity_ref, { array: true })
|
|
1707
|
+
], grouptransit.prototype, "entities", void 0);
|
|
1708
|
+
tslib.__decorate([
|
|
1709
|
+
antelope.Struct.field(antelope.Int64)
|
|
1710
|
+
], grouptransit.prototype, "ax", void 0);
|
|
1711
|
+
tslib.__decorate([
|
|
1712
|
+
antelope.Struct.field(antelope.Int64)
|
|
1713
|
+
], grouptransit.prototype, "ay", void 0);
|
|
1714
|
+
tslib.__decorate([
|
|
1715
|
+
antelope.Struct.field(antelope.Int64)
|
|
1716
|
+
], grouptransit.prototype, "bx", void 0);
|
|
1717
|
+
tslib.__decorate([
|
|
1718
|
+
antelope.Struct.field(antelope.Int64)
|
|
1719
|
+
], grouptransit.prototype, "by", void 0);
|
|
1720
|
+
grouptransit = tslib.__decorate([
|
|
1721
|
+
antelope.Struct.type('grouptransit')
|
|
1722
|
+
], grouptransit);
|
|
1723
|
+
Types.grouptransit = grouptransit;
|
|
1652
1724
|
let grouptravel = class grouptravel extends antelope.Struct {
|
|
1653
1725
|
};
|
|
1654
1726
|
tslib.__decorate([
|
|
@@ -2014,6 +2086,9 @@ exports.ServerTypes = void 0;
|
|
|
2014
2086
|
tslib.__decorate([
|
|
2015
2087
|
antelope.Struct.field('bool')
|
|
2016
2088
|
], location_info.prototype, "is_system", void 0);
|
|
2089
|
+
tslib.__decorate([
|
|
2090
|
+
antelope.Struct.field('bool')
|
|
2091
|
+
], location_info.prototype, "is_wormhole", void 0);
|
|
2017
2092
|
location_info = tslib.__decorate([
|
|
2018
2093
|
antelope.Struct.type('location_info')
|
|
2019
2094
|
], location_info);
|
|
@@ -2341,18 +2416,18 @@ exports.ServerTypes = void 0;
|
|
|
2341
2416
|
tslib.__decorate([
|
|
2342
2417
|
antelope.Struct.field(energy_stats, { optional: true })
|
|
2343
2418
|
], projected_state.prototype, "generator", void 0);
|
|
2344
|
-
tslib.__decorate([
|
|
2345
|
-
antelope.Struct.field(gatherer_stats, { optional: true })
|
|
2346
|
-
], projected_state.prototype, "gatherer", void 0);
|
|
2347
|
-
tslib.__decorate([
|
|
2348
|
-
antelope.Struct.field(loader_stats, { optional: true })
|
|
2349
|
-
], projected_state.prototype, "loaders", void 0);
|
|
2350
2419
|
tslib.__decorate([
|
|
2351
2420
|
antelope.Struct.field(hauler_stats, { optional: true })
|
|
2352
2421
|
], projected_state.prototype, "hauler", void 0);
|
|
2353
2422
|
tslib.__decorate([
|
|
2354
|
-
antelope.Struct.field(
|
|
2355
|
-
], projected_state.prototype, "
|
|
2423
|
+
antelope.Struct.field(gatherer_lane, { array: true })
|
|
2424
|
+
], projected_state.prototype, "gatherer_lanes", void 0);
|
|
2425
|
+
tslib.__decorate([
|
|
2426
|
+
antelope.Struct.field(crafter_lane, { array: true })
|
|
2427
|
+
], projected_state.prototype, "crafter_lanes", void 0);
|
|
2428
|
+
tslib.__decorate([
|
|
2429
|
+
antelope.Struct.field(loader_lane, { array: true })
|
|
2430
|
+
], projected_state.prototype, "loader_lanes", void 0);
|
|
2356
2431
|
projected_state = tslib.__decorate([
|
|
2357
2432
|
antelope.Struct.type('projected_state')
|
|
2358
2433
|
], projected_state);
|
|
@@ -2552,6 +2627,21 @@ exports.ServerTypes = void 0;
|
|
|
2552
2627
|
antelope.Struct.type('rmnftcfg')
|
|
2553
2628
|
], rmnftcfg);
|
|
2554
2629
|
Types.rmnftcfg = rmnftcfg;
|
|
2630
|
+
let setcoords = class setcoords extends antelope.Struct {
|
|
2631
|
+
};
|
|
2632
|
+
tslib.__decorate([
|
|
2633
|
+
antelope.Struct.field(antelope.UInt64)
|
|
2634
|
+
], setcoords.prototype, "entity_id", void 0);
|
|
2635
|
+
tslib.__decorate([
|
|
2636
|
+
antelope.Struct.field(antelope.Int64)
|
|
2637
|
+
], setcoords.prototype, "x", void 0);
|
|
2638
|
+
tslib.__decorate([
|
|
2639
|
+
antelope.Struct.field(antelope.Int64)
|
|
2640
|
+
], setcoords.prototype, "y", void 0);
|
|
2641
|
+
setcoords = tslib.__decorate([
|
|
2642
|
+
antelope.Struct.type('setcoords')
|
|
2643
|
+
], setcoords);
|
|
2644
|
+
Types.setcoords = setcoords;
|
|
2555
2645
|
let setnftcfg = class setnftcfg extends antelope.Struct {
|
|
2556
2646
|
};
|
|
2557
2647
|
tslib.__decorate([
|
|
@@ -2711,6 +2801,27 @@ exports.ServerTypes = void 0;
|
|
|
2711
2801
|
antelope.Struct.type('task_results')
|
|
2712
2802
|
], task_results);
|
|
2713
2803
|
Types.task_results = task_results;
|
|
2804
|
+
let transit = class transit extends antelope.Struct {
|
|
2805
|
+
};
|
|
2806
|
+
tslib.__decorate([
|
|
2807
|
+
antelope.Struct.field(antelope.UInt64)
|
|
2808
|
+
], transit.prototype, "id", void 0);
|
|
2809
|
+
tslib.__decorate([
|
|
2810
|
+
antelope.Struct.field(antelope.Int64)
|
|
2811
|
+
], transit.prototype, "ax", void 0);
|
|
2812
|
+
tslib.__decorate([
|
|
2813
|
+
antelope.Struct.field(antelope.Int64)
|
|
2814
|
+
], transit.prototype, "ay", void 0);
|
|
2815
|
+
tslib.__decorate([
|
|
2816
|
+
antelope.Struct.field(antelope.Int64)
|
|
2817
|
+
], transit.prototype, "bx", void 0);
|
|
2818
|
+
tslib.__decorate([
|
|
2819
|
+
antelope.Struct.field(antelope.Int64)
|
|
2820
|
+
], transit.prototype, "by", void 0);
|
|
2821
|
+
transit = tslib.__decorate([
|
|
2822
|
+
antelope.Struct.type('transit')
|
|
2823
|
+
], transit);
|
|
2824
|
+
Types.transit = transit;
|
|
2714
2825
|
let travel = class travel extends antelope.Struct {
|
|
2715
2826
|
};
|
|
2716
2827
|
tslib.__decorate([
|
|
@@ -2798,6 +2909,21 @@ exports.ServerTypes = void 0;
|
|
|
2798
2909
|
antelope.Struct.type('wipe')
|
|
2799
2910
|
], wipe);
|
|
2800
2911
|
Types.wipe = wipe;
|
|
2912
|
+
let wormhole_info = class wormhole_info extends antelope.Struct {
|
|
2913
|
+
};
|
|
2914
|
+
tslib.__decorate([
|
|
2915
|
+
antelope.Struct.field(coordinates)
|
|
2916
|
+
], wormhole_info.prototype, "coords", void 0);
|
|
2917
|
+
tslib.__decorate([
|
|
2918
|
+
antelope.Struct.field('bool')
|
|
2919
|
+
], wormhole_info.prototype, "is_wormhole", void 0);
|
|
2920
|
+
tslib.__decorate([
|
|
2921
|
+
antelope.Struct.field(coordinates)
|
|
2922
|
+
], wormhole_info.prototype, "destination", void 0);
|
|
2923
|
+
wormhole_info = tslib.__decorate([
|
|
2924
|
+
antelope.Struct.type('wormhole_info')
|
|
2925
|
+
], wormhole_info);
|
|
2926
|
+
Types.wormhole_info = wormhole_info;
|
|
2801
2927
|
let wrapconfig_row = class wrapconfig_row extends antelope.Struct {
|
|
2802
2928
|
};
|
|
2803
2929
|
tslib.__decorate([
|
|
@@ -2925,6 +3051,8 @@ const GROUP_NOT_FOUND = 'Entity group not found.';
|
|
|
2925
3051
|
const GROUP_DUPLICATE_ENTITY = 'Duplicate entity in group.';
|
|
2926
3052
|
const GROUP_HAUL_CAPACITY_EXCEEDED = 'Group travel requires sufficient hauler capacity for all non-self-propelled entities.';
|
|
2927
3053
|
const CANCEL_CONTAINS_GROUPED_TASK = 'Cannot cancel range containing grouped task - cancel non-grouped tasks first.';
|
|
3054
|
+
const WOULD_STRAND = 'Cancelling this would leave a later task without the cargo it needs.';
|
|
3055
|
+
const WOULD_OVERFILL = 'Cancelling this would overfill the other entity with returned cargo.';
|
|
2928
3056
|
const WARP_NO_CAPABILITY = 'Entity does not have warp capability.';
|
|
2929
3057
|
const WARP_HAS_SCHEDULE = 'Entity must be idle to warp.';
|
|
2930
3058
|
const WARP_HAS_CARGO = 'Entity must have no cargo to warp.';
|
|
@@ -2979,6 +3107,7 @@ exports.TaskType = void 0;
|
|
|
2979
3107
|
TaskType[TaskType["WARP"] = 6] = "WARP";
|
|
2980
3108
|
TaskType[TaskType["CRAFT"] = 7] = "CRAFT";
|
|
2981
3109
|
TaskType[TaskType["DEPLOY"] = 8] = "DEPLOY";
|
|
3110
|
+
TaskType[TaskType["TRANSIT"] = 9] = "TRANSIT";
|
|
2982
3111
|
TaskType[TaskType["UNWRAP"] = 10] = "UNWRAP";
|
|
2983
3112
|
TaskType[TaskType["UNDEPLOY"] = 11] = "UNDEPLOY";
|
|
2984
3113
|
TaskType[TaskType["DEMOLISH"] = 13] = "DEMOLISH";
|
|
@@ -3803,15 +3932,15 @@ var recipes = [
|
|
|
3803
3932
|
},
|
|
3804
3933
|
{
|
|
3805
3934
|
outputItemId: 10200,
|
|
3806
|
-
outputMass:
|
|
3935
|
+
outputMass: 1900000,
|
|
3807
3936
|
inputs: [
|
|
3808
3937
|
{
|
|
3809
3938
|
itemId: 10001,
|
|
3810
3939
|
quantity: 600
|
|
3811
3940
|
},
|
|
3812
3941
|
{
|
|
3813
|
-
itemId:
|
|
3814
|
-
quantity:
|
|
3942
|
+
itemId: 10008,
|
|
3943
|
+
quantity: 600
|
|
3815
3944
|
}
|
|
3816
3945
|
],
|
|
3817
3946
|
statSlots: [
|
|
@@ -3853,15 +3982,27 @@ var recipes = [
|
|
|
3853
3982
|
},
|
|
3854
3983
|
{
|
|
3855
3984
|
outputItemId: 10201,
|
|
3856
|
-
outputMass:
|
|
3985
|
+
outputMass: 2400000,
|
|
3857
3986
|
inputs: [
|
|
3858
3987
|
{
|
|
3859
3988
|
itemId: 10001,
|
|
3860
|
-
quantity:
|
|
3989
|
+
quantity: 300
|
|
3861
3990
|
},
|
|
3862
3991
|
{
|
|
3863
|
-
itemId:
|
|
3864
|
-
quantity:
|
|
3992
|
+
itemId: 10008,
|
|
3993
|
+
quantity: 300
|
|
3994
|
+
},
|
|
3995
|
+
{
|
|
3996
|
+
itemId: 10007,
|
|
3997
|
+
quantity: 300
|
|
3998
|
+
},
|
|
3999
|
+
{
|
|
4000
|
+
itemId: 10003,
|
|
4001
|
+
quantity: 300
|
|
4002
|
+
},
|
|
4003
|
+
{
|
|
4004
|
+
itemId: 10006,
|
|
4005
|
+
quantity: 300
|
|
3865
4006
|
}
|
|
3866
4007
|
],
|
|
3867
4008
|
statSlots: [
|
|
@@ -3883,18 +4024,10 @@ var recipes = [
|
|
|
3883
4024
|
},
|
|
3884
4025
|
{
|
|
3885
4026
|
sources: [
|
|
3886
|
-
{
|
|
3887
|
-
inputIndex: 1,
|
|
3888
|
-
statIndex: 0
|
|
3889
|
-
}
|
|
3890
4027
|
]
|
|
3891
4028
|
},
|
|
3892
4029
|
{
|
|
3893
4030
|
sources: [
|
|
3894
|
-
{
|
|
3895
|
-
inputIndex: 1,
|
|
3896
|
-
statIndex: 1
|
|
3897
|
-
}
|
|
3898
4031
|
]
|
|
3899
4032
|
}
|
|
3900
4033
|
],
|
|
@@ -3903,14 +4036,14 @@ var recipes = [
|
|
|
3903
4036
|
},
|
|
3904
4037
|
{
|
|
3905
4038
|
outputItemId: 10202,
|
|
3906
|
-
outputMass:
|
|
4039
|
+
outputMass: 3200000,
|
|
3907
4040
|
inputs: [
|
|
3908
4041
|
{
|
|
3909
4042
|
itemId: 10001,
|
|
3910
|
-
quantity:
|
|
4043
|
+
quantity: 1000
|
|
3911
4044
|
},
|
|
3912
4045
|
{
|
|
3913
|
-
itemId:
|
|
4046
|
+
itemId: 10008,
|
|
3914
4047
|
quantity: 1000
|
|
3915
4048
|
}
|
|
3916
4049
|
],
|
|
@@ -3953,24 +4086,20 @@ var recipes = [
|
|
|
3953
4086
|
},
|
|
3954
4087
|
{
|
|
3955
4088
|
outputItemId: 10203,
|
|
3956
|
-
outputMass:
|
|
4089
|
+
outputMass: 1900000,
|
|
3957
4090
|
inputs: [
|
|
3958
4091
|
{
|
|
3959
|
-
itemId:
|
|
3960
|
-
quantity:
|
|
4092
|
+
itemId: 10008,
|
|
4093
|
+
quantity: 600
|
|
3961
4094
|
},
|
|
3962
4095
|
{
|
|
3963
|
-
itemId:
|
|
3964
|
-
quantity:
|
|
4096
|
+
itemId: 10006,
|
|
4097
|
+
quantity: 600
|
|
3965
4098
|
}
|
|
3966
4099
|
],
|
|
3967
4100
|
statSlots: [
|
|
3968
4101
|
{
|
|
3969
4102
|
sources: [
|
|
3970
|
-
{
|
|
3971
|
-
inputIndex: 0,
|
|
3972
|
-
statIndex: 0
|
|
3973
|
-
}
|
|
3974
4103
|
]
|
|
3975
4104
|
},
|
|
3976
4105
|
{
|
|
@@ -3984,17 +4113,13 @@ var recipes = [
|
|
|
3984
4113
|
{
|
|
3985
4114
|
sources: [
|
|
3986
4115
|
{
|
|
3987
|
-
inputIndex:
|
|
4116
|
+
inputIndex: 0,
|
|
3988
4117
|
statIndex: 0
|
|
3989
4118
|
}
|
|
3990
4119
|
]
|
|
3991
4120
|
},
|
|
3992
4121
|
{
|
|
3993
4122
|
sources: [
|
|
3994
|
-
{
|
|
3995
|
-
inputIndex: 1,
|
|
3996
|
-
statIndex: 1
|
|
3997
|
-
}
|
|
3998
4123
|
]
|
|
3999
4124
|
}
|
|
4000
4125
|
],
|
|
@@ -4003,32 +4128,20 @@ var recipes = [
|
|
|
4003
4128
|
},
|
|
4004
4129
|
{
|
|
4005
4130
|
outputItemId: 10204,
|
|
4006
|
-
outputMass:
|
|
4131
|
+
outputMass: 1900000,
|
|
4007
4132
|
inputs: [
|
|
4008
|
-
{
|
|
4009
|
-
itemId: 10001,
|
|
4010
|
-
quantity: 1500
|
|
4011
|
-
},
|
|
4012
|
-
{
|
|
4013
|
-
itemId: 10002,
|
|
4014
|
-
quantity: 600
|
|
4015
|
-
},
|
|
4016
4133
|
{
|
|
4017
4134
|
itemId: 10008,
|
|
4018
|
-
quantity:
|
|
4135
|
+
quantity: 600
|
|
4019
4136
|
},
|
|
4020
4137
|
{
|
|
4021
|
-
itemId:
|
|
4022
|
-
quantity:
|
|
4138
|
+
itemId: 10007,
|
|
4139
|
+
quantity: 600
|
|
4023
4140
|
}
|
|
4024
4141
|
],
|
|
4025
4142
|
statSlots: [
|
|
4026
4143
|
{
|
|
4027
4144
|
sources: [
|
|
4028
|
-
{
|
|
4029
|
-
inputIndex: 0,
|
|
4030
|
-
statIndex: 0
|
|
4031
|
-
}
|
|
4032
4145
|
]
|
|
4033
4146
|
},
|
|
4034
4147
|
{
|
|
@@ -4042,17 +4155,13 @@ var recipes = [
|
|
|
4042
4155
|
{
|
|
4043
4156
|
sources: [
|
|
4044
4157
|
{
|
|
4045
|
-
inputIndex:
|
|
4158
|
+
inputIndex: 0,
|
|
4046
4159
|
statIndex: 0
|
|
4047
4160
|
}
|
|
4048
4161
|
]
|
|
4049
4162
|
},
|
|
4050
4163
|
{
|
|
4051
4164
|
sources: [
|
|
4052
|
-
{
|
|
4053
|
-
inputIndex: 1,
|
|
4054
|
-
statIndex: 1
|
|
4055
|
-
}
|
|
4056
4165
|
]
|
|
4057
4166
|
}
|
|
4058
4167
|
],
|
|
@@ -4265,11 +4374,11 @@ var entities = [
|
|
|
4265
4374
|
slots: [
|
|
4266
4375
|
{
|
|
4267
4376
|
type: "generator",
|
|
4268
|
-
outputPct:
|
|
4377
|
+
outputPct: 200
|
|
4269
4378
|
},
|
|
4270
4379
|
{
|
|
4271
4380
|
type: "gatherer",
|
|
4272
|
-
outputPct:
|
|
4381
|
+
outputPct: 200
|
|
4273
4382
|
}
|
|
4274
4383
|
]
|
|
4275
4384
|
},
|
|
@@ -4278,11 +4387,11 @@ var entities = [
|
|
|
4278
4387
|
slots: [
|
|
4279
4388
|
{
|
|
4280
4389
|
type: "generator",
|
|
4281
|
-
outputPct:
|
|
4390
|
+
outputPct: 200
|
|
4282
4391
|
},
|
|
4283
4392
|
{
|
|
4284
4393
|
type: "crafter",
|
|
4285
|
-
outputPct:
|
|
4394
|
+
outputPct: 200
|
|
4286
4395
|
}
|
|
4287
4396
|
]
|
|
4288
4397
|
},
|
|
@@ -4809,31 +4918,31 @@ var items = [
|
|
|
4809
4918
|
},
|
|
4810
4919
|
{
|
|
4811
4920
|
id: 10200,
|
|
4812
|
-
mass:
|
|
4921
|
+
mass: 1900000,
|
|
4813
4922
|
type: "entity",
|
|
4814
4923
|
tier: 1
|
|
4815
4924
|
},
|
|
4816
4925
|
{
|
|
4817
4926
|
id: 10201,
|
|
4818
|
-
mass:
|
|
4927
|
+
mass: 2400000,
|
|
4819
4928
|
type: "entity",
|
|
4820
4929
|
tier: 1
|
|
4821
4930
|
},
|
|
4822
4931
|
{
|
|
4823
4932
|
id: 10202,
|
|
4824
|
-
mass:
|
|
4933
|
+
mass: 3200000,
|
|
4825
4934
|
type: "entity",
|
|
4826
4935
|
tier: 1
|
|
4827
4936
|
},
|
|
4828
4937
|
{
|
|
4829
4938
|
id: 10203,
|
|
4830
|
-
mass:
|
|
4939
|
+
mass: 1900000,
|
|
4831
4940
|
type: "entity",
|
|
4832
4941
|
tier: 1
|
|
4833
4942
|
},
|
|
4834
4943
|
{
|
|
4835
4944
|
id: 10204,
|
|
4836
|
-
mass:
|
|
4945
|
+
mass: 1900000,
|
|
4837
4946
|
type: "entity",
|
|
4838
4947
|
tier: 1
|
|
4839
4948
|
},
|
|
@@ -5392,6 +5501,102 @@ function deriveLocationSize(loc) {
|
|
|
5392
5501
|
return Math.floor(LOCATION_MIN_DEPTH + curved * range);
|
|
5393
5502
|
}
|
|
5394
5503
|
|
|
5504
|
+
const WH = {
|
|
5505
|
+
RSIZE: 75,
|
|
5506
|
+
ZONE: 16384,
|
|
5507
|
+
THRESHOLD: 8192,
|
|
5508
|
+
MIN_REACH: 50000,
|
|
5509
|
+
TRANSIT_SPEED: 500,
|
|
5510
|
+
};
|
|
5511
|
+
const HALF = Math.round(Math.log2(WH.ZONE));
|
|
5512
|
+
const MASK = WH.ZONE - 1;
|
|
5513
|
+
function roll16(seed, str) {
|
|
5514
|
+
const h = hash512(seed, str).array;
|
|
5515
|
+
return (h[0] << 8) | h[1];
|
|
5516
|
+
}
|
|
5517
|
+
function feistelF(seed, x, round, key) {
|
|
5518
|
+
return roll16(seed, `feistel-${key}-${round}-${x}`) & MASK;
|
|
5519
|
+
}
|
|
5520
|
+
function feistel(seed, idx, key) {
|
|
5521
|
+
let L = (idx >>> HALF) & MASK;
|
|
5522
|
+
let R = idx & MASK;
|
|
5523
|
+
for (let r = 0; r < 4; r++) {
|
|
5524
|
+
const nR = L ^ feistelF(seed, R, r, key);
|
|
5525
|
+
L = R;
|
|
5526
|
+
R = nR;
|
|
5527
|
+
}
|
|
5528
|
+
return (L << HALF) | R;
|
|
5529
|
+
}
|
|
5530
|
+
function feistelInv(seed, idx, key) {
|
|
5531
|
+
let L = (idx >>> HALF) & MASK;
|
|
5532
|
+
let R = idx & MASK;
|
|
5533
|
+
for (let r = 3; r >= 0; r--) {
|
|
5534
|
+
const nL = R ^ feistelF(seed, L, r, key);
|
|
5535
|
+
R = L;
|
|
5536
|
+
L = nL;
|
|
5537
|
+
}
|
|
5538
|
+
return (L << HALF) | R;
|
|
5539
|
+
}
|
|
5540
|
+
function regionOf(x, y) {
|
|
5541
|
+
return { rx: Math.floor(x / WH.RSIZE), ry: Math.floor(y / WH.RSIZE) };
|
|
5542
|
+
}
|
|
5543
|
+
function partnerRegion(seed, R) {
|
|
5544
|
+
const qx = Math.floor(R.rx / WH.ZONE);
|
|
5545
|
+
const qy = Math.floor(R.ry / WH.ZONE);
|
|
5546
|
+
const zx = qx * WH.ZONE;
|
|
5547
|
+
const zy = qy * WH.ZONE;
|
|
5548
|
+
const key = `${qx}:${qy}`;
|
|
5549
|
+
const idx = (R.ry - zy) * WH.ZONE + (R.rx - zx);
|
|
5550
|
+
const p = feistelInv(seed, feistel(seed, idx, key) ^ 1, key);
|
|
5551
|
+
return { rx: zx + (p % WH.ZONE), ry: zy + Math.floor(p / WH.ZONE) };
|
|
5552
|
+
}
|
|
5553
|
+
function regKey(R) {
|
|
5554
|
+
return `${R.rx}:${R.ry}`;
|
|
5555
|
+
}
|
|
5556
|
+
function pairKey(a, b) {
|
|
5557
|
+
const ka = regKey(a);
|
|
5558
|
+
const kb = regKey(b);
|
|
5559
|
+
return ka < kb ? `${ka}|${kb}` : `${kb}|${ka}`;
|
|
5560
|
+
}
|
|
5561
|
+
function endpointInRegion(seed, R, key) {
|
|
5562
|
+
const h = hash512(seed, `wh-endpoint-${key}-${regKey(R)}`).array;
|
|
5563
|
+
const ox = ((h[0] << 24) | (h[1] << 16) | (h[2] << 8) | h[3]) >>> 0;
|
|
5564
|
+
const oy = ((h[4] << 24) | (h[5] << 16) | (h[6] << 8) | h[7]) >>> 0;
|
|
5565
|
+
return { x: R.rx * WH.RSIZE + (ox % WH.RSIZE), y: R.ry * WH.RSIZE + (oy % WH.RSIZE) };
|
|
5566
|
+
}
|
|
5567
|
+
function dist(a, b) {
|
|
5568
|
+
return Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);
|
|
5569
|
+
}
|
|
5570
|
+
function wormholeOfRegion(seed, R) {
|
|
5571
|
+
const P = partnerRegion(seed, R);
|
|
5572
|
+
if (P.rx === R.rx && P.ry === R.ry)
|
|
5573
|
+
return null;
|
|
5574
|
+
const key = pairKey(R, P);
|
|
5575
|
+
if (roll16(seed, `wh-exists-${key}`) >= WH.THRESHOLD)
|
|
5576
|
+
return null;
|
|
5577
|
+
const A = endpointInRegion(seed, R, key);
|
|
5578
|
+
const B = endpointInRegion(seed, P, key);
|
|
5579
|
+
if (dist(A, B) < WH.MIN_REACH)
|
|
5580
|
+
return null;
|
|
5581
|
+
return { A, B };
|
|
5582
|
+
}
|
|
5583
|
+
function wormholeAtRegionEndpoint(seed, rx, ry) {
|
|
5584
|
+
const w = wormholeOfRegion(seed, { rx, ry });
|
|
5585
|
+
if (!w)
|
|
5586
|
+
return null;
|
|
5587
|
+
return { from: w.A, to: w.B };
|
|
5588
|
+
}
|
|
5589
|
+
function wormholeAt(seed, x, y) {
|
|
5590
|
+
const w = wormholeOfRegion(seed, regionOf(x, y));
|
|
5591
|
+
if (!w || w.A.x !== x || w.A.y !== y)
|
|
5592
|
+
return null;
|
|
5593
|
+
return w.B;
|
|
5594
|
+
}
|
|
5595
|
+
function isValidWormholePair(seed, ax, ay, bx, by) {
|
|
5596
|
+
const to = wormholeAt(seed, ax, ay);
|
|
5597
|
+
return to !== null && to.x === bx && to.y === by;
|
|
5598
|
+
}
|
|
5599
|
+
|
|
5395
5600
|
var syllables = [
|
|
5396
5601
|
"A",
|
|
5397
5602
|
"Ab",
|
|
@@ -7637,6 +7842,13 @@ function getSystemName(gameSeed, location) {
|
|
|
7637
7842
|
function hasSystem(gameSeed, coordinates) {
|
|
7638
7843
|
return getLocationType(gameSeed, coordinates) !== exports.LocationType.EMPTY;
|
|
7639
7844
|
}
|
|
7845
|
+
function getLocationKind(gameSeed, x, y) {
|
|
7846
|
+
if (wormholeAt(gameSeed, x, y))
|
|
7847
|
+
return 'wormhole';
|
|
7848
|
+
if (hasSystem(gameSeed, { x, y }))
|
|
7849
|
+
return 'system';
|
|
7850
|
+
return 'empty';
|
|
7851
|
+
}
|
|
7640
7852
|
function deriveLocationStatic(gameSeed, coordinates) {
|
|
7641
7853
|
const seed = antelope.Checksum256.from(gameSeed);
|
|
7642
7854
|
const coords = Coordinates.from(coordinates);
|
|
@@ -8338,7 +8550,10 @@ function entityDoesTaskType(entity, taskType, now) {
|
|
|
8338
8550
|
}
|
|
8339
8551
|
function isInFlight(entity, now) {
|
|
8340
8552
|
const lane = mobilityLane(entity);
|
|
8341
|
-
|
|
8553
|
+
if (!lane)
|
|
8554
|
+
return false;
|
|
8555
|
+
const t = currentTaskType(lane.schedule, now);
|
|
8556
|
+
return t === exports.TaskType.TRAVEL || t === exports.TaskType.TRANSIT;
|
|
8342
8557
|
}
|
|
8343
8558
|
function isRecharging(entity, now) {
|
|
8344
8559
|
return entityDoesTaskType(entity, exports.TaskType.RECHARGE, now);
|
|
@@ -8398,6 +8613,9 @@ var schedule = /*#__PURE__*/Object.freeze({
|
|
|
8398
8613
|
currentTaskProgressFloatForLane: currentTaskProgressFloatForLane
|
|
8399
8614
|
});
|
|
8400
8615
|
|
|
8616
|
+
function isPositionalTask(task) {
|
|
8617
|
+
return task.type.equals(exports.TaskType.TRAVEL) || task.type.equals(exports.TaskType.TRANSIT);
|
|
8618
|
+
}
|
|
8401
8619
|
function calc_orbital_altitude(mass) {
|
|
8402
8620
|
if (mass <= BASE_ORBITAL_MASS) {
|
|
8403
8621
|
return MIN_ORBITAL_ALTITUDE;
|
|
@@ -8451,7 +8669,7 @@ function getInterpolatedPosition(entity, taskIndex, taskProgress) {
|
|
|
8451
8669
|
return { x: Number(settled.x), y: Number(settled.y) };
|
|
8452
8670
|
}
|
|
8453
8671
|
const task = tasks[taskIndex];
|
|
8454
|
-
if (!task
|
|
8672
|
+
if (!isPositionalTask(task) || !task.coordinates) {
|
|
8455
8673
|
const origin = getFlightOrigin(entity, taskIndex);
|
|
8456
8674
|
return { x: Number(origin.x), y: Number(origin.y) };
|
|
8457
8675
|
}
|
|
@@ -8498,14 +8716,29 @@ function calc_ship_rechargetime(ship) {
|
|
|
8498
8716
|
function calc_flighttime(distance, acceleration) {
|
|
8499
8717
|
return antelope.UInt32.from(2 * Math.sqrt(Number(distance) / acceleration));
|
|
8500
8718
|
}
|
|
8719
|
+
function calc_transit_duration(ax, ay, bx, by) {
|
|
8720
|
+
const distance = distanceBetweenPoints(ax, ay, bx, by);
|
|
8721
|
+
return antelope.UInt32.from(Math.floor(distance.toNumber() / (PRECISION$1 * WH.TRANSIT_SPEED)));
|
|
8722
|
+
}
|
|
8723
|
+
function shipLoaderLane(ship) {
|
|
8724
|
+
const lanes = ship.loader_lanes ?? [];
|
|
8725
|
+
if (lanes.length === 0)
|
|
8726
|
+
return undefined;
|
|
8727
|
+
let lowest = lanes[0];
|
|
8728
|
+
for (const lane of lanes) {
|
|
8729
|
+
if (Number(lane.slot_index) < Number(lowest.slot_index))
|
|
8730
|
+
lowest = lane;
|
|
8731
|
+
}
|
|
8732
|
+
return { thrust: Number(lowest.thrust), mass: Number(lowest.mass) };
|
|
8733
|
+
}
|
|
8501
8734
|
function calc_loader_flighttime(ship, mass, altitude) {
|
|
8502
8735
|
const z = altitude ?? ship.coordinates.z?.toNumber() ?? calc_orbital_altitude(Number(mass));
|
|
8503
8736
|
return calc_flighttime(z, calc_loader_acceleration(ship, mass));
|
|
8504
8737
|
}
|
|
8505
8738
|
function calc_loader_acceleration(ship, mass) {
|
|
8506
|
-
const
|
|
8507
|
-
const
|
|
8508
|
-
return calc_acceleration(thrust, Number(mass)
|
|
8739
|
+
const lane = shipLoaderLane(ship);
|
|
8740
|
+
const thrust = lane ? lane.thrust : 0;
|
|
8741
|
+
return calc_acceleration(thrust, Number(mass));
|
|
8509
8742
|
}
|
|
8510
8743
|
function calc_ship_flighttime(ship, mass, distance) {
|
|
8511
8744
|
const acceleration = calc_ship_acceleration(ship, mass);
|
|
@@ -8521,8 +8754,10 @@ function calc_acceleration(thrust, mass) {
|
|
|
8521
8754
|
function calc_ship_mass(ship, cargos) {
|
|
8522
8755
|
const mass = antelope.UInt64.from(0);
|
|
8523
8756
|
mass.add(ship.hullmass);
|
|
8524
|
-
if (ship.
|
|
8525
|
-
|
|
8757
|
+
if (ship.loader_lanes && ship.loader_lanes.length > 0) {
|
|
8758
|
+
for (const l of ship.loader_lanes) {
|
|
8759
|
+
mass.add(antelope.UInt64.from(l.mass));
|
|
8760
|
+
}
|
|
8526
8761
|
}
|
|
8527
8762
|
for (const cargo of cargos) {
|
|
8528
8763
|
const cargoMass = getItem(cargo.item_id).mass * Number(antelope.UInt32.from(cargo.quantity));
|
|
@@ -8546,11 +8781,11 @@ function calculateTransferTime(ship, cargos, quantities) {
|
|
|
8546
8781
|
if (mass.equals(antelope.UInt64.zero)) {
|
|
8547
8782
|
return antelope.UInt32.from(0);
|
|
8548
8783
|
}
|
|
8549
|
-
|
|
8784
|
+
const lane = shipLoaderLane(ship);
|
|
8785
|
+
if (!lane)
|
|
8550
8786
|
return antelope.UInt32.from(0);
|
|
8551
|
-
mass = antelope.UInt64.from(mass).adding(
|
|
8552
|
-
|
|
8553
|
-
return transfer_time.dividing(ship.loaders.quantity);
|
|
8787
|
+
mass = antelope.UInt64.from(mass).adding(antelope.UInt64.from(lane.mass));
|
|
8788
|
+
return calc_loader_flighttime(ship, mass);
|
|
8554
8789
|
}
|
|
8555
8790
|
function calculateRefuelingTime(ship) {
|
|
8556
8791
|
return calc_ship_rechargetime(ship);
|
|
@@ -8580,22 +8815,19 @@ function calculateLoadTimeBreakdown(ship, cargos, loadQuantities, unloadQuantiti
|
|
|
8580
8815
|
}
|
|
8581
8816
|
let unloadTime = 0;
|
|
8582
8817
|
let loadTime = 0;
|
|
8583
|
-
|
|
8584
|
-
|
|
8818
|
+
const lane = shipLoaderLane(ship);
|
|
8819
|
+
if (mass_unload.gt(antelope.UInt64.zero) && lane) {
|
|
8820
|
+
const totalMass = antelope.UInt64.from(mass_unload).adding(antelope.UInt64.from(lane.mass));
|
|
8585
8821
|
unloadTime = Number(calc_loader_flighttime(ship, totalMass));
|
|
8586
8822
|
}
|
|
8587
|
-
if (mass_load.gt(antelope.UInt64.zero) &&
|
|
8588
|
-
const totalMass = antelope.UInt64.from(mass_load).adding(
|
|
8823
|
+
if (mass_load.gt(antelope.UInt64.zero) && lane) {
|
|
8824
|
+
const totalMass = antelope.UInt64.from(mass_load).adding(antelope.UInt64.from(lane.mass));
|
|
8589
8825
|
loadTime = Number(calc_loader_flighttime(ship, totalMass));
|
|
8590
8826
|
}
|
|
8591
|
-
const numLoaders = ship.loaders ? Number(ship.loaders.quantity) : 0;
|
|
8592
|
-
const totalTime = numLoaders > 0 ? (unloadTime + loadTime) / numLoaders : 0;
|
|
8593
|
-
const unloadTimePerLoader = numLoaders > 0 ? unloadTime / numLoaders : 0;
|
|
8594
|
-
const loadTimePerLoader = numLoaders > 0 ? loadTime / numLoaders : 0;
|
|
8595
8827
|
return {
|
|
8596
|
-
unloadTime
|
|
8597
|
-
loadTime
|
|
8598
|
-
totalTime,
|
|
8828
|
+
unloadTime,
|
|
8829
|
+
loadTime,
|
|
8830
|
+
totalTime: unloadTime + loadTime,
|
|
8599
8831
|
unloadMass: Number(mass_unload),
|
|
8600
8832
|
loadMass: Number(mass_load),
|
|
8601
8833
|
};
|
|
@@ -8606,19 +8838,14 @@ function estimateTravelTime(ship, travelMass, distance, options = {}) {
|
|
|
8606
8838
|
const rechargeTime = needsRecharge ? calc_ship_rechargetime(ship) : antelope.UInt32.zero;
|
|
8607
8839
|
let loadTime = antelope.UInt32.zero;
|
|
8608
8840
|
let unloadTime = antelope.UInt32.zero;
|
|
8609
|
-
|
|
8610
|
-
|
|
8611
|
-
|
|
8612
|
-
ship
|
|
8613
|
-
|
|
8614
|
-
|
|
8615
|
-
|
|
8616
|
-
|
|
8617
|
-
antelope.UInt32.from(unloadMass).gt(antelope.UInt32.zero) &&
|
|
8618
|
-
ship.loaders &&
|
|
8619
|
-
ship.loaders.quantity.gt(antelope.UInt32.zero)) {
|
|
8620
|
-
const totalMass = antelope.UInt64.from(unloadMass).adding(ship.loaders.mass);
|
|
8621
|
-
unloadTime = calc_loader_flighttime(ship, totalMass).dividing(ship.loaders.quantity);
|
|
8841
|
+
const lane = shipLoaderLane(ship);
|
|
8842
|
+
if (loadMass && antelope.UInt32.from(loadMass).gt(antelope.UInt32.zero) && lane) {
|
|
8843
|
+
const totalMass = antelope.UInt64.from(loadMass).adding(antelope.UInt64.from(lane.mass));
|
|
8844
|
+
loadTime = calc_loader_flighttime(ship, totalMass);
|
|
8845
|
+
}
|
|
8846
|
+
if (unloadMass && antelope.UInt32.from(unloadMass).gt(antelope.UInt32.zero) && lane) {
|
|
8847
|
+
const totalMass = antelope.UInt64.from(unloadMass).adding(antelope.UInt64.from(lane.mass));
|
|
8848
|
+
unloadTime = calc_loader_flighttime(ship, totalMass);
|
|
8622
8849
|
}
|
|
8623
8850
|
return {
|
|
8624
8851
|
flightTime,
|
|
@@ -8642,6 +8869,22 @@ function hasEnergyForDistance(ship, distance) {
|
|
|
8642
8869
|
const energyNeeded = antelope.UInt64.from(distance).dividing(PRECISION$1).multiplying(ship.engines.drain);
|
|
8643
8870
|
return antelope.UInt64.from(ship.energy ?? 0).gte(energyNeeded);
|
|
8644
8871
|
}
|
|
8872
|
+
function toNum$1(v) {
|
|
8873
|
+
if (v === undefined)
|
|
8874
|
+
return 0;
|
|
8875
|
+
return typeof v === 'number' ? v : v.toNumber();
|
|
8876
|
+
}
|
|
8877
|
+
function chosenLoaderLane(entity) {
|
|
8878
|
+
const lanes = entity.loaderLanes ?? [];
|
|
8879
|
+
if (lanes.length === 0)
|
|
8880
|
+
return undefined;
|
|
8881
|
+
let lowest = lanes[0];
|
|
8882
|
+
for (const lane of lanes) {
|
|
8883
|
+
if (toNum$1(lane.slot_index) < toNum$1(lowest.slot_index))
|
|
8884
|
+
lowest = lane;
|
|
8885
|
+
}
|
|
8886
|
+
return lowest;
|
|
8887
|
+
}
|
|
8645
8888
|
function mobilityTasks(entity) {
|
|
8646
8889
|
return mobilityLane(entity)?.schedule.tasks ?? [];
|
|
8647
8890
|
}
|
|
@@ -8650,7 +8893,7 @@ function getFlightOrigin(entity, flightTaskIndex) {
|
|
|
8650
8893
|
let origin = entity.coordinates;
|
|
8651
8894
|
for (let i = 0; i < flightTaskIndex && i < tasks.length; i++) {
|
|
8652
8895
|
const task = tasks[i];
|
|
8653
|
-
if (task
|
|
8896
|
+
if (isPositionalTask(task) && task.coordinates) {
|
|
8654
8897
|
origin = task.coordinates;
|
|
8655
8898
|
}
|
|
8656
8899
|
}
|
|
@@ -8660,7 +8903,7 @@ function getDestinationLocation(entity) {
|
|
|
8660
8903
|
const tasks = mobilityTasks(entity);
|
|
8661
8904
|
for (let i = tasks.length - 1; i >= 0; i--) {
|
|
8662
8905
|
const task = tasks[i];
|
|
8663
|
-
if (task
|
|
8906
|
+
if (isPositionalTask(task) && task.coordinates) {
|
|
8664
8907
|
return task.coordinates;
|
|
8665
8908
|
}
|
|
8666
8909
|
}
|
|
@@ -8675,7 +8918,7 @@ function getPositionAt(entity, taskIndex, taskProgress) {
|
|
|
8675
8918
|
return getFlightOrigin(entity, tasks.length);
|
|
8676
8919
|
}
|
|
8677
8920
|
const task = tasks[taskIndex];
|
|
8678
|
-
if (!task
|
|
8921
|
+
if (!isPositionalTask(task) || !task.coordinates) {
|
|
8679
8922
|
return getFlightOrigin(entity, taskIndex);
|
|
8680
8923
|
}
|
|
8681
8924
|
const origin = getFlightOrigin(entity, taskIndex);
|
|
@@ -8691,53 +8934,28 @@ function minTransferDistance(entityClass) {
|
|
|
8691
8934
|
? MIN_TRANSFER_DISTANCE_ORBITAL_VESSEL
|
|
8692
8935
|
: MIN_TRANSFER_DISTANCE_PLANETARY_STRUCTURE;
|
|
8693
8936
|
}
|
|
8694
|
-
function
|
|
8695
|
-
if (cargoMass === 0) {
|
|
8937
|
+
function calc_onesided_duration(loaderThrust, loaderMass, activeZ, counterpartZ, activeEntityClass, counterpartEntityClass, cargoMass) {
|
|
8938
|
+
if (cargoMass === 0 || loaderThrust === 0) {
|
|
8696
8939
|
return 0;
|
|
8697
8940
|
}
|
|
8698
|
-
|
|
8699
|
-
|
|
8700
|
-
|
|
8701
|
-
|
|
8702
|
-
|
|
8703
|
-
|
|
8704
|
-
|
|
8705
|
-
|
|
8706
|
-
|
|
8707
|
-
|
|
8708
|
-
|
|
8709
|
-
|
|
8710
|
-
|
|
8711
|
-
totalThrust += thrust * qty;
|
|
8712
|
-
totalLoaderMass += mass * qty;
|
|
8713
|
-
totalQuantity += qty;
|
|
8714
|
-
}
|
|
8715
|
-
if (dest.loaders) {
|
|
8716
|
-
const thrust = typeof dest.loaders.thrust === 'number'
|
|
8717
|
-
? dest.loaders.thrust
|
|
8718
|
-
: dest.loaders.thrust.toNumber();
|
|
8719
|
-
const mass = typeof dest.loaders.mass === 'number' ? dest.loaders.mass : dest.loaders.mass.toNumber();
|
|
8720
|
-
const qty = typeof dest.loaders.quantity === 'number'
|
|
8721
|
-
? dest.loaders.quantity
|
|
8722
|
-
: dest.loaders.quantity.toNumber();
|
|
8723
|
-
totalThrust += thrust * qty;
|
|
8724
|
-
totalLoaderMass += mass * qty;
|
|
8725
|
-
totalQuantity += qty;
|
|
8726
|
-
}
|
|
8727
|
-
if (totalThrust === 0 || totalQuantity === 0) {
|
|
8941
|
+
const rawDistance = Math.abs(activeZ - counterpartZ);
|
|
8942
|
+
const minDistance = Math.max(minTransferDistance(activeEntityClass), minTransferDistance(counterpartEntityClass));
|
|
8943
|
+
const distance = rawDistance < minDistance ? minDistance : rawDistance;
|
|
8944
|
+
const totalMass = cargoMass + loaderMass;
|
|
8945
|
+
const acceleration = calc_acceleration(loaderThrust, totalMass);
|
|
8946
|
+
const flightTime = Math.floor(2 * Math.sqrt(distance / acceleration));
|
|
8947
|
+
return flightTime === 0 ? 1 : flightTime;
|
|
8948
|
+
}
|
|
8949
|
+
function calc_transfer_duration(source, dest, cargoMass) {
|
|
8950
|
+
const active = chosenLoaderLane(source) ? source : dest;
|
|
8951
|
+
const counterpart = active === source ? dest : source;
|
|
8952
|
+
const lane = chosenLoaderLane(active);
|
|
8953
|
+
if (!lane) {
|
|
8728
8954
|
return 0;
|
|
8729
8955
|
}
|
|
8730
|
-
const
|
|
8731
|
-
|
|
8732
|
-
|
|
8733
|
-
const destZ = typeof dest.location.z === 'number' ? dest.location.z : (dest.location.z?.toNumber() ?? 0);
|
|
8734
|
-
const rawDistance = Math.abs(sourceZ - destZ);
|
|
8735
|
-
const minDistance = Math.max(minTransferDistance(source.entityClass), minTransferDistance(dest.entityClass));
|
|
8736
|
-
const distance = rawDistance < minDistance ? minDistance : rawDistance;
|
|
8737
|
-
const totalMass = cargoMass + totalLoaderMass;
|
|
8738
|
-
const acceleration = calc_acceleration(totalThrust, totalMass);
|
|
8739
|
-
const flightTime = 2 * Math.sqrt(distance / acceleration);
|
|
8740
|
-
return Math.floor(flightTime / totalQuantity);
|
|
8956
|
+
const activeZ = toNum$1(active.location.z);
|
|
8957
|
+
const counterpartZ = toNum$1(counterpart.location.z);
|
|
8958
|
+
return calc_onesided_duration(toNum$1(lane.thrust), toNum$1(lane.mass), activeZ, counterpartZ, active.entityClass, counterpart.entityClass, cargoMass);
|
|
8741
8959
|
}
|
|
8742
8960
|
|
|
8743
8961
|
class Location {
|
|
@@ -9624,6 +9842,311 @@ class LocationsManager extends BaseManager {
|
|
|
9624
9842
|
}
|
|
9625
9843
|
}
|
|
9626
9844
|
|
|
9845
|
+
const COORD_MIN = -2147483648;
|
|
9846
|
+
const COORD_MAX = 2147483647;
|
|
9847
|
+
const COORD_OFFSET = 2147485000;
|
|
9848
|
+
const SECTOR_DIV = 100000000;
|
|
9849
|
+
const REGION_DIV = 10000;
|
|
9850
|
+
const SECTORS_PER_AXIS = 43;
|
|
9851
|
+
const REGION_PER_AXIS = 10000;
|
|
9852
|
+
const LOCAL_HALF = 5000;
|
|
9853
|
+
const LOCAL_MIN = -5000;
|
|
9854
|
+
const LOCAL_MAX = 4999;
|
|
9855
|
+
const SECTOR_COUNT = SECTORS_PER_AXIS * SECTORS_PER_AXIS;
|
|
9856
|
+
const REGION_COUNT = REGION_PER_AXIS * REGION_PER_AXIS;
|
|
9857
|
+
const SECTOR_FEISTEL = { n: SECTOR_COUNT, halfBits: 6, label: 'sector' };
|
|
9858
|
+
const REGION_FEISTEL = { n: REGION_COUNT, halfBits: 14, label: 'region' };
|
|
9859
|
+
|
|
9860
|
+
const ROUNDS = 4;
|
|
9861
|
+
const keyCache = new Map();
|
|
9862
|
+
function deriveRoundKeys(seed, label) {
|
|
9863
|
+
const cacheKey = `${seed}:${label}`;
|
|
9864
|
+
const cached = keyCache.get(cacheKey);
|
|
9865
|
+
if (cached)
|
|
9866
|
+
return cached;
|
|
9867
|
+
const h = hash512(seed, `coord-keys-${label}`).array;
|
|
9868
|
+
const keys = [];
|
|
9869
|
+
for (let i = 0; i < ROUNDS; i++) {
|
|
9870
|
+
const o = i * 4;
|
|
9871
|
+
keys.push(((h[o] << 24) | (h[o + 1] << 16) | (h[o + 2] << 8) | h[o + 3]) >>> 0);
|
|
9872
|
+
}
|
|
9873
|
+
keyCache.set(cacheKey, keys);
|
|
9874
|
+
return keys;
|
|
9875
|
+
}
|
|
9876
|
+
function roundFn(r, key, halfBits) {
|
|
9877
|
+
let x = (r ^ key) >>> 0;
|
|
9878
|
+
x = Math.imul(x ^ (x >>> 16), 0x9e3779b1) >>> 0;
|
|
9879
|
+
x = Math.imul(x ^ (x >>> 13), 0x7feb352d) >>> 0;
|
|
9880
|
+
x = (x ^ (x >>> 16)) >>> 0;
|
|
9881
|
+
return x & ((1 << halfBits) - 1);
|
|
9882
|
+
}
|
|
9883
|
+
function encryptBlock(x, halfBits, keys) {
|
|
9884
|
+
const mask = (1 << halfBits) - 1;
|
|
9885
|
+
let L = (x >>> halfBits) & mask;
|
|
9886
|
+
let R = x & mask;
|
|
9887
|
+
for (let i = 0; i < ROUNDS; i++) {
|
|
9888
|
+
const F = roundFn(R, keys[i], halfBits);
|
|
9889
|
+
const nL = R;
|
|
9890
|
+
const nR = (L ^ F) & mask;
|
|
9891
|
+
L = nL;
|
|
9892
|
+
R = nR;
|
|
9893
|
+
}
|
|
9894
|
+
return ((L << halfBits) | R) >>> 0;
|
|
9895
|
+
}
|
|
9896
|
+
function decryptBlock(y, halfBits, keys) {
|
|
9897
|
+
const mask = (1 << halfBits) - 1;
|
|
9898
|
+
let L = (y >>> halfBits) & mask;
|
|
9899
|
+
let R = y & mask;
|
|
9900
|
+
for (let i = ROUNDS - 1; i >= 0; i--) {
|
|
9901
|
+
const F = roundFn(L, keys[i], halfBits);
|
|
9902
|
+
const nR = L;
|
|
9903
|
+
const nL = (R ^ F) & mask;
|
|
9904
|
+
L = nL;
|
|
9905
|
+
R = nR;
|
|
9906
|
+
}
|
|
9907
|
+
return ((L << halfBits) | R) >>> 0;
|
|
9908
|
+
}
|
|
9909
|
+
function permute(seed, x, cfg) {
|
|
9910
|
+
const keys = deriveRoundKeys(seed, cfg.label);
|
|
9911
|
+
let v = encryptBlock(x, cfg.halfBits, keys);
|
|
9912
|
+
while (v >= cfg.n)
|
|
9913
|
+
v = encryptBlock(v, cfg.halfBits, keys);
|
|
9914
|
+
return v;
|
|
9915
|
+
}
|
|
9916
|
+
function unpermute(seed, y, cfg) {
|
|
9917
|
+
const keys = deriveRoundKeys(seed, cfg.label);
|
|
9918
|
+
let v = decryptBlock(y, cfg.halfBits, keys);
|
|
9919
|
+
while (v >= cfg.n)
|
|
9920
|
+
v = decryptBlock(v, cfg.halfBits, keys);
|
|
9921
|
+
return v;
|
|
9922
|
+
}
|
|
9923
|
+
|
|
9924
|
+
const ONSETS = ['b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't'];
|
|
9925
|
+
const VOWELS = ['a', 'e', 'i', 'o', 'u'];
|
|
9926
|
+
const CODAS = ['n', 'r', 'l', 's', 'k', 'm', 't', 'x'];
|
|
9927
|
+
const SYL_BASE = ONSETS.length * VOWELS.length * CODAS.length;
|
|
9928
|
+
function syllable(digit) {
|
|
9929
|
+
const onset = Math.floor(digit / (VOWELS.length * CODAS.length));
|
|
9930
|
+
const rem = digit % (VOWELS.length * CODAS.length);
|
|
9931
|
+
const vowel = Math.floor(rem / CODAS.length);
|
|
9932
|
+
const coda = rem % CODAS.length;
|
|
9933
|
+
return ONSETS[onset] + VOWELS[vowel] + CODAS[coda];
|
|
9934
|
+
}
|
|
9935
|
+
function unsyllable(chunk) {
|
|
9936
|
+
const onset = ONSETS.indexOf(chunk[0]);
|
|
9937
|
+
const vowel = VOWELS.indexOf(chunk[1]);
|
|
9938
|
+
const coda = CODAS.indexOf(chunk[2]);
|
|
9939
|
+
if (onset < 0 || vowel < 0 || coda < 0)
|
|
9940
|
+
throw new Error(`invalid region token chunk: ${chunk}`);
|
|
9941
|
+
return onset * (VOWELS.length * CODAS.length) + vowel * CODAS.length + coda;
|
|
9942
|
+
}
|
|
9943
|
+
function encodeRegion(seed, rx, ry) {
|
|
9944
|
+
const index = rx * REGION_PER_AXIS + ry;
|
|
9945
|
+
let n = permute(seed, index, REGION_FEISTEL);
|
|
9946
|
+
const d0 = n % SYL_BASE;
|
|
9947
|
+
n = Math.floor(n / SYL_BASE);
|
|
9948
|
+
const d1 = n % SYL_BASE;
|
|
9949
|
+
const d2 = Math.floor(n / SYL_BASE);
|
|
9950
|
+
const token = syllable(d2) + syllable(d1) + syllable(d0);
|
|
9951
|
+
return token.charAt(0).toUpperCase() + token.slice(1);
|
|
9952
|
+
}
|
|
9953
|
+
function decodeRegion(seed, token) {
|
|
9954
|
+
if (token.length !== 9)
|
|
9955
|
+
throw new Error(`invalid region token length: ${token}`);
|
|
9956
|
+
const lower = token.toLowerCase();
|
|
9957
|
+
const d2 = unsyllable(lower.slice(0, 3));
|
|
9958
|
+
const d1 = unsyllable(lower.slice(3, 6));
|
|
9959
|
+
const d0 = unsyllable(lower.slice(6, 9));
|
|
9960
|
+
const scrambled = (d2 * SYL_BASE + d1) * SYL_BASE + d0;
|
|
9961
|
+
if (scrambled >= REGION_FEISTEL.n)
|
|
9962
|
+
throw new Error(`invalid region token: ${token}`);
|
|
9963
|
+
const index = unpermute(seed, scrambled, REGION_FEISTEL);
|
|
9964
|
+
return { rx: Math.floor(index / REGION_PER_AXIS), ry: index % REGION_PER_AXIS };
|
|
9965
|
+
}
|
|
9966
|
+
|
|
9967
|
+
const SECTOR_ADJECTIVES = [
|
|
9968
|
+
'Amber',
|
|
9969
|
+
'Azure',
|
|
9970
|
+
'Brass',
|
|
9971
|
+
'Cinder',
|
|
9972
|
+
'Cobalt',
|
|
9973
|
+
'Copper',
|
|
9974
|
+
'Coral',
|
|
9975
|
+
'Crimson',
|
|
9976
|
+
'Crystal',
|
|
9977
|
+
'Dusk',
|
|
9978
|
+
'Ember',
|
|
9979
|
+
'Emerald',
|
|
9980
|
+
'Frost',
|
|
9981
|
+
'Glimmer',
|
|
9982
|
+
'Golden',
|
|
9983
|
+
'Hazy',
|
|
9984
|
+
'Indigo',
|
|
9985
|
+
'Iron',
|
|
9986
|
+
'Ivory',
|
|
9987
|
+
'Jade',
|
|
9988
|
+
'Lunar',
|
|
9989
|
+
'Misty',
|
|
9990
|
+
'Neon',
|
|
9991
|
+
'Onyx',
|
|
9992
|
+
'Opal',
|
|
9993
|
+
'Pearl',
|
|
9994
|
+
'Plasma',
|
|
9995
|
+
'Quartz',
|
|
9996
|
+
'Rusty',
|
|
9997
|
+
'Saffron',
|
|
9998
|
+
'Scarlet',
|
|
9999
|
+
'Silver',
|
|
10000
|
+
'Solar',
|
|
10001
|
+
'Static',
|
|
10002
|
+
'Stormy',
|
|
10003
|
+
'Sunny',
|
|
10004
|
+
'Teal',
|
|
10005
|
+
'Umber',
|
|
10006
|
+
'Velvet',
|
|
10007
|
+
'Verdant',
|
|
10008
|
+
'Vermilion',
|
|
10009
|
+
'Violet',
|
|
10010
|
+
'Wispy',
|
|
10011
|
+
];
|
|
10012
|
+
const SECTOR_NOUNS = [
|
|
10013
|
+
'Belt',
|
|
10014
|
+
'Bluff',
|
|
10015
|
+
'Cluster',
|
|
10016
|
+
'Coil',
|
|
10017
|
+
'Crest',
|
|
10018
|
+
'Drift',
|
|
10019
|
+
'Expanse',
|
|
10020
|
+
'Fathom',
|
|
10021
|
+
'Flare',
|
|
10022
|
+
'Gulf',
|
|
10023
|
+
'Halo',
|
|
10024
|
+
'Haven',
|
|
10025
|
+
'Hollow',
|
|
10026
|
+
'Maw',
|
|
10027
|
+
'Mesa',
|
|
10028
|
+
'Mire',
|
|
10029
|
+
'Notch',
|
|
10030
|
+
'Nook',
|
|
10031
|
+
'Oasis',
|
|
10032
|
+
'Lagoon',
|
|
10033
|
+
'Peak',
|
|
10034
|
+
'Pocket',
|
|
10035
|
+
'Reach',
|
|
10036
|
+
'Reef',
|
|
10037
|
+
'Ridge',
|
|
10038
|
+
'Rift',
|
|
10039
|
+
'Run',
|
|
10040
|
+
'Shoal',
|
|
10041
|
+
'Shroud',
|
|
10042
|
+
'Span',
|
|
10043
|
+
'Spire',
|
|
10044
|
+
'Spur',
|
|
10045
|
+
'Stretch',
|
|
10046
|
+
'Sprawl',
|
|
10047
|
+
'Tangle',
|
|
10048
|
+
'Trace',
|
|
10049
|
+
'Trench',
|
|
10050
|
+
'Vale',
|
|
10051
|
+
'Vault',
|
|
10052
|
+
'Verge',
|
|
10053
|
+
'Vortex',
|
|
10054
|
+
'Ward',
|
|
10055
|
+
'Wisp',
|
|
10056
|
+
];
|
|
10057
|
+
function encodeSector(seed, sx, sy) {
|
|
10058
|
+
const index = sx * SECTORS_PER_AXIS + sy;
|
|
10059
|
+
const scrambled = permute(seed, index, SECTOR_FEISTEL);
|
|
10060
|
+
const adj = Math.floor(scrambled / SECTORS_PER_AXIS);
|
|
10061
|
+
const noun = scrambled % SECTORS_PER_AXIS;
|
|
10062
|
+
return `${SECTOR_ADJECTIVES[adj]} ${SECTOR_NOUNS[noun]}`;
|
|
10063
|
+
}
|
|
10064
|
+
function decodeSector(seed, name) {
|
|
10065
|
+
const parts = name.trim().split(/\s+/);
|
|
10066
|
+
if (parts.length !== 2)
|
|
10067
|
+
throw new Error(`invalid sector name: ${name}`);
|
|
10068
|
+
const adj = SECTOR_ADJECTIVES.indexOf(parts[0]);
|
|
10069
|
+
const noun = SECTOR_NOUNS.indexOf(parts[1]);
|
|
10070
|
+
if (adj < 0 || noun < 0)
|
|
10071
|
+
throw new Error(`unknown sector name: ${name}`);
|
|
10072
|
+
const scrambled = adj * SECTORS_PER_AXIS + noun;
|
|
10073
|
+
const index = unpermute(seed, scrambled, SECTOR_FEISTEL);
|
|
10074
|
+
return { sx: Math.floor(index / SECTORS_PER_AXIS), sy: index % SECTORS_PER_AXIS };
|
|
10075
|
+
}
|
|
10076
|
+
|
|
10077
|
+
function sliceAxis(coord) {
|
|
10078
|
+
if (!Number.isInteger(coord) || coord < COORD_MIN || coord > COORD_MAX) {
|
|
10079
|
+
throw new RangeError(`coordinate out of range: ${coord}`);
|
|
10080
|
+
}
|
|
10081
|
+
const u = coord + COORD_OFFSET;
|
|
10082
|
+
return {
|
|
10083
|
+
sector: Math.floor(u / SECTOR_DIV),
|
|
10084
|
+
region: Math.floor(u / REGION_DIV) % REGION_PER_AXIS,
|
|
10085
|
+
local: (u % REGION_DIV) - LOCAL_HALF,
|
|
10086
|
+
};
|
|
10087
|
+
}
|
|
10088
|
+
function encodeAddress(seed, x, y) {
|
|
10089
|
+
const ax = sliceAxis(x);
|
|
10090
|
+
const ay = sliceAxis(y);
|
|
10091
|
+
return {
|
|
10092
|
+
sector: encodeSector(seed, ax.sector, ay.sector),
|
|
10093
|
+
region: encodeRegion(seed, ax.region, ay.region),
|
|
10094
|
+
localX: ax.local,
|
|
10095
|
+
localY: ay.local,
|
|
10096
|
+
};
|
|
10097
|
+
}
|
|
10098
|
+
function decodeAddress(seed, addr) {
|
|
10099
|
+
if (!Number.isInteger(addr.localX) ||
|
|
10100
|
+
!Number.isInteger(addr.localY) ||
|
|
10101
|
+
addr.localX < LOCAL_MIN ||
|
|
10102
|
+
addr.localX > LOCAL_MAX ||
|
|
10103
|
+
addr.localY < LOCAL_MIN ||
|
|
10104
|
+
addr.localY > LOCAL_MAX) {
|
|
10105
|
+
throw new RangeError(`local position out of range: ${addr.localX}, ${addr.localY}`);
|
|
10106
|
+
}
|
|
10107
|
+
const sector = decodeSector(seed, addr.sector);
|
|
10108
|
+
const region = decodeRegion(seed, addr.region);
|
|
10109
|
+
const x = sector.sx * SECTOR_DIV + region.rx * REGION_DIV + (addr.localX + LOCAL_HALF) - COORD_OFFSET;
|
|
10110
|
+
const y = sector.sy * SECTOR_DIV + region.ry * REGION_DIV + (addr.localY + LOCAL_HALF) - COORD_OFFSET;
|
|
10111
|
+
if (x < COORD_MIN || x > COORD_MAX || y < COORD_MIN || y > COORD_MAX) {
|
|
10112
|
+
throw new RangeError(`address decodes outside the coordinate range: ${x}, ${y}`);
|
|
10113
|
+
}
|
|
10114
|
+
return { x, y };
|
|
10115
|
+
}
|
|
10116
|
+
function addressFromCoordinates(seed, coords) {
|
|
10117
|
+
const x = typeof coords.x === 'number' ? coords.x : coords.x.toNumber();
|
|
10118
|
+
const y = typeof coords.y === 'number' ? coords.y : coords.y.toNumber();
|
|
10119
|
+
return encodeAddress(seed, x, y);
|
|
10120
|
+
}
|
|
10121
|
+
|
|
10122
|
+
const cache = new Map();
|
|
10123
|
+
const CACHE_MAX = 4096;
|
|
10124
|
+
function encodeAddressMemo(seed, x, y) {
|
|
10125
|
+
const key = `${antelope.Checksum256.from(seed).toString()}:${x},${y}`;
|
|
10126
|
+
let hit = cache.get(key);
|
|
10127
|
+
if (!hit) {
|
|
10128
|
+
hit = encodeAddress(seed, x, y);
|
|
10129
|
+
if (cache.size >= CACHE_MAX) {
|
|
10130
|
+
const oldest = cache.keys().next().value;
|
|
10131
|
+
if (oldest !== undefined)
|
|
10132
|
+
cache.delete(oldest);
|
|
10133
|
+
}
|
|
10134
|
+
cache.set(key, hit);
|
|
10135
|
+
}
|
|
10136
|
+
return hit;
|
|
10137
|
+
}
|
|
10138
|
+
|
|
10139
|
+
class CoordinatesManager extends BaseManager {
|
|
10140
|
+
async encode(x, y) {
|
|
10141
|
+
const game = await this.getGame();
|
|
10142
|
+
return encodeAddressMemo(game.config.seed, x, y);
|
|
10143
|
+
}
|
|
10144
|
+
async decode(addr) {
|
|
10145
|
+
const game = await this.getGame();
|
|
10146
|
+
return decodeAddress(game.config.seed, addr);
|
|
10147
|
+
}
|
|
10148
|
+
}
|
|
10149
|
+
|
|
9627
10150
|
class EpochsManager extends BaseManager {
|
|
9628
10151
|
async getCurrentHeight() {
|
|
9629
10152
|
const game = await this.getGame();
|
|
@@ -11506,11 +12029,14 @@ class ActionsManager extends BaseManager {
|
|
|
11506
12029
|
recharge,
|
|
11507
12030
|
});
|
|
11508
12031
|
}
|
|
11509
|
-
|
|
11510
|
-
|
|
12032
|
+
entityRefs(entities) {
|
|
12033
|
+
return entities.map((e) => exports.ServerTypes.entity_ref.from({
|
|
11511
12034
|
entity_type: e.entityType,
|
|
11512
12035
|
entity_id: antelope.UInt64.from(e.entityId),
|
|
11513
12036
|
}));
|
|
12037
|
+
}
|
|
12038
|
+
grouptravel(entities, destination, recharge = true) {
|
|
12039
|
+
const entityRefs = this.entityRefs(entities);
|
|
11514
12040
|
const x = antelope.Int64.from(destination.x);
|
|
11515
12041
|
const y = antelope.Int64.from(destination.y);
|
|
11516
12042
|
return this.server.action('grouptravel', {
|
|
@@ -11520,6 +12046,36 @@ class ActionsManager extends BaseManager {
|
|
|
11520
12046
|
recharge,
|
|
11521
12047
|
});
|
|
11522
12048
|
}
|
|
12049
|
+
transit(shipId, entrance, exit) {
|
|
12050
|
+
return this.server.action('transit', {
|
|
12051
|
+
id: antelope.UInt64.from(shipId),
|
|
12052
|
+
ax: antelope.Int64.from(entrance.x),
|
|
12053
|
+
ay: antelope.Int64.from(entrance.y),
|
|
12054
|
+
bx: antelope.Int64.from(exit.x),
|
|
12055
|
+
by: antelope.Int64.from(exit.y),
|
|
12056
|
+
});
|
|
12057
|
+
}
|
|
12058
|
+
grouptransit(entities, entrance, exit) {
|
|
12059
|
+
const entityRefs = this.entityRefs(entities);
|
|
12060
|
+
return this.server.action('grouptransit', {
|
|
12061
|
+
entities: entityRefs,
|
|
12062
|
+
ax: antelope.Int64.from(entrance.x),
|
|
12063
|
+
ay: antelope.Int64.from(entrance.y),
|
|
12064
|
+
bx: antelope.Int64.from(exit.x),
|
|
12065
|
+
by: antelope.Int64.from(exit.y),
|
|
12066
|
+
});
|
|
12067
|
+
}
|
|
12068
|
+
getwormhole(x, y) {
|
|
12069
|
+
return this.server.action('getwormhole', { x: antelope.Int64.from(x), y: antelope.Int64.from(y) });
|
|
12070
|
+
}
|
|
12071
|
+
getdistance(origin, destination) {
|
|
12072
|
+
return this.server.action('getdistance', {
|
|
12073
|
+
ax: antelope.Int64.from(origin.x),
|
|
12074
|
+
ay: antelope.Int64.from(origin.y),
|
|
12075
|
+
bx: antelope.Int64.from(destination.x),
|
|
12076
|
+
by: antelope.Int64.from(destination.y),
|
|
12077
|
+
});
|
|
12078
|
+
}
|
|
11523
12079
|
resolve(entityId, count) {
|
|
11524
12080
|
const params = {
|
|
11525
12081
|
id: antelope.UInt64.from(entityId),
|
|
@@ -11582,12 +12138,25 @@ class ActionsManager extends BaseManager {
|
|
|
11582
12138
|
account: antelope.Name.from(account),
|
|
11583
12139
|
});
|
|
11584
12140
|
}
|
|
11585
|
-
gather(sourceId, destinationId, stratum, quantity) {
|
|
11586
|
-
|
|
12141
|
+
gather(sourceId, destinationId, stratum, quantity, slot) {
|
|
12142
|
+
const params = {
|
|
11587
12143
|
source_id: antelope.UInt64.from(sourceId),
|
|
11588
12144
|
destination_id: antelope.UInt64.from(destinationId),
|
|
11589
12145
|
stratum: antelope.UInt16.from(stratum),
|
|
11590
12146
|
quantity: antelope.UInt32.from(quantity),
|
|
12147
|
+
};
|
|
12148
|
+
if (slot !== undefined) {
|
|
12149
|
+
params.slot = antelope.UInt8.from(slot);
|
|
12150
|
+
}
|
|
12151
|
+
return this.server.action('gather', params);
|
|
12152
|
+
}
|
|
12153
|
+
bundleGather(gathers) {
|
|
12154
|
+
const actions = gathers.map(({ sourceId, destinationId, stratum, quantity, slot }) => this.gather(sourceId, destinationId, stratum, quantity, slot));
|
|
12155
|
+
return antelope.Transaction.from({
|
|
12156
|
+
expiration: 0,
|
|
12157
|
+
ref_block_num: 0,
|
|
12158
|
+
ref_block_prefix: 0,
|
|
12159
|
+
actions,
|
|
11591
12160
|
});
|
|
11592
12161
|
}
|
|
11593
12162
|
warp(entityId, destination) {
|
|
@@ -11599,7 +12168,7 @@ class ActionsManager extends BaseManager {
|
|
|
11599
12168
|
y,
|
|
11600
12169
|
});
|
|
11601
12170
|
}
|
|
11602
|
-
craft(entityId, recipeId, quantity, inputs, target) {
|
|
12171
|
+
craft(entityId, recipeId, quantity, inputs, target, slot) {
|
|
11603
12172
|
const params = {
|
|
11604
12173
|
id: antelope.UInt64.from(entityId),
|
|
11605
12174
|
recipe_id: antelope.UInt16.from(recipeId),
|
|
@@ -11609,6 +12178,9 @@ class ActionsManager extends BaseManager {
|
|
|
11609
12178
|
if (target !== undefined) {
|
|
11610
12179
|
params.target = antelope.UInt64.from(target);
|
|
11611
12180
|
}
|
|
12181
|
+
if (slot !== undefined) {
|
|
12182
|
+
params.slot = antelope.UInt8.from(slot);
|
|
12183
|
+
}
|
|
11612
12184
|
return this.server.action('craft', params);
|
|
11613
12185
|
}
|
|
11614
12186
|
blend(entityId, inputs) {
|
|
@@ -12276,6 +12848,12 @@ class GameContext {
|
|
|
12276
12848
|
}
|
|
12277
12849
|
return this._locations;
|
|
12278
12850
|
}
|
|
12851
|
+
get coordinates() {
|
|
12852
|
+
if (!this._coordinates) {
|
|
12853
|
+
this._coordinates = new CoordinatesManager(this);
|
|
12854
|
+
}
|
|
12855
|
+
return this._coordinates;
|
|
12856
|
+
}
|
|
12279
12857
|
get epochs() {
|
|
12280
12858
|
if (!this._epochs) {
|
|
12281
12859
|
this._epochs = new EpochsManager(this);
|
|
@@ -12396,6 +12974,9 @@ class Shipload {
|
|
|
12396
12974
|
get locations() {
|
|
12397
12975
|
return this._context.locations;
|
|
12398
12976
|
}
|
|
12977
|
+
get coordinates() {
|
|
12978
|
+
return this._context.coordinates;
|
|
12979
|
+
}
|
|
12399
12980
|
get epochs() {
|
|
12400
12981
|
return this._context.epochs;
|
|
12401
12982
|
}
|
|
@@ -12445,8 +13026,8 @@ function computeBaseHullmass$1(stats) {
|
|
|
12445
13026
|
return 100000 - 75 * stats.density;
|
|
12446
13027
|
}
|
|
12447
13028
|
function computeShipHullCapabilities(stats) {
|
|
12448
|
-
const statSum = stats.strength + stats.hardness
|
|
12449
|
-
const exponent = statSum /
|
|
13029
|
+
const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
|
|
13030
|
+
const exponent = statSum / 1998.0;
|
|
12450
13031
|
return {
|
|
12451
13032
|
hullmass: computeBaseHullmass$1(stats),
|
|
12452
13033
|
capacity: Math.floor(5000000 * 6 ** exponent),
|
|
@@ -12537,9 +13118,9 @@ function computeStorageCapabilities(stats, baseCapacity) {
|
|
|
12537
13118
|
function computeBaseCapacity(itemId, stats) {
|
|
12538
13119
|
switch (itemId) {
|
|
12539
13120
|
case ITEM_SHIP_T1_PACKED:
|
|
13121
|
+
return computeShipHullCapabilities(stats).capacity;
|
|
12540
13122
|
case ITEM_EXTRACTOR_T1_PACKED:
|
|
12541
13123
|
case ITEM_FACTORY_T1_PACKED:
|
|
12542
|
-
return computeShipHullCapabilities(stats).capacity;
|
|
12543
13124
|
case ITEM_CONTAINER_T1_PACKED:
|
|
12544
13125
|
return computeContainerCapabilities(stats).capacity;
|
|
12545
13126
|
case ITEM_WAREHOUSE_T1_PACKED:
|
|
@@ -12555,8 +13136,8 @@ function computeWarpCapabilities(stats) {
|
|
|
12555
13136
|
return { range: 100 + resonance * 3 };
|
|
12556
13137
|
}
|
|
12557
13138
|
function computeWarehouseHullCapabilities(stats) {
|
|
12558
|
-
const statSum = stats.strength + stats.hardness
|
|
12559
|
-
const exponent = statSum /
|
|
13139
|
+
const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
|
|
13140
|
+
const exponent = statSum / 1998.0;
|
|
12560
13141
|
return {
|
|
12561
13142
|
hullmass: computeBaseHullmass$1(stats),
|
|
12562
13143
|
capacity: Math.floor(100000000 * 6 ** exponent),
|
|
@@ -12591,6 +13172,9 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12591
13172
|
let hasWarp = false;
|
|
12592
13173
|
let totalBatteryStatSum = 0;
|
|
12593
13174
|
let batteryCount = 0;
|
|
13175
|
+
const gathererLanes = [];
|
|
13176
|
+
const crafterLanes = [];
|
|
13177
|
+
const loaderLanes = [];
|
|
12594
13178
|
for (const mod of modules) {
|
|
12595
13179
|
const item = getItem(mod.itemId);
|
|
12596
13180
|
const modType = getModuleCapabilityType(mod.itemId);
|
|
@@ -12613,10 +13197,18 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12613
13197
|
hasGatherer = true;
|
|
12614
13198
|
const tier = item.tier;
|
|
12615
13199
|
const caps = computeGathererCapabilities(decodedStats, tier);
|
|
12616
|
-
|
|
13200
|
+
const scaledYield = applySlotMultiplier(caps.yield, amp);
|
|
13201
|
+
totalGathYield += scaledYield;
|
|
12617
13202
|
totalGathDrain += caps.drain;
|
|
12618
13203
|
if (caps.depth > maxGathDepth)
|
|
12619
13204
|
maxGathDepth = caps.depth;
|
|
13205
|
+
gathererLanes.push({
|
|
13206
|
+
slotIndex: mod.slotIndex,
|
|
13207
|
+
yield: scaledYield,
|
|
13208
|
+
drain: caps.drain,
|
|
13209
|
+
depth: caps.depth,
|
|
13210
|
+
outputPct: amp,
|
|
13211
|
+
});
|
|
12620
13212
|
}
|
|
12621
13213
|
else if (modType === MODULE_LOADER) {
|
|
12622
13214
|
hasLoader = true;
|
|
@@ -12624,6 +13216,12 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12624
13216
|
totalLoaderMass += caps.mass;
|
|
12625
13217
|
totalLoaderThrust += applySlotMultiplier(caps.thrust, amp);
|
|
12626
13218
|
totalLoaderQuantity += caps.quantity;
|
|
13219
|
+
loaderLanes.push({
|
|
13220
|
+
slotIndex: mod.slotIndex,
|
|
13221
|
+
mass: caps.mass,
|
|
13222
|
+
thrust: applySlotMultiplier(caps.thrust, amp),
|
|
13223
|
+
outputPct: amp,
|
|
13224
|
+
});
|
|
12627
13225
|
}
|
|
12628
13226
|
else if (modType === MODULE_STORAGE) {
|
|
12629
13227
|
const caps = computeStorageCapabilities(decodedStats, baseCapacity);
|
|
@@ -12632,8 +13230,15 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12632
13230
|
else if (modType === MODULE_CRAFTER) {
|
|
12633
13231
|
hasCrafter = true;
|
|
12634
13232
|
const caps = computeCrafterCapabilities(decodedStats);
|
|
12635
|
-
|
|
13233
|
+
const scaledSpeed = applySlotMultiplier(caps.speed, amp);
|
|
13234
|
+
totalCrafterSpeed += scaledSpeed;
|
|
12636
13235
|
totalCrafterDrain += caps.drain;
|
|
13236
|
+
crafterLanes.push({
|
|
13237
|
+
slotIndex: mod.slotIndex,
|
|
13238
|
+
speed: scaledSpeed,
|
|
13239
|
+
drain: caps.drain,
|
|
13240
|
+
outputPct: amp,
|
|
13241
|
+
});
|
|
12637
13242
|
}
|
|
12638
13243
|
else if (modType === MODULE_HAULER) {
|
|
12639
13244
|
hasHauler = true;
|
|
@@ -12681,6 +13286,7 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12681
13286
|
drain: totalGathDrain,
|
|
12682
13287
|
depth: maxGathDepth,
|
|
12683
13288
|
};
|
|
13289
|
+
result.gathererLanes = gathererLanes;
|
|
12684
13290
|
}
|
|
12685
13291
|
if (hasLoader) {
|
|
12686
13292
|
result.loaders = {
|
|
@@ -12688,9 +13294,11 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12688
13294
|
thrust: clampUint16(totalLoaderThrust),
|
|
12689
13295
|
quantity: totalLoaderQuantity,
|
|
12690
13296
|
};
|
|
13297
|
+
result.loaderLanes = loaderLanes;
|
|
12691
13298
|
}
|
|
12692
13299
|
if (hasCrafter) {
|
|
12693
13300
|
result.crafter = { speed: clampUint16(totalCrafterSpeed), drain: totalCrafterDrain };
|
|
13301
|
+
result.crafterLanes = crafterLanes;
|
|
12694
13302
|
}
|
|
12695
13303
|
if (hasHauler) {
|
|
12696
13304
|
const efficiency = totalHaulerCapacity > 0 ? Number(weightedHaulerEffNum / BigInt(totalHaulerCapacity)) : 0;
|
|
@@ -12706,20 +13314,19 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12706
13314
|
return result;
|
|
12707
13315
|
}
|
|
12708
13316
|
function computeContainerCapabilities(stats) {
|
|
12709
|
-
const statSum = stats.strength + stats.hardness
|
|
12710
|
-
const exponent = statSum /
|
|
13317
|
+
const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
|
|
13318
|
+
const exponent = statSum / 1998.0;
|
|
12711
13319
|
return {
|
|
12712
13320
|
hullmass: computeBaseHullmass$1(stats),
|
|
12713
13321
|
capacity: Math.floor(22000000 * 6 ** exponent),
|
|
12714
13322
|
};
|
|
12715
13323
|
}
|
|
12716
13324
|
function computeContainerT2Capabilities(stats) {
|
|
12717
|
-
const strength = stats.strength;
|
|
12718
|
-
const density = stats.density;
|
|
12719
|
-
const hardness = stats.hardness;
|
|
12720
|
-
const cohesion = stats.cohesion;
|
|
13325
|
+
const strength = stats.strength ?? 0;
|
|
13326
|
+
const density = stats.density ?? 0;
|
|
13327
|
+
const hardness = stats.hardness ?? 0;
|
|
12721
13328
|
const hullmass = 70000 - 50 * density;
|
|
12722
|
-
const statSum = strength + hardness
|
|
13329
|
+
const statSum = strength + hardness;
|
|
12723
13330
|
const exponent = statSum / 2947;
|
|
12724
13331
|
const capacity = Math.floor(24000000 * 6 ** exponent);
|
|
12725
13332
|
return { hullmass, capacity };
|
|
@@ -12816,17 +13423,36 @@ function makeEntity(packedItemId, state) {
|
|
|
12816
13423
|
info.engines = caps.engines;
|
|
12817
13424
|
if (caps.generator)
|
|
12818
13425
|
info.generator = caps.generator;
|
|
12819
|
-
if (caps.gatherer)
|
|
12820
|
-
info.gatherer = caps.gatherer;
|
|
12821
|
-
if (caps.loaders)
|
|
12822
|
-
info.loaders = caps.loaders;
|
|
12823
|
-
if (caps.crafter)
|
|
12824
|
-
info.crafter = caps.crafter;
|
|
12825
13426
|
if (caps.hauler)
|
|
12826
13427
|
info.hauler = caps.hauler;
|
|
12827
13428
|
if (caps.warp)
|
|
12828
13429
|
info.warp = caps.warp;
|
|
13430
|
+
info.gatherer_lanes = (caps.gathererLanes ?? []).map((l) => exports.ServerTypes.gatherer_lane.from({
|
|
13431
|
+
slot_index: l.slotIndex,
|
|
13432
|
+
yield: l.yield,
|
|
13433
|
+
drain: l.drain,
|
|
13434
|
+
depth: l.depth,
|
|
13435
|
+
output_pct: l.outputPct,
|
|
13436
|
+
}));
|
|
13437
|
+
info.crafter_lanes = (caps.crafterLanes ?? []).map((l) => exports.ServerTypes.crafter_lane.from({
|
|
13438
|
+
slot_index: l.slotIndex,
|
|
13439
|
+
speed: l.speed,
|
|
13440
|
+
drain: l.drain,
|
|
13441
|
+
output_pct: l.outputPct,
|
|
13442
|
+
}));
|
|
13443
|
+
info.loader_lanes = (caps.loaderLanes ?? []).map((l) => exports.ServerTypes.loader_lane.from({
|
|
13444
|
+
slot_index: l.slotIndex,
|
|
13445
|
+
mass: l.mass,
|
|
13446
|
+
thrust: l.thrust,
|
|
13447
|
+
output_pct: l.outputPct,
|
|
13448
|
+
}));
|
|
12829
13449
|
}
|
|
13450
|
+
if (!info.gatherer_lanes)
|
|
13451
|
+
info.gatherer_lanes = [];
|
|
13452
|
+
if (!info.crafter_lanes)
|
|
13453
|
+
info.crafter_lanes = [];
|
|
13454
|
+
if (!info.loader_lanes)
|
|
13455
|
+
info.loader_lanes = [];
|
|
12830
13456
|
const entityInfo = exports.ServerTypes.entity_info.from(info);
|
|
12831
13457
|
return new Entity(entityInfo);
|
|
12832
13458
|
}
|
|
@@ -12951,9 +13577,10 @@ class ConstructionManager extends BaseManager {
|
|
|
12951
13577
|
continue;
|
|
12952
13578
|
if (!coordsEqual(entity.coordinates, target.coordinates))
|
|
12953
13579
|
continue;
|
|
12954
|
-
const
|
|
12955
|
-
if (
|
|
13580
|
+
const crafterLanes = entity.crafter_lanes ?? [];
|
|
13581
|
+
if (crafterLanes.length === 0)
|
|
12956
13582
|
continue;
|
|
13583
|
+
const speed = crafterLanes.reduce((s, l) => s + Number(l.speed), 0);
|
|
12957
13584
|
out.push({
|
|
12958
13585
|
entityId: entity.id,
|
|
12959
13586
|
entityType: entity.type,
|
|
@@ -13182,8 +13809,9 @@ function partitionSources(target, entities, cargo) {
|
|
|
13182
13809
|
const relevant = matchRelevantCargo(entity, target, cargo, reserved);
|
|
13183
13810
|
if (relevant.length === 0)
|
|
13184
13811
|
continue;
|
|
13185
|
-
const
|
|
13186
|
-
const
|
|
13812
|
+
const loaderLanes = entity.loader_lanes ?? [];
|
|
13813
|
+
const loaderCount = loaderLanes.length;
|
|
13814
|
+
const loaderTotalMass = loaderLanes.reduce((s, l) => s + Number(l.mass), 0);
|
|
13187
13815
|
const ref = {
|
|
13188
13816
|
entityId: entity.id,
|
|
13189
13817
|
name: entity.id.toString(),
|
|
@@ -13291,6 +13919,179 @@ function validateDisplayName(input, opts = {}) {
|
|
|
13291
13919
|
return { valid: true, name };
|
|
13292
13920
|
}
|
|
13293
13921
|
|
|
13922
|
+
function idiv(a, b) {
|
|
13923
|
+
return Math.floor(a / b);
|
|
13924
|
+
}
|
|
13925
|
+
function computeBaseHullmass(stats) {
|
|
13926
|
+
const density = decodeStat(stats, 1);
|
|
13927
|
+
return 100000 - 75 * density;
|
|
13928
|
+
}
|
|
13929
|
+
function computeBaseCapacityShip(stats) {
|
|
13930
|
+
const s = decodeStat(stats, 0) + decodeStat(stats, 2);
|
|
13931
|
+
return Math.floor(5000000 * 6 ** (s / 1998));
|
|
13932
|
+
}
|
|
13933
|
+
function computeBaseCapacityContainer(stats) {
|
|
13934
|
+
const s = decodeStat(stats, 0) + decodeStat(stats, 2);
|
|
13935
|
+
return Math.floor(22000000 * 6 ** (s / 1998));
|
|
13936
|
+
}
|
|
13937
|
+
function computeBaseCapacityContainerT2(stats) {
|
|
13938
|
+
const s = decodeStat(stats, 0) + decodeStat(stats, 2);
|
|
13939
|
+
return Math.floor(24000000 * 6 ** (s / 2947));
|
|
13940
|
+
}
|
|
13941
|
+
function computeBaseCapacityWarehouse(stats) {
|
|
13942
|
+
const s = decodeStat(stats, 0) + decodeStat(stats, 2);
|
|
13943
|
+
return Math.floor(100000000 * 6 ** (s / 1998));
|
|
13944
|
+
}
|
|
13945
|
+
const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
|
|
13946
|
+
const computeEngineDrain = (thm) => 2 * Math.max(30, 50 - idiv(thm, 70));
|
|
13947
|
+
const computeGeneratorCap = (com) => 950 + idiv(com, 2);
|
|
13948
|
+
const computeGeneratorRech = (fin) => 2 * (1 + idiv(fin * 3, 1000));
|
|
13949
|
+
const computeGathererYield = (str) => 200 + str;
|
|
13950
|
+
const computeGathererDrain = (con) => 2 * Math.max(250, 1250 - idiv(con * 25, 20));
|
|
13951
|
+
const computeGathererDepth = (tol, tier) => gathererDepthForTier(tol, tier);
|
|
13952
|
+
const computeLoaderMass = (ins) => Math.max(200, 2000 - ins * 2);
|
|
13953
|
+
const computeLoaderThrust = (pla) => 1 + idiv(pla * pla, 10000);
|
|
13954
|
+
const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
|
|
13955
|
+
const computeCrafterDrain = (fin) => Math.max(5, 30 - idiv(fin, 33));
|
|
13956
|
+
const computeHaulerCapacity = (fin) => Math.max(1, 1 + idiv(fin, 400));
|
|
13957
|
+
const computeHaulerEfficiency = (con) => 2000 + con * 6;
|
|
13958
|
+
const computeHaulerDrain$1 = (com) => Math.max(3, 15 - idiv(com, 80));
|
|
13959
|
+
const computeWarpRange = (stat) => 100 + stat * 3;
|
|
13960
|
+
function entityDisplayName(itemId) {
|
|
13961
|
+
switch (itemId) {
|
|
13962
|
+
case ITEM_SHIP_T1_PACKED:
|
|
13963
|
+
return 'Ship';
|
|
13964
|
+
case ITEM_WAREHOUSE_T1_PACKED:
|
|
13965
|
+
return 'Warehouse';
|
|
13966
|
+
case ITEM_EXTRACTOR_T1_PACKED:
|
|
13967
|
+
return 'Extractor';
|
|
13968
|
+
case ITEM_FACTORY_T1_PACKED:
|
|
13969
|
+
return 'Factory';
|
|
13970
|
+
case ITEM_CONTAINER_T1_PACKED:
|
|
13971
|
+
return 'Container';
|
|
13972
|
+
case ITEM_CONTAINER_T2_PACKED:
|
|
13973
|
+
return 'Container';
|
|
13974
|
+
default:
|
|
13975
|
+
return 'Entity';
|
|
13976
|
+
}
|
|
13977
|
+
}
|
|
13978
|
+
function moduleDisplayName(itemId) {
|
|
13979
|
+
switch (itemId) {
|
|
13980
|
+
case ITEM_ENGINE_T1:
|
|
13981
|
+
return 'Engine';
|
|
13982
|
+
case ITEM_GENERATOR_T1:
|
|
13983
|
+
return 'Generator';
|
|
13984
|
+
case ITEM_GATHERER_T1:
|
|
13985
|
+
return 'Gatherer';
|
|
13986
|
+
case ITEM_LOADER_T1:
|
|
13987
|
+
return 'Loader';
|
|
13988
|
+
case ITEM_CRAFTER_T1:
|
|
13989
|
+
return 'Crafter';
|
|
13990
|
+
case ITEM_STORAGE_T1:
|
|
13991
|
+
return 'Storage';
|
|
13992
|
+
case ITEM_HAULER_T1:
|
|
13993
|
+
return 'Hauler';
|
|
13994
|
+
case ITEM_WARP_T1:
|
|
13995
|
+
return 'Warp';
|
|
13996
|
+
default:
|
|
13997
|
+
return 'Module';
|
|
13998
|
+
}
|
|
13999
|
+
}
|
|
14000
|
+
function formatModuleLine(slot, itemId, stats) {
|
|
14001
|
+
let out = `Slot ${slot} - `;
|
|
14002
|
+
if (itemId === 0) {
|
|
14003
|
+
out += '(empty)';
|
|
14004
|
+
return out;
|
|
14005
|
+
}
|
|
14006
|
+
out += moduleDisplayName(itemId);
|
|
14007
|
+
const subtype = getModuleCapabilityType(itemId);
|
|
14008
|
+
switch (subtype) {
|
|
14009
|
+
case MODULE_ENGINE: {
|
|
14010
|
+
const vol = decodeStat(stats, 0);
|
|
14011
|
+
const thm = decodeStat(stats, 1);
|
|
14012
|
+
out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`;
|
|
14013
|
+
break;
|
|
14014
|
+
}
|
|
14015
|
+
case MODULE_GENERATOR: {
|
|
14016
|
+
const res = decodeStat(stats, 0);
|
|
14017
|
+
const ref = decodeStat(stats, 1);
|
|
14018
|
+
out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`;
|
|
14019
|
+
break;
|
|
14020
|
+
}
|
|
14021
|
+
case MODULE_GATHERER: {
|
|
14022
|
+
const str = decodeStat(stats, 0);
|
|
14023
|
+
const tol = decodeStat(stats, 1);
|
|
14024
|
+
const con = decodeStat(stats, 2);
|
|
14025
|
+
const tier = getItem(itemId).tier;
|
|
14026
|
+
out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol, tier)} Drain ${computeGathererDrain(con)}`;
|
|
14027
|
+
break;
|
|
14028
|
+
}
|
|
14029
|
+
case MODULE_LOADER: {
|
|
14030
|
+
const fin = decodeStat(stats, 0);
|
|
14031
|
+
const pla = decodeStat(stats, 1);
|
|
14032
|
+
out += ` Mass ${computeLoaderMass(fin)} Thrust ${computeLoaderThrust(pla)}`;
|
|
14033
|
+
break;
|
|
14034
|
+
}
|
|
14035
|
+
case MODULE_CRAFTER: {
|
|
14036
|
+
const rea = decodeStat(stats, 0);
|
|
14037
|
+
const com = decodeStat(stats, 1);
|
|
14038
|
+
out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(com)}`;
|
|
14039
|
+
break;
|
|
14040
|
+
}
|
|
14041
|
+
case MODULE_STORAGE: {
|
|
14042
|
+
const str = decodeStat(stats, 0);
|
|
14043
|
+
const fin = decodeStat(stats, 2);
|
|
14044
|
+
const sat = decodeStat(stats, 3);
|
|
14045
|
+
const sum = str + fin + sat;
|
|
14046
|
+
const pct = 10 + idiv(sum * 10, 2997);
|
|
14047
|
+
out += ` +${pct}% capacity`;
|
|
14048
|
+
break;
|
|
14049
|
+
}
|
|
14050
|
+
case MODULE_HAULER: {
|
|
14051
|
+
const res = decodeStat(stats, 0);
|
|
14052
|
+
const pla = decodeStat(stats, 1);
|
|
14053
|
+
const ref = decodeStat(stats, 2);
|
|
14054
|
+
out += ` Capacity ${computeHaulerCapacity(res)} Efficiency ${computeHaulerEfficiency(pla)} Drain ${computeHaulerDrain$1(ref)}`;
|
|
14055
|
+
break;
|
|
14056
|
+
}
|
|
14057
|
+
case MODULE_WARP: {
|
|
14058
|
+
const stat = decodeStat(stats, 0);
|
|
14059
|
+
out += ` Range ${computeWarpRange(stat)}`;
|
|
14060
|
+
break;
|
|
14061
|
+
}
|
|
14062
|
+
}
|
|
14063
|
+
return out;
|
|
14064
|
+
}
|
|
14065
|
+
function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
|
|
14066
|
+
const hullMass = computeBaseHullmass(hullStats);
|
|
14067
|
+
let baseCapacity = 0;
|
|
14068
|
+
if (itemId === ITEM_SHIP_T1_PACKED) {
|
|
14069
|
+
baseCapacity = computeBaseCapacityShip(hullStats);
|
|
14070
|
+
}
|
|
14071
|
+
else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
|
|
14072
|
+
baseCapacity = computeBaseCapacityWarehouse(hullStats);
|
|
14073
|
+
}
|
|
14074
|
+
else if (itemId === ITEM_EXTRACTOR_T1_PACKED ||
|
|
14075
|
+
itemId === ITEM_FACTORY_T1_PACKED ||
|
|
14076
|
+
itemId === ITEM_CONTAINER_T1_PACKED) {
|
|
14077
|
+
baseCapacity = computeBaseCapacityContainer(hullStats);
|
|
14078
|
+
}
|
|
14079
|
+
else if (itemId === ITEM_CONTAINER_T2_PACKED) {
|
|
14080
|
+
baseCapacity = computeBaseCapacityContainerT2(hullStats);
|
|
14081
|
+
}
|
|
14082
|
+
let out = entityDisplayName(itemId);
|
|
14083
|
+
out += ` - Hull ${hullMass} mass`;
|
|
14084
|
+
if (baseCapacity > 0) {
|
|
14085
|
+
out += ` * ${baseCapacity} capacity`;
|
|
14086
|
+
}
|
|
14087
|
+
out += '\n\n';
|
|
14088
|
+
for (let i = 0; i < moduleItems.length; i++) {
|
|
14089
|
+
out += formatModuleLine(i, moduleItems[i], moduleStats[i] ?? 0n);
|
|
14090
|
+
out += '\n';
|
|
14091
|
+
}
|
|
14092
|
+
return out;
|
|
14093
|
+
}
|
|
14094
|
+
|
|
13294
14095
|
function laneKeyForModule(slotIndex) {
|
|
13295
14096
|
return slotIndex + 1;
|
|
13296
14097
|
}
|
|
@@ -13298,7 +14099,95 @@ function laneIsFree(lanes, laneKey) {
|
|
|
13298
14099
|
const lane = lanes.find((entry) => entry.lane_key.toNumber() === laneKey);
|
|
13299
14100
|
return lane ? lane.schedule.tasks.length === 0 : true;
|
|
13300
14101
|
}
|
|
13301
|
-
function
|
|
14102
|
+
function resolveLaneGatherer(modules, entityItemId, laneKey) {
|
|
14103
|
+
const idx = laneKey - 1;
|
|
14104
|
+
const installed = idx >= 0 && idx < modules.length ? modules[idx].installed : undefined;
|
|
14105
|
+
if (!installed)
|
|
14106
|
+
throw new Error('gatherer lane has no module');
|
|
14107
|
+
const item = getItem(Number(installed.item_id.value ?? installed.item_id));
|
|
14108
|
+
if (item.moduleType !== 'gatherer')
|
|
14109
|
+
throw new Error('lane module is not a gatherer');
|
|
14110
|
+
const stats = BigInt(installed.stats.toString());
|
|
14111
|
+
const str = decodeStat(stats, 0);
|
|
14112
|
+
const tol = decodeStat(stats, 1);
|
|
14113
|
+
const con = decodeStat(stats, 2);
|
|
14114
|
+
const layout = getEntityLayout(entityItemId)?.slots ?? [];
|
|
14115
|
+
const amp = getSlotAmp(layout, idx);
|
|
14116
|
+
const yieldVal = applySlotMultiplier(computeGathererYield(str), amp);
|
|
14117
|
+
const drain = computeGathererDrain(con);
|
|
14118
|
+
const depth = gathererDepthForTier(tol, item.tier ?? 1);
|
|
14119
|
+
return { slotIndex: idx, yield: yieldVal, drain, depth, outputPct: amp };
|
|
14120
|
+
}
|
|
14121
|
+
function selectGatherLane(modules, entityItemId, lanes, stratum, explicitSlot) {
|
|
14122
|
+
if (explicitSlot !== undefined) {
|
|
14123
|
+
const laneKey = laneKeyForModule(explicitSlot);
|
|
14124
|
+
const lane = resolveLaneGatherer(modules, entityItemId, laneKey);
|
|
14125
|
+
if (stratum > lane.depth)
|
|
14126
|
+
throw new Error('stratum exceeds gatherer depth');
|
|
14127
|
+
return laneKey;
|
|
14128
|
+
}
|
|
14129
|
+
return workerLaneKey(modules, 'gatherer', lanes, stratum);
|
|
14130
|
+
}
|
|
14131
|
+
function resolveLaneCrafter(modules, entityItemId, laneKey) {
|
|
14132
|
+
const idx = laneKey - 1;
|
|
14133
|
+
const installed = idx >= 0 && idx < modules.length ? modules[idx].installed : undefined;
|
|
14134
|
+
if (!installed)
|
|
14135
|
+
throw new Error('crafter lane has no module');
|
|
14136
|
+
const item = getItem(Number(installed.item_id.value ?? installed.item_id));
|
|
14137
|
+
if (item.moduleType !== 'crafter')
|
|
14138
|
+
throw new Error('lane module is not a crafter');
|
|
14139
|
+
const stats = BigInt(installed.stats.toString());
|
|
14140
|
+
const rea = decodeStat(stats, 0);
|
|
14141
|
+
const fin = decodeStat(stats, 1);
|
|
14142
|
+
const layout = getEntityLayout(entityItemId)?.slots ?? [];
|
|
14143
|
+
const amp = getSlotAmp(layout, idx);
|
|
14144
|
+
const speed = applySlotMultiplier(computeCrafterSpeed(rea), amp);
|
|
14145
|
+
const drain = computeCrafterDrain(fin);
|
|
14146
|
+
return { slotIndex: idx, speed, drain, outputPct: amp };
|
|
14147
|
+
}
|
|
14148
|
+
function resolveLaneLoader(modules, entityItemId, laneKey) {
|
|
14149
|
+
if (laneKey === LANE_MOBILITY) {
|
|
14150
|
+
return { slotIndex: -1, thrust: 0, mass: 0, outputPct: 0, valid: false };
|
|
14151
|
+
}
|
|
14152
|
+
const idx = laneKey - 1;
|
|
14153
|
+
const installed = idx >= 0 && idx < modules.length ? modules[idx].installed : undefined;
|
|
14154
|
+
if (!installed) {
|
|
14155
|
+
return { slotIndex: idx, thrust: 0, mass: 0, outputPct: 0, valid: false };
|
|
14156
|
+
}
|
|
14157
|
+
const stats = BigInt(installed.stats.toString());
|
|
14158
|
+
const ins = decodeStat(stats, 0);
|
|
14159
|
+
const pla = decodeStat(stats, 1);
|
|
14160
|
+
const layout = getEntityLayout(entityItemId)?.slots ?? [];
|
|
14161
|
+
const amp = getSlotAmp(layout, idx);
|
|
14162
|
+
const thrust = applySlotMultiplier(computeLoaderThrust(pla), amp);
|
|
14163
|
+
const mass = computeLoaderMass(ins);
|
|
14164
|
+
return { slotIndex: idx, thrust, mass, outputPct: amp, valid: true };
|
|
14165
|
+
}
|
|
14166
|
+
function workerLaneKey(modules, moduleSubtype, lanes, stratum) {
|
|
14167
|
+
if (moduleSubtype === 'gatherer' && stratum !== undefined) {
|
|
14168
|
+
let lowestReaching;
|
|
14169
|
+
for (let i = 0; i < modules.length; i++) {
|
|
14170
|
+
const installed = modules[i].installed;
|
|
14171
|
+
if (!installed)
|
|
14172
|
+
continue;
|
|
14173
|
+
const item = getItem(Number(installed.item_id.value ?? installed.item_id));
|
|
14174
|
+
if (item.moduleType !== 'gatherer')
|
|
14175
|
+
continue;
|
|
14176
|
+
const stats = BigInt(installed.stats.toString());
|
|
14177
|
+
const tol = decodeStat(stats, 1);
|
|
14178
|
+
const depth = gathererDepthForTier(tol, item.tier ?? 1);
|
|
14179
|
+
if (depth < stratum)
|
|
14180
|
+
continue;
|
|
14181
|
+
const laneKey = laneKeyForModule(i);
|
|
14182
|
+
if (lowestReaching === undefined)
|
|
14183
|
+
lowestReaching = laneKey;
|
|
14184
|
+
if (laneIsFree(lanes, laneKey))
|
|
14185
|
+
return laneKey;
|
|
14186
|
+
}
|
|
14187
|
+
if (lowestReaching === undefined)
|
|
14188
|
+
throw new Error('no gatherer reaches this stratum');
|
|
14189
|
+
return lowestReaching;
|
|
14190
|
+
}
|
|
13302
14191
|
const occupiedMatchingLaneKeys = [];
|
|
13303
14192
|
for (let slotIndex = 0; slotIndex < modules.length; slotIndex++) {
|
|
13304
14193
|
const installed = modules[slotIndex].installed;
|
|
@@ -13555,9 +14444,32 @@ function recomputeCaps(entity) {
|
|
|
13555
14444
|
}
|
|
13556
14445
|
const itemId = Number(typeof entity.item_id === 'number' ? entity.item_id : entity.item_id.value);
|
|
13557
14446
|
const hullStats = decodeCraftedItemStats(itemId, entity.stats);
|
|
14447
|
+
if (hullStats.strength === undefined)
|
|
14448
|
+
hullStats.strength = decodeStat(entity.stats, 0);
|
|
14449
|
+
if (hullStats.hardness === undefined)
|
|
14450
|
+
hullStats.hardness = decodeStat(entity.stats, 2);
|
|
13558
14451
|
const layout = getEntityLayout(itemId)?.slots ?? [];
|
|
13559
14452
|
const installed = toInstalledModules(entity.modules);
|
|
13560
14453
|
const caps = computeEntityCapabilities(hullStats, itemId, installed, layout);
|
|
14454
|
+
const toLoaderLane = (l) => exports.ServerTypes.loader_lane.from({
|
|
14455
|
+
slot_index: l.slotIndex,
|
|
14456
|
+
mass: l.mass,
|
|
14457
|
+
thrust: l.thrust,
|
|
14458
|
+
output_pct: l.outputPct,
|
|
14459
|
+
});
|
|
14460
|
+
const toGathererLane = (l) => exports.ServerTypes.gatherer_lane.from({
|
|
14461
|
+
slot_index: l.slotIndex,
|
|
14462
|
+
yield: l.yield,
|
|
14463
|
+
drain: l.drain,
|
|
14464
|
+
depth: l.depth,
|
|
14465
|
+
output_pct: l.outputPct,
|
|
14466
|
+
});
|
|
14467
|
+
const toCrafterLane = (l) => exports.ServerTypes.crafter_lane.from({
|
|
14468
|
+
slot_index: l.slotIndex,
|
|
14469
|
+
speed: l.speed,
|
|
14470
|
+
drain: l.drain,
|
|
14471
|
+
output_pct: l.outputPct,
|
|
14472
|
+
});
|
|
13561
14473
|
return {
|
|
13562
14474
|
hullmass: antelope.UInt32.from(caps.hullmass),
|
|
13563
14475
|
capacity: antelope.UInt32.from(caps.capacity),
|
|
@@ -13565,20 +14477,30 @@ function recomputeCaps(entity) {
|
|
|
13565
14477
|
generator: caps.generator
|
|
13566
14478
|
? exports.ServerTypes.energy_stats.from(caps.generator)
|
|
13567
14479
|
: undefined,
|
|
13568
|
-
|
|
14480
|
+
loaderLanes: (caps.loaderLanes ?? []).map(toLoaderLane),
|
|
14481
|
+
gathererLanes: (caps.gathererLanes ?? []).map(toGathererLane),
|
|
14482
|
+
crafterLanes: (caps.crafterLanes ?? []).map(toCrafterLane),
|
|
13569
14483
|
hauler: caps.hauler ? exports.ServerTypes.hauler_stats.from(caps.hauler) : undefined,
|
|
13570
14484
|
};
|
|
13571
14485
|
}
|
|
14486
|
+
function loaderLanesTotalMass(lanes) {
|
|
14487
|
+
let total = 0;
|
|
14488
|
+
for (const l of lanes)
|
|
14489
|
+
total += Number(l.mass);
|
|
14490
|
+
return antelope.UInt64.from(total);
|
|
14491
|
+
}
|
|
13572
14492
|
function createProjectedEntity(entity) {
|
|
13573
14493
|
const needsRecompute = entity.hullmass === undefined ||
|
|
13574
|
-
entity.
|
|
14494
|
+
entity.loader_lanes === undefined ||
|
|
13575
14495
|
entity.engines === undefined ||
|
|
13576
14496
|
entity.generator === undefined ||
|
|
13577
14497
|
entity.hauler === undefined ||
|
|
13578
14498
|
entity.capacity === undefined;
|
|
13579
14499
|
const caps = needsRecompute ? recomputeCaps(entity) : undefined;
|
|
13580
14500
|
const shipMass = antelope.UInt32.from(entity.hullmass ?? caps?.hullmass ?? 0);
|
|
13581
|
-
const
|
|
14501
|
+
const loaderLanes = entity.loader_lanes ?? caps?.loaderLanes ?? [];
|
|
14502
|
+
const gathererLanes = entity.gatherer_lanes ?? caps?.gathererLanes ?? [];
|
|
14503
|
+
const crafterLanes = entity.crafter_lanes ?? caps?.crafterLanes ?? [];
|
|
13582
14504
|
const engines = entity.engines ?? caps?.engines;
|
|
13583
14505
|
const generator = entity.generator ?? caps?.generator;
|
|
13584
14506
|
const hauler = entity.hauler ?? caps?.hauler;
|
|
@@ -13593,16 +14515,16 @@ function createProjectedEntity(entity) {
|
|
|
13593
14515
|
engines,
|
|
13594
14516
|
generator,
|
|
13595
14517
|
hauler,
|
|
13596
|
-
|
|
14518
|
+
loaderLanes,
|
|
14519
|
+
gathererLanes,
|
|
14520
|
+
crafterLanes,
|
|
13597
14521
|
get cargoMass() {
|
|
13598
14522
|
return calcStacksMass(this.cargo);
|
|
13599
14523
|
},
|
|
13600
14524
|
get totalMass() {
|
|
13601
|
-
|
|
13602
|
-
|
|
13603
|
-
|
|
13604
|
-
}
|
|
13605
|
-
return mass;
|
|
14525
|
+
return antelope.UInt64.from(this.shipMass)
|
|
14526
|
+
.adding(this.cargoMass)
|
|
14527
|
+
.adding(loaderLanesTotalMass(this.loaderLanes));
|
|
13606
14528
|
},
|
|
13607
14529
|
hasMovement() {
|
|
13608
14530
|
return capsHasMovement(this.capabilities());
|
|
@@ -13611,7 +14533,7 @@ function createProjectedEntity(entity) {
|
|
|
13611
14533
|
return capsHasStorage(this.capabilities());
|
|
13612
14534
|
},
|
|
13613
14535
|
hasLoaders() {
|
|
13614
|
-
return
|
|
14536
|
+
return this.loaderLanes.length > 0;
|
|
13615
14537
|
},
|
|
13616
14538
|
capabilities() {
|
|
13617
14539
|
return {
|
|
@@ -13619,7 +14541,6 @@ function createProjectedEntity(entity) {
|
|
|
13619
14541
|
capacity: this.capacity ? antelope.UInt32.from(this.capacity) : undefined,
|
|
13620
14542
|
engines: this.engines,
|
|
13621
14543
|
generator: this.generator,
|
|
13622
|
-
loaders: this.loaders,
|
|
13623
14544
|
};
|
|
13624
14545
|
},
|
|
13625
14546
|
state() {
|
|
@@ -13721,6 +14642,7 @@ function applyTask(projected, task) {
|
|
|
13721
14642
|
break;
|
|
13722
14643
|
case exports.TaskType.TRAVEL:
|
|
13723
14644
|
case exports.TaskType.WARP:
|
|
14645
|
+
case exports.TaskType.TRANSIT:
|
|
13724
14646
|
applyFlightTask(projected, task, { complete: true });
|
|
13725
14647
|
break;
|
|
13726
14648
|
case exports.TaskType.LOAD:
|
|
@@ -13856,6 +14778,7 @@ function projectEntityAt(entity, now) {
|
|
|
13856
14778
|
break;
|
|
13857
14779
|
case exports.TaskType.TRAVEL:
|
|
13858
14780
|
case exports.TaskType.WARP:
|
|
14781
|
+
case exports.TaskType.TRANSIT:
|
|
13859
14782
|
applyFlightTask(projected, task, { complete: taskComplete, progress });
|
|
13860
14783
|
break;
|
|
13861
14784
|
case exports.TaskType.LOAD:
|
|
@@ -14024,6 +14947,155 @@ function availableForItem(avail, itemId) {
|
|
|
14024
14947
|
return total;
|
|
14025
14948
|
}
|
|
14026
14949
|
|
|
14950
|
+
exports.CancelBlockReason = void 0;
|
|
14951
|
+
(function (CancelBlockReason) {
|
|
14952
|
+
CancelBlockReason["TASK_NEVER"] = "TASK_NEVER";
|
|
14953
|
+
CancelBlockReason["BEFORE_START_RUNNING"] = "BEFORE_START_RUNNING";
|
|
14954
|
+
CancelBlockReason["DONE"] = "DONE";
|
|
14955
|
+
CancelBlockReason["CONTAINS_LINKED_TASK"] = "CONTAINS_LINKED_TASK";
|
|
14956
|
+
CancelBlockReason["WOULD_STRAND"] = "WOULD_STRAND";
|
|
14957
|
+
CancelBlockReason["WOULD_OVERFILL"] = "WOULD_OVERFILL";
|
|
14958
|
+
CancelBlockReason["NOT_OWNER"] = "NOT_OWNER";
|
|
14959
|
+
})(exports.CancelBlockReason || (exports.CancelBlockReason = {}));
|
|
14960
|
+
const EMPTY_EFFECTS = { refunds: [], releasedHolds: [], abandonsRunning: false };
|
|
14961
|
+
function postCancelEntity(entity, laneKey, fromTaskIndex) {
|
|
14962
|
+
const clone = entity.constructor.from(JSON.parse(JSON.stringify(entity.toJSON())));
|
|
14963
|
+
const lane = clone.lanes.find((l) => l.lane_key.toNumber() === laneKey);
|
|
14964
|
+
lane.schedule.tasks = lane.schedule.tasks.slice(0, fromTaskIndex);
|
|
14965
|
+
return clone;
|
|
14966
|
+
}
|
|
14967
|
+
function feasibleAfterCancel(post) {
|
|
14968
|
+
const ordered = orderedTasks(post);
|
|
14969
|
+
const base = new Map();
|
|
14970
|
+
for (const c of post.cargo ?? []) {
|
|
14971
|
+
const k = cargoKey(c);
|
|
14972
|
+
base.set(k, (base.get(k) ?? 0) + c.quantity.toNumber());
|
|
14973
|
+
}
|
|
14974
|
+
const isConsumer = (t) => t.type.toNumber() === exports.TaskType.CRAFT || t.type.toNumber() === exports.TaskType.UNLOAD;
|
|
14975
|
+
for (const self of ordered) {
|
|
14976
|
+
if (!isConsumer(self.task))
|
|
14977
|
+
continue;
|
|
14978
|
+
const map = new Map(base);
|
|
14979
|
+
for (const other of ordered) {
|
|
14980
|
+
if (other.completesAt.getTime() >= self.completesAt.getTime())
|
|
14981
|
+
continue;
|
|
14982
|
+
for (const out of taskCargoEffect(other.task).added) {
|
|
14983
|
+
map.set(cargoKey(out), (map.get(cargoKey(out)) ?? 0) + out.quantity.toNumber());
|
|
14984
|
+
}
|
|
14985
|
+
}
|
|
14986
|
+
for (const other of ordered) {
|
|
14987
|
+
if (other === self)
|
|
14988
|
+
continue;
|
|
14989
|
+
for (const inp of taskCargoEffect(other.task).removed) {
|
|
14990
|
+
const cur = map.get(cargoKey(inp)) ?? 0;
|
|
14991
|
+
map.set(cargoKey(inp), Math.max(0, cur - inp.quantity.toNumber()));
|
|
14992
|
+
}
|
|
14993
|
+
}
|
|
14994
|
+
for (const inp of taskCargoEffect(self.task).removed) {
|
|
14995
|
+
if ((map.get(cargoKey(inp)) ?? 0) < inp.quantity.toNumber())
|
|
14996
|
+
return false;
|
|
14997
|
+
}
|
|
14998
|
+
}
|
|
14999
|
+
try {
|
|
15000
|
+
validateSchedule(post);
|
|
15001
|
+
}
|
|
15002
|
+
catch {
|
|
15003
|
+
return false;
|
|
15004
|
+
}
|
|
15005
|
+
return true;
|
|
15006
|
+
}
|
|
15007
|
+
function laneTiming(lane, nowMs) {
|
|
15008
|
+
const startedMs = lane.schedule.started.toDate().getTime();
|
|
15009
|
+
let endSec = 0;
|
|
15010
|
+
return lane.schedule.tasks.map((t) => {
|
|
15011
|
+
const startsAt = startedMs + endSec * 1000;
|
|
15012
|
+
endSec += t.duration.toNumber();
|
|
15013
|
+
const completesAt = startedMs + endSec * 1000;
|
|
15014
|
+
return {
|
|
15015
|
+
startsAt,
|
|
15016
|
+
completesAt,
|
|
15017
|
+
running: nowMs >= startsAt && nowMs < completesAt,
|
|
15018
|
+
done: nowMs >= completesAt,
|
|
15019
|
+
};
|
|
15020
|
+
});
|
|
15021
|
+
}
|
|
15022
|
+
function cancelEligibility(entity, laneKey, fromTaskIndex, input) {
|
|
15023
|
+
const lane = (entity.lanes ?? []).find((l) => l.lane_key.equals(laneKey));
|
|
15024
|
+
if (!lane || fromTaskIndex < 0 || fromTaskIndex >= lane.schedule.tasks.length) {
|
|
15025
|
+
return { ok: false, range: { count: 0, taskIndices: [] }, effects: { ...EMPTY_EFFECTS } };
|
|
15026
|
+
}
|
|
15027
|
+
const tasks = lane.schedule.tasks;
|
|
15028
|
+
const timing = laneTiming(lane, input.now.getTime());
|
|
15029
|
+
const taskIndices = [];
|
|
15030
|
+
for (let i = fromTaskIndex; i < tasks.length; i++)
|
|
15031
|
+
taskIndices.push(i);
|
|
15032
|
+
const range = { count: taskIndices.length, taskIndices };
|
|
15033
|
+
const block = (blockedReason) => ({
|
|
15034
|
+
ok: false,
|
|
15035
|
+
blockedReason,
|
|
15036
|
+
range,
|
|
15037
|
+
effects: { ...EMPTY_EFFECTS },
|
|
15038
|
+
});
|
|
15039
|
+
for (const i of taskIndices) {
|
|
15040
|
+
const t = tasks[i];
|
|
15041
|
+
if (t.entitygroup && !t.entitygroup.equals(0))
|
|
15042
|
+
return block(exports.CancelBlockReason.CONTAINS_LINKED_TASK);
|
|
15043
|
+
}
|
|
15044
|
+
for (const i of taskIndices) {
|
|
15045
|
+
const t = tasks[i];
|
|
15046
|
+
if (timing[i].done)
|
|
15047
|
+
return block(exports.CancelBlockReason.DONE);
|
|
15048
|
+
if (t.cancelable.equals(exports.TaskCancelable.NEVER) && !t.type.equals(exports.TaskType.IDLE))
|
|
15049
|
+
return block(exports.CancelBlockReason.TASK_NEVER);
|
|
15050
|
+
if (t.cancelable.equals(exports.TaskCancelable.BEFORE_START) && timing[i].running)
|
|
15051
|
+
return block(exports.CancelBlockReason.BEFORE_START_RUNNING);
|
|
15052
|
+
}
|
|
15053
|
+
const post = postCancelEntity(entity, laneKey, fromTaskIndex);
|
|
15054
|
+
if (!feasibleAfterCancel(post))
|
|
15055
|
+
return block(exports.CancelBlockReason.WOULD_STRAND);
|
|
15056
|
+
const effects = { refunds: [], releasedHolds: [], abandonsRunning: false };
|
|
15057
|
+
let energyForfeited = 0;
|
|
15058
|
+
for (const i of taskIndices) {
|
|
15059
|
+
const t = tasks[i];
|
|
15060
|
+
if (timing[i].running && t.cancelable.equals(exports.TaskCancelable.ALWAYS))
|
|
15061
|
+
effects.abandonsRunning = true;
|
|
15062
|
+
if (t.energy_cost)
|
|
15063
|
+
energyForfeited += t.energy_cost.toNumber();
|
|
15064
|
+
if (t.type.equals(exports.TaskType.BUILDPLOT) && t.entitytarget)
|
|
15065
|
+
effects.keepsPlotDeposits = { plot: t.entitytarget };
|
|
15066
|
+
if (t.hold && t.entitytarget) {
|
|
15067
|
+
const counterpart = input.counterparts?.get(t.entitytarget.entity_id.toString());
|
|
15068
|
+
const hold = (counterpart?.holds ?? []).find((h) => h.id.equals(t.hold)) ??
|
|
15069
|
+
(entity.holds ?? []).find((h) => h.id.equals(t.hold));
|
|
15070
|
+
if (hold) {
|
|
15071
|
+
const kind = hold.kind.toNumber();
|
|
15072
|
+
effects.releasedHolds.push({ counterpart: t.entitytarget, kind });
|
|
15073
|
+
if (kind === 1 ) {
|
|
15074
|
+
effects.refunds.push({ giver: t.entitytarget, cargo: t.cargo });
|
|
15075
|
+
const giver = counterpart;
|
|
15076
|
+
if (giver) {
|
|
15077
|
+
const returned = t.cargo.reduce((s, c) => s + calcCargoItemMass(c).toNumber(), 0);
|
|
15078
|
+
const cap = giver.capacity
|
|
15079
|
+
? giver.capacity.toNumber()
|
|
15080
|
+
: Number.MAX_SAFE_INTEGER;
|
|
15081
|
+
if (giver.cargomass.toNumber() + returned > cap) {
|
|
15082
|
+
return {
|
|
15083
|
+
ok: false,
|
|
15084
|
+
blockedReason: exports.CancelBlockReason.WOULD_OVERFILL,
|
|
15085
|
+
range,
|
|
15086
|
+
effects: { ...EMPTY_EFFECTS },
|
|
15087
|
+
};
|
|
15088
|
+
}
|
|
15089
|
+
}
|
|
15090
|
+
}
|
|
15091
|
+
}
|
|
15092
|
+
}
|
|
15093
|
+
}
|
|
15094
|
+
if (energyForfeited > 0)
|
|
15095
|
+
effects.energyForfeited = energyForfeited;
|
|
15096
|
+
return { ok: true, range, effects };
|
|
15097
|
+
}
|
|
15098
|
+
|
|
14027
15099
|
function maxCraftable(entity, recipe, crafterSpeed, now) {
|
|
14028
15100
|
if (recipe.inputs.length === 0)
|
|
14029
15101
|
return 0;
|
|
@@ -14144,7 +15216,7 @@ function calc_gather_rate(gatherer, itemMass, stratum, richness) {
|
|
|
14144
15216
|
}
|
|
14145
15217
|
function calc_gather_energy(gatherer, duration) {
|
|
14146
15218
|
const energy = Math.floor((duration * gatherer.drain.toNumber()) / PRECISION$1);
|
|
14147
|
-
return antelope.
|
|
15219
|
+
return antelope.UInt32.from(energy);
|
|
14148
15220
|
}
|
|
14149
15221
|
|
|
14150
15222
|
const BASE_HAUL_PENALTY_MILLI = 300;
|
|
@@ -14158,7 +15230,7 @@ function computeHaulPenalty(totalThrust, haulCount, avgEfficiency) {
|
|
|
14158
15230
|
HAULER_EFFICIENCY_DENOM);
|
|
14159
15231
|
return Math.floor((totalThrust * 1000) / penaltyMilli);
|
|
14160
15232
|
}
|
|
14161
|
-
function computeHaulerDrain
|
|
15233
|
+
function computeHaulerDrain(distance, drain, haulCount) {
|
|
14162
15234
|
return Math.floor(distance / PRECISION) * drain * haulCount;
|
|
14163
15235
|
}
|
|
14164
15236
|
|
|
@@ -14380,7 +15452,6 @@ const ENTITY_HULL_SLOTS = {
|
|
|
14380
15452
|
0: { capability: 'Storage', attribute: 'capacity' },
|
|
14381
15453
|
1: { capability: 'Hull', attribute: 'mass' },
|
|
14382
15454
|
2: { capability: 'Storage', attribute: 'capacity' },
|
|
14383
|
-
3: { capability: 'Storage', attribute: 'capacity' },
|
|
14384
15455
|
};
|
|
14385
15456
|
const SLOT_FORMULAS = {
|
|
14386
15457
|
engine: {
|
|
@@ -14547,6 +15618,56 @@ function allPlotBuildableItems() {
|
|
|
14547
15618
|
return getItems().filter((item) => isPlotBuildable(item.id));
|
|
14548
15619
|
}
|
|
14549
15620
|
|
|
15621
|
+
function rollupGatherer(lanes) {
|
|
15622
|
+
if (lanes.length === 0)
|
|
15623
|
+
return undefined;
|
|
15624
|
+
let totalYield = 0;
|
|
15625
|
+
let totalDrain = 0;
|
|
15626
|
+
let maxDepth = 0;
|
|
15627
|
+
for (const l of lanes) {
|
|
15628
|
+
totalYield += Number(l.yield);
|
|
15629
|
+
totalDrain += Number(l.drain);
|
|
15630
|
+
const d = Number(l.depth);
|
|
15631
|
+
if (d > maxDepth)
|
|
15632
|
+
maxDepth = d;
|
|
15633
|
+
}
|
|
15634
|
+
return {
|
|
15635
|
+
yield: antelope.UInt16.from(Math.min(totalYield, 65535)),
|
|
15636
|
+
drain: antelope.UInt32.from(totalDrain),
|
|
15637
|
+
depth: antelope.UInt16.from(maxDepth),
|
|
15638
|
+
};
|
|
15639
|
+
}
|
|
15640
|
+
function rollupCrafter(lanes) {
|
|
15641
|
+
if (lanes.length === 0)
|
|
15642
|
+
return undefined;
|
|
15643
|
+
let totalSpeed = 0;
|
|
15644
|
+
let totalDrain = 0;
|
|
15645
|
+
for (const l of lanes) {
|
|
15646
|
+
totalSpeed += Number(l.speed);
|
|
15647
|
+
totalDrain += Number(l.drain);
|
|
15648
|
+
}
|
|
15649
|
+
return {
|
|
15650
|
+
speed: antelope.UInt16.from(Math.min(totalSpeed, 65535)),
|
|
15651
|
+
drain: antelope.UInt32.from(totalDrain),
|
|
15652
|
+
};
|
|
15653
|
+
}
|
|
15654
|
+
function rollupLoaders(lanes) {
|
|
15655
|
+
if (lanes.length === 0)
|
|
15656
|
+
return undefined;
|
|
15657
|
+
const count = lanes.length;
|
|
15658
|
+
let totalMass = 0;
|
|
15659
|
+
let totalThrust = 0;
|
|
15660
|
+
for (const l of lanes) {
|
|
15661
|
+
totalMass += Number(l.mass);
|
|
15662
|
+
totalThrust += Number(l.thrust);
|
|
15663
|
+
}
|
|
15664
|
+
return {
|
|
15665
|
+
mass: antelope.UInt32.from(Math.floor(totalMass / count)),
|
|
15666
|
+
thrust: antelope.UInt16.from(Math.min(totalThrust, 65535)),
|
|
15667
|
+
quantity: antelope.UInt8.from(count),
|
|
15668
|
+
};
|
|
15669
|
+
}
|
|
15670
|
+
|
|
14550
15671
|
function toNum(v) {
|
|
14551
15672
|
return Number(antelope.UInt16.from(v).value.toString());
|
|
14552
15673
|
}
|
|
@@ -14737,7 +15858,12 @@ function resolveEntity(id, stats, modules) {
|
|
|
14737
15858
|
let attributes;
|
|
14738
15859
|
let moduleSlots;
|
|
14739
15860
|
if (stats !== undefined) {
|
|
14740
|
-
const
|
|
15861
|
+
const bigStats = toBigStats(stats);
|
|
15862
|
+
const decoded = decodeCraftedItemStats(id, bigStats);
|
|
15863
|
+
if (decoded.strength === undefined)
|
|
15864
|
+
decoded.strength = decodeStat(bigStats, 0);
|
|
15865
|
+
if (decoded.hardness === undefined)
|
|
15866
|
+
decoded.hardness = decodeStat(bigStats, 2);
|
|
14741
15867
|
const hullCaps = hullCapsForEntity(id, decoded);
|
|
14742
15868
|
attributes = [
|
|
14743
15869
|
{
|
|
@@ -14934,164 +16060,6 @@ function renderDescription(desc, options) {
|
|
|
14934
16060
|
return spans;
|
|
14935
16061
|
}
|
|
14936
16062
|
|
|
14937
|
-
function idiv(a, b) {
|
|
14938
|
-
return Math.floor(a / b);
|
|
14939
|
-
}
|
|
14940
|
-
function computeBaseHullmass(stats) {
|
|
14941
|
-
const density = decodeStat(stats, 1);
|
|
14942
|
-
return 100000 - 75 * density;
|
|
14943
|
-
}
|
|
14944
|
-
function computeBaseCapacityShip(stats) {
|
|
14945
|
-
const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
|
|
14946
|
-
return Math.floor(5000000 * 6 ** (s / 2997));
|
|
14947
|
-
}
|
|
14948
|
-
function computeBaseCapacityWarehouse(stats) {
|
|
14949
|
-
const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
|
|
14950
|
-
return Math.floor(100000000 * 6 ** (s / 2997));
|
|
14951
|
-
}
|
|
14952
|
-
const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
|
|
14953
|
-
const computeEngineDrain = (thm) => 2 * Math.max(30, 50 - idiv(thm, 70));
|
|
14954
|
-
const computeGeneratorCap = (com) => 950 + idiv(com, 2);
|
|
14955
|
-
const computeGeneratorRech = (fin) => 2 * (1 + idiv(fin * 3, 1000));
|
|
14956
|
-
const computeGathererYield = (str) => 200 + str;
|
|
14957
|
-
const computeGathererDrain = (con) => 2 * Math.max(250, 1250 - idiv(con * 25, 20));
|
|
14958
|
-
const computeGathererDepth = (tol, tier) => gathererDepthForTier(tol, tier);
|
|
14959
|
-
const computeLoaderMass = (ins) => Math.max(200, 2000 - ins * 2);
|
|
14960
|
-
const computeLoaderThrust = (pla) => 1 + idiv(pla * pla, 10000);
|
|
14961
|
-
const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
|
|
14962
|
-
const computeCrafterDrain = (fin) => Math.max(5, 30 - idiv(fin, 33));
|
|
14963
|
-
const computeHaulerCapacity = (fin) => Math.max(1, 1 + idiv(fin, 400));
|
|
14964
|
-
const computeHaulerEfficiency = (con) => 2000 + con * 6;
|
|
14965
|
-
const computeHaulerDrain = (com) => Math.max(3, 15 - idiv(com, 80));
|
|
14966
|
-
const computeWarpRange = (stat) => 100 + stat * 3;
|
|
14967
|
-
function entityDisplayName(itemId) {
|
|
14968
|
-
switch (itemId) {
|
|
14969
|
-
case ITEM_SHIP_T1_PACKED:
|
|
14970
|
-
return 'Ship';
|
|
14971
|
-
case ITEM_WAREHOUSE_T1_PACKED:
|
|
14972
|
-
return 'Warehouse';
|
|
14973
|
-
case ITEM_EXTRACTOR_T1_PACKED:
|
|
14974
|
-
return 'Extractor';
|
|
14975
|
-
case ITEM_CONTAINER_T1_PACKED:
|
|
14976
|
-
return 'Container';
|
|
14977
|
-
case ITEM_CONTAINER_T2_PACKED:
|
|
14978
|
-
return 'Container';
|
|
14979
|
-
default:
|
|
14980
|
-
return 'Entity';
|
|
14981
|
-
}
|
|
14982
|
-
}
|
|
14983
|
-
function moduleDisplayName(itemId) {
|
|
14984
|
-
switch (itemId) {
|
|
14985
|
-
case ITEM_ENGINE_T1:
|
|
14986
|
-
return 'Engine';
|
|
14987
|
-
case ITEM_GENERATOR_T1:
|
|
14988
|
-
return 'Generator';
|
|
14989
|
-
case ITEM_GATHERER_T1:
|
|
14990
|
-
return 'Gatherer';
|
|
14991
|
-
case ITEM_LOADER_T1:
|
|
14992
|
-
return 'Loader';
|
|
14993
|
-
case ITEM_CRAFTER_T1:
|
|
14994
|
-
return 'Crafter';
|
|
14995
|
-
case ITEM_STORAGE_T1:
|
|
14996
|
-
return 'Storage';
|
|
14997
|
-
case ITEM_HAULER_T1:
|
|
14998
|
-
return 'Hauler';
|
|
14999
|
-
case ITEM_WARP_T1:
|
|
15000
|
-
return 'Warp';
|
|
15001
|
-
default:
|
|
15002
|
-
return 'Module';
|
|
15003
|
-
}
|
|
15004
|
-
}
|
|
15005
|
-
function formatModuleLine(slot, itemId, stats) {
|
|
15006
|
-
let out = `Slot ${slot} - `;
|
|
15007
|
-
if (itemId === 0) {
|
|
15008
|
-
out += '(empty)';
|
|
15009
|
-
return out;
|
|
15010
|
-
}
|
|
15011
|
-
out += moduleDisplayName(itemId);
|
|
15012
|
-
const subtype = getModuleCapabilityType(itemId);
|
|
15013
|
-
switch (subtype) {
|
|
15014
|
-
case MODULE_ENGINE: {
|
|
15015
|
-
const vol = decodeStat(stats, 0);
|
|
15016
|
-
const thm = decodeStat(stats, 1);
|
|
15017
|
-
out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`;
|
|
15018
|
-
break;
|
|
15019
|
-
}
|
|
15020
|
-
case MODULE_GENERATOR: {
|
|
15021
|
-
const res = decodeStat(stats, 0);
|
|
15022
|
-
const ref = decodeStat(stats, 1);
|
|
15023
|
-
out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`;
|
|
15024
|
-
break;
|
|
15025
|
-
}
|
|
15026
|
-
case MODULE_GATHERER: {
|
|
15027
|
-
const str = decodeStat(stats, 0);
|
|
15028
|
-
const tol = decodeStat(stats, 1);
|
|
15029
|
-
const con = decodeStat(stats, 2);
|
|
15030
|
-
const tier = getItem(itemId).tier;
|
|
15031
|
-
out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol, tier)} Drain ${computeGathererDrain(con)}`;
|
|
15032
|
-
break;
|
|
15033
|
-
}
|
|
15034
|
-
case MODULE_LOADER: {
|
|
15035
|
-
const fin = decodeStat(stats, 0);
|
|
15036
|
-
const pla = decodeStat(stats, 1);
|
|
15037
|
-
out += ` Mass ${computeLoaderMass(fin)} Thrust ${computeLoaderThrust(pla)}`;
|
|
15038
|
-
break;
|
|
15039
|
-
}
|
|
15040
|
-
case MODULE_CRAFTER: {
|
|
15041
|
-
const rea = decodeStat(stats, 0);
|
|
15042
|
-
const com = decodeStat(stats, 1);
|
|
15043
|
-
out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(com)}`;
|
|
15044
|
-
break;
|
|
15045
|
-
}
|
|
15046
|
-
case MODULE_STORAGE: {
|
|
15047
|
-
const str = decodeStat(stats, 0);
|
|
15048
|
-
const fin = decodeStat(stats, 2);
|
|
15049
|
-
const sat = decodeStat(stats, 3);
|
|
15050
|
-
const sum = str + fin + sat;
|
|
15051
|
-
const pct = 10 + idiv(sum * 10, 2997);
|
|
15052
|
-
out += ` +${pct}% capacity`;
|
|
15053
|
-
break;
|
|
15054
|
-
}
|
|
15055
|
-
case MODULE_HAULER: {
|
|
15056
|
-
const res = decodeStat(stats, 0);
|
|
15057
|
-
const pla = decodeStat(stats, 1);
|
|
15058
|
-
const ref = decodeStat(stats, 2);
|
|
15059
|
-
out += ` Capacity ${computeHaulerCapacity(res)} Efficiency ${computeHaulerEfficiency(pla)} Drain ${computeHaulerDrain(ref)}`;
|
|
15060
|
-
break;
|
|
15061
|
-
}
|
|
15062
|
-
case MODULE_WARP: {
|
|
15063
|
-
const stat = decodeStat(stats, 0);
|
|
15064
|
-
out += ` Range ${computeWarpRange(stat)}`;
|
|
15065
|
-
break;
|
|
15066
|
-
}
|
|
15067
|
-
}
|
|
15068
|
-
return out;
|
|
15069
|
-
}
|
|
15070
|
-
function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
|
|
15071
|
-
const hullMass = computeBaseHullmass(hullStats);
|
|
15072
|
-
let baseCapacity = 0;
|
|
15073
|
-
if (itemId === ITEM_SHIP_T1_PACKED) {
|
|
15074
|
-
baseCapacity = computeBaseCapacityShip(hullStats);
|
|
15075
|
-
}
|
|
15076
|
-
else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
|
|
15077
|
-
baseCapacity = computeBaseCapacityWarehouse(hullStats);
|
|
15078
|
-
}
|
|
15079
|
-
else if (itemId === ITEM_EXTRACTOR_T1_PACKED) {
|
|
15080
|
-
baseCapacity = computeBaseCapacityShip(hullStats);
|
|
15081
|
-
}
|
|
15082
|
-
let out = entityDisplayName(itemId);
|
|
15083
|
-
out += ` - Hull ${hullMass} mass`;
|
|
15084
|
-
if (baseCapacity > 0) {
|
|
15085
|
-
out += ` * ${baseCapacity} capacity`;
|
|
15086
|
-
}
|
|
15087
|
-
out += '\n\n';
|
|
15088
|
-
for (let i = 0; i < moduleItems.length; i++) {
|
|
15089
|
-
out += formatModuleLine(i, moduleItems[i], moduleStats[i] ?? 0n);
|
|
15090
|
-
out += '\n';
|
|
15091
|
-
}
|
|
15092
|
-
return out;
|
|
15093
|
-
}
|
|
15094
|
-
|
|
15095
16063
|
function moduleSlotsForImmutable(modules) {
|
|
15096
16064
|
return modules.map((m) => ({
|
|
15097
16065
|
type: Number(m.type.toString()),
|
|
@@ -15245,7 +16213,7 @@ function buildModuleImmutable(itemId, quantity, stats, originX, originY) {
|
|
|
15245
16213
|
base.push({ first: 'reflectivity', second: ['uint16', ref] });
|
|
15246
16214
|
base.push({ first: 'capacity', second: ['uint8', computeHaulerCapacity(res)] });
|
|
15247
16215
|
base.push({ first: 'efficiency', second: ['uint16', computeHaulerEfficiency(pla)] });
|
|
15248
|
-
base.push({ first: 'drain', second: ['uint16', computeHaulerDrain(ref)] });
|
|
16216
|
+
base.push({ first: 'drain', second: ['uint16', computeHaulerDrain$1(ref)] });
|
|
15249
16217
|
break;
|
|
15250
16218
|
}
|
|
15251
16219
|
}
|
|
@@ -15300,6 +16268,8 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
15300
16268
|
deserializeAsset: deserializeAsset,
|
|
15301
16269
|
computeBaseHullmass: computeBaseHullmass,
|
|
15302
16270
|
computeBaseCapacityShip: computeBaseCapacityShip,
|
|
16271
|
+
computeBaseCapacityContainer: computeBaseCapacityContainer,
|
|
16272
|
+
computeBaseCapacityContainerT2: computeBaseCapacityContainerT2,
|
|
15303
16273
|
computeBaseCapacityWarehouse: computeBaseCapacityWarehouse,
|
|
15304
16274
|
computeEngineThrust: computeEngineThrust,
|
|
15305
16275
|
computeEngineDrain: computeEngineDrain,
|
|
@@ -15314,7 +16284,7 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
15314
16284
|
computeCrafterDrain: computeCrafterDrain,
|
|
15315
16285
|
computeHaulerCapacity: computeHaulerCapacity,
|
|
15316
16286
|
computeHaulerEfficiency: computeHaulerEfficiency,
|
|
15317
|
-
computeHaulerDrain: computeHaulerDrain,
|
|
16287
|
+
computeHaulerDrain: computeHaulerDrain$1,
|
|
15318
16288
|
computeWarpRange: computeWarpRange,
|
|
15319
16289
|
entityDisplayName: entityDisplayName,
|
|
15320
16290
|
moduleDisplayName: moduleDisplayName,
|
|
@@ -15414,6 +16384,77 @@ function describeItem(resolved, opts) {
|
|
|
15414
16384
|
return `${tier} ${resolved.name} · ${mass}`;
|
|
15415
16385
|
}
|
|
15416
16386
|
|
|
16387
|
+
const PLAN_ITEM_MASS = GATHER_MASS_DIVISOR;
|
|
16388
|
+
const PLAN_RICHNESS = 1000;
|
|
16389
|
+
const MAX_PLAN_QTY = 10000;
|
|
16390
|
+
function gatherEnergyCost(lane, quantity, stratum) {
|
|
16391
|
+
const stats = lane;
|
|
16392
|
+
const dur = Number(calc_gather_duration(stats, PLAN_ITEM_MASS, quantity, stratum, PLAN_RICHNESS));
|
|
16393
|
+
return Number(calc_gather_energy(stats, dur));
|
|
16394
|
+
}
|
|
16395
|
+
function allocateProportional(lanes, total) {
|
|
16396
|
+
if (lanes.length === 0)
|
|
16397
|
+
return [];
|
|
16398
|
+
const weightSum = lanes.reduce((s, l) => s + l.weight, 0);
|
|
16399
|
+
if (weightSum === 0)
|
|
16400
|
+
return [];
|
|
16401
|
+
const entries = lanes.map((l) => ({
|
|
16402
|
+
slot: l.slot,
|
|
16403
|
+
quantity: Math.floor((total * l.weight) / weightSum),
|
|
16404
|
+
}));
|
|
16405
|
+
let remainder = total - entries.reduce((s, e) => s + e.quantity, 0);
|
|
16406
|
+
for (let i = 0; remainder > 0; i = (i + 1) % entries.length) {
|
|
16407
|
+
entries[i].quantity++;
|
|
16408
|
+
remainder--;
|
|
16409
|
+
}
|
|
16410
|
+
return entries;
|
|
16411
|
+
}
|
|
16412
|
+
function planParallelGather(entity, target, stratum, now) {
|
|
16413
|
+
const reaching = entity.gatherer_lanes.filter((l) => l.depth.toNumber() >= stratum);
|
|
16414
|
+
if (reaching.length === 0)
|
|
16415
|
+
throw new Error('no gatherer reaches this stratum');
|
|
16416
|
+
const energy = entity.generator ? Number(projectRemainingAt(entity).energy) : Infinity;
|
|
16417
|
+
const requestedQty = target === 'max' ? MAX_PLAN_QTY : target.quantity;
|
|
16418
|
+
let activeLanes = reaching.slice().sort((a, b) => a.yield.toNumber() - b.yield.toNumber());
|
|
16419
|
+
while (activeLanes.length > 0) {
|
|
16420
|
+
const laneWeights = activeLanes.map((l) => ({
|
|
16421
|
+
slot: l.slot_index.toNumber(),
|
|
16422
|
+
weight: l.yield.toNumber(),
|
|
16423
|
+
}));
|
|
16424
|
+
const proposed = allocateProportional(laneWeights, requestedQty);
|
|
16425
|
+
const totalEnergyCost = proposed.reduce((sum, entry) => {
|
|
16426
|
+
const lane = activeLanes.find((l) => l.slot_index.toNumber() === entry.slot);
|
|
16427
|
+
return sum + gatherEnergyCost(lane, entry.quantity, stratum);
|
|
16428
|
+
}, 0);
|
|
16429
|
+
if (totalEnergyCost <= energy) {
|
|
16430
|
+
return proposed.filter((e) => e.quantity > 0);
|
|
16431
|
+
}
|
|
16432
|
+
if (activeLanes.length === 1) {
|
|
16433
|
+
const lane = activeLanes[0];
|
|
16434
|
+
const energyPerUnit = gatherEnergyCost(lane, 1, stratum);
|
|
16435
|
+
if (energyPerUnit === 0)
|
|
16436
|
+
return proposed.filter((e) => e.quantity > 0);
|
|
16437
|
+
const maxQty = Math.min(requestedQty, Math.floor(energy / energyPerUnit));
|
|
16438
|
+
if (maxQty <= 0)
|
|
16439
|
+
return [];
|
|
16440
|
+
return [{ slot: lane.slot_index.toNumber(), quantity: maxQty }];
|
|
16441
|
+
}
|
|
16442
|
+
activeLanes = activeLanes.slice(1);
|
|
16443
|
+
}
|
|
16444
|
+
return [];
|
|
16445
|
+
}
|
|
16446
|
+
function planParallelTransfer(entity, target) {
|
|
16447
|
+
const lanes = entity.loader_lanes.filter((l) => l.thrust.toNumber() > 0);
|
|
16448
|
+
if (lanes.length === 0)
|
|
16449
|
+
return [];
|
|
16450
|
+
const requestedQty = target === 'max' ? MAX_PLAN_QTY : target.quantity;
|
|
16451
|
+
const laneWeights = lanes.map((l) => ({
|
|
16452
|
+
slot: l.slot_index.toNumber(),
|
|
16453
|
+
weight: l.thrust.toNumber(),
|
|
16454
|
+
}));
|
|
16455
|
+
return allocateProportional(laneWeights, requestedQty).filter((e) => e.quantity > 0);
|
|
16456
|
+
}
|
|
16457
|
+
|
|
15417
16458
|
exports.ALL_ENTITY_TYPES = ALL_ENTITY_TYPES;
|
|
15418
16459
|
exports.ATOMICASSETS_ACCOUNT = ATOMICASSETS_ACCOUNT;
|
|
15419
16460
|
exports.ActionsManager = ActionsManager;
|
|
@@ -15434,6 +16475,9 @@ exports.COMPANY_NOT_FOUND = COMPANY_NOT_FOUND;
|
|
|
15434
16475
|
exports.COMPONENT_TIER_PREFIXES = COMPONENT_TIER_PREFIXES;
|
|
15435
16476
|
exports.CONTAINER_NOT_FOUND = CONTAINER_NOT_FOUND;
|
|
15436
16477
|
exports.CONTAINER_Z = CONTAINER_Z;
|
|
16478
|
+
exports.COORD_MAX = COORD_MAX;
|
|
16479
|
+
exports.COORD_MIN = COORD_MIN;
|
|
16480
|
+
exports.COORD_OFFSET = COORD_OFFSET;
|
|
15437
16481
|
exports.CRAFT_ENERGY_DIVISOR = CRAFT_ENERGY_DIVISOR;
|
|
15438
16482
|
exports.CRAFT_EXCEEDS_ENERGY_CAPACITY = CRAFT_EXCEEDS_ENERGY_CAPACITY;
|
|
15439
16483
|
exports.CRAFT_NOT_ENOUGH_ENERGY = CRAFT_NOT_ENOUGH_ENERGY;
|
|
@@ -15476,6 +16520,7 @@ exports.GAME_SEED_NOT_SET = GAME_SEED_NOT_SET;
|
|
|
15476
16520
|
exports.GATHERER_DEPTH_MAX_TIER = GATHERER_DEPTH_MAX_TIER;
|
|
15477
16521
|
exports.GATHERER_DEPTH_TABLE = GATHERER_DEPTH_TABLE;
|
|
15478
16522
|
exports.GATHER_EXCEEDS_ENERGY_CAPACITY = GATHER_EXCEEDS_ENERGY_CAPACITY;
|
|
16523
|
+
exports.GATHER_MASS_DIVISOR = GATHER_MASS_DIVISOR;
|
|
15479
16524
|
exports.GATHER_NOT_ENOUGH_ENERGY = GATHER_NOT_ENOUGH_ENERGY;
|
|
15480
16525
|
exports.GROUP_DUPLICATE_ENTITY = GROUP_DUPLICATE_ENTITY;
|
|
15481
16526
|
exports.GROUP_EMPTY = GROUP_EMPTY;
|
|
@@ -15578,6 +16623,7 @@ exports.ITEM_WARP_T1 = ITEM_WARP_T1;
|
|
|
15578
16623
|
exports.InventoryAccessor = InventoryAccessor;
|
|
15579
16624
|
exports.LANE_BARRIER = LANE_BARRIER;
|
|
15580
16625
|
exports.LANE_MOBILITY = LANE_MOBILITY;
|
|
16626
|
+
exports.LOCAL_HALF = LOCAL_HALF;
|
|
15581
16627
|
exports.LOCATION_MAX_DEPTH = LOCATION_MAX_DEPTH;
|
|
15582
16628
|
exports.LOCATION_MIN_DEPTH = LOCATION_MIN_DEPTH;
|
|
15583
16629
|
exports.Location = Location;
|
|
@@ -15629,11 +16675,15 @@ exports.RECIPE_INPUTS_INSUFFICIENT = RECIPE_INPUTS_INSUFFICIENT;
|
|
|
15629
16675
|
exports.RECIPE_INPUTS_INVALID = RECIPE_INPUTS_INVALID;
|
|
15630
16676
|
exports.RECIPE_INPUTS_MIXED = RECIPE_INPUTS_MIXED;
|
|
15631
16677
|
exports.RECIPE_NOT_FOUND = RECIPE_NOT_FOUND;
|
|
16678
|
+
exports.REGION_DIV = REGION_DIV;
|
|
16679
|
+
exports.REGION_PER_AXIS = REGION_PER_AXIS;
|
|
15632
16680
|
exports.REQUIRES_MORE_THAN_ONE = REQUIRES_MORE_THAN_ONE;
|
|
15633
16681
|
exports.REQUIRES_POSITIVE_VALUE = REQUIRES_POSITIVE_VALUE;
|
|
15634
16682
|
exports.RESERVE_TIERS = RESERVE_TIERS;
|
|
15635
16683
|
exports.RESOLVE_COUNT_EXCEEDS_COMPLETED = RESOLVE_COUNT_EXCEEDS_COMPLETED;
|
|
15636
16684
|
exports.RESOURCE_TIER_ADJECTIVES = RESOURCE_TIER_ADJECTIVES;
|
|
16685
|
+
exports.SECTORS_PER_AXIS = SECTORS_PER_AXIS;
|
|
16686
|
+
exports.SECTOR_DIV = SECTOR_DIV;
|
|
15637
16687
|
exports.SHIPLOAD_COLLECTION = SHIPLOAD_COLLECTION;
|
|
15638
16688
|
exports.SHIP_ALREADY_TRAVELING = SHIP_ALREADY_TRAVELING;
|
|
15639
16689
|
exports.SHIP_CANNOT_BUY_TRAVELING = SHIP_CANNOT_BUY_TRAVELING;
|
|
@@ -15660,9 +16710,13 @@ exports.WARP_HAS_SCHEDULE = WARP_HAS_SCHEDULE;
|
|
|
15660
16710
|
exports.WARP_NOT_FULL_ENERGY = WARP_NOT_FULL_ENERGY;
|
|
15661
16711
|
exports.WARP_NO_CAPABILITY = WARP_NO_CAPABILITY;
|
|
15662
16712
|
exports.WARP_OUT_OF_RANGE = WARP_OUT_OF_RANGE;
|
|
16713
|
+
exports.WH = WH;
|
|
16714
|
+
exports.WOULD_OVERFILL = WOULD_OVERFILL;
|
|
16715
|
+
exports.WOULD_STRAND = WOULD_STRAND;
|
|
15663
16716
|
exports.WebSocketConnection = WebSocketConnection;
|
|
15664
16717
|
exports.YIELD_FRACTION_DEEP = YIELD_FRACTION_DEEP;
|
|
15665
16718
|
exports.YIELD_FRACTION_SHALLOW = YIELD_FRACTION_SHALLOW;
|
|
16719
|
+
exports.addressFromCoordinates = addressFromCoordinates;
|
|
15666
16720
|
exports.allBuildableItems = allBuildableItems;
|
|
15667
16721
|
exports.allPlotBuildableItems = allPlotBuildableItems;
|
|
15668
16722
|
exports.availableBuildMethods = availableBuildMethods;
|
|
@@ -15695,6 +16749,7 @@ exports.calc_gather_energy = calc_gather_energy;
|
|
|
15695
16749
|
exports.calc_gather_rate = calc_gather_rate;
|
|
15696
16750
|
exports.calc_loader_acceleration = calc_loader_acceleration;
|
|
15697
16751
|
exports.calc_loader_flighttime = calc_loader_flighttime;
|
|
16752
|
+
exports.calc_onesided_duration = calc_onesided_duration;
|
|
15698
16753
|
exports.calc_orbital_altitude = calc_orbital_altitude;
|
|
15699
16754
|
exports.calc_rechargetime = calc_rechargetime;
|
|
15700
16755
|
exports.calc_ship_acceleration = calc_ship_acceleration;
|
|
@@ -15702,11 +16757,13 @@ exports.calc_ship_flighttime = calc_ship_flighttime;
|
|
|
15702
16757
|
exports.calc_ship_mass = calc_ship_mass;
|
|
15703
16758
|
exports.calc_ship_rechargetime = calc_ship_rechargetime;
|
|
15704
16759
|
exports.calc_transfer_duration = calc_transfer_duration;
|
|
16760
|
+
exports.calc_transit_duration = calc_transit_duration;
|
|
15705
16761
|
exports.calculateFlightTime = calculateFlightTime;
|
|
15706
16762
|
exports.calculateLoadTimeBreakdown = calculateLoadTimeBreakdown;
|
|
15707
16763
|
exports.calculateRefuelingTime = calculateRefuelingTime;
|
|
15708
16764
|
exports.calculateTransferTime = calculateTransferTime;
|
|
15709
16765
|
exports.canMove = canMove;
|
|
16766
|
+
exports.cancelEligibility = cancelEligibility;
|
|
15710
16767
|
exports.candidateLaneCompletesAt = candidateLaneCompletesAt;
|
|
15711
16768
|
exports.capabilityAttributes = capabilityAttributes;
|
|
15712
16769
|
exports.capabilityNames = capabilityNames;
|
|
@@ -15754,7 +16811,7 @@ exports.computeGeneratorRech = computeGeneratorRech;
|
|
|
15754
16811
|
exports.computeHaulPenalty = computeHaulPenalty;
|
|
15755
16812
|
exports.computeHaulerCapabilities = computeHaulerCapabilities;
|
|
15756
16813
|
exports.computeHaulerCapacity = computeHaulerCapacity;
|
|
15757
|
-
exports.computeHaulerDrain = computeHaulerDrain
|
|
16814
|
+
exports.computeHaulerDrain = computeHaulerDrain;
|
|
15758
16815
|
exports.computeHaulerEfficiency = computeHaulerEfficiency;
|
|
15759
16816
|
exports.computeInputMass = computeInputMass;
|
|
15760
16817
|
exports.computeLoaderCapabilities = computeLoaderCapabilities;
|
|
@@ -15770,8 +16827,11 @@ exports.coordsToLocationId = coordsToLocationId;
|
|
|
15770
16827
|
exports.createInventoryAccessor = createInventoryAccessor;
|
|
15771
16828
|
exports.createProjectedEntity = createProjectedEntity;
|
|
15772
16829
|
exports.createScheduleAccessor = createScheduleAccessor;
|
|
16830
|
+
exports.decodeAddress = decodeAddress;
|
|
15773
16831
|
exports.decodeAtomicAsset = decodeAtomicAsset;
|
|
15774
16832
|
exports.decodeCraftedItemStats = decodeCraftedItemStats;
|
|
16833
|
+
exports.decodeRegion = decodeRegion;
|
|
16834
|
+
exports.decodeSector = decodeSector;
|
|
15775
16835
|
exports.decodeStat = decodeStat;
|
|
15776
16836
|
exports.decodeStats = decodeStats;
|
|
15777
16837
|
exports["default"] = Shipload;
|
|
@@ -15796,13 +16856,19 @@ exports.displayName = displayName;
|
|
|
15796
16856
|
exports.distanceBetweenCoordinates = distanceBetweenCoordinates;
|
|
15797
16857
|
exports.distanceBetweenPoints = distanceBetweenPoints;
|
|
15798
16858
|
exports.easeFlightProgress = easeFlightProgress;
|
|
16859
|
+
exports.encodeAddress = encodeAddress;
|
|
16860
|
+
exports.encodeAddressMemo = encodeAddressMemo;
|
|
15799
16861
|
exports.encodeGatheredCargoStats = encodeGatheredCargoStats;
|
|
16862
|
+
exports.encodeRegion = encodeRegion;
|
|
16863
|
+
exports.encodeSector = encodeSector;
|
|
15800
16864
|
exports.encodeStats = encodeStats;
|
|
15801
16865
|
exports.energyAtTime = energyAtTime;
|
|
15802
16866
|
exports.energyPercent = energyPercent;
|
|
15803
16867
|
exports.entityDisplayName = entityDisplayName;
|
|
15804
16868
|
exports.estimateDealTravelTime = estimateDealTravelTime;
|
|
15805
16869
|
exports.estimateTravelTime = estimateTravelTime;
|
|
16870
|
+
exports.feistel = feistel;
|
|
16871
|
+
exports.feistelInv = feistelInv;
|
|
15806
16872
|
exports.fetchAtomicAssetsForOwner = fetchAtomicAssetsForOwner;
|
|
15807
16873
|
exports.fetchAtomicSchemas = fetchAtomicSchemas;
|
|
15808
16874
|
exports.filterByBuildMethod = filterByBuildMethod;
|
|
@@ -15833,6 +16899,7 @@ exports.getItem = getItem;
|
|
|
15833
16899
|
exports.getItems = getItems;
|
|
15834
16900
|
exports.getKindMeta = getKindMeta;
|
|
15835
16901
|
exports.getLocationCandidates = getLocationCandidates;
|
|
16902
|
+
exports.getLocationKind = getLocationKind;
|
|
15836
16903
|
exports.getLocationProfile = getLocationProfile;
|
|
15837
16904
|
exports.getLocationType = getLocationType;
|
|
15838
16905
|
exports.getLocationTypeName = getLocationTypeName;
|
|
@@ -15883,6 +16950,7 @@ exports.isPlotBuildable = isPlotBuildable;
|
|
|
15883
16950
|
exports.isRelatedItem = isRelatedItem;
|
|
15884
16951
|
exports.isShip = isShip;
|
|
15885
16952
|
exports.isSubscriptionsDebugEnabled = isSubscriptionsDebugEnabled;
|
|
16953
|
+
exports.isValidWormholePair = isValidWormholePair;
|
|
15886
16954
|
exports.isWarehouse = isWarehouse;
|
|
15887
16955
|
exports.itemAbbreviations = itemAbbreviations;
|
|
15888
16956
|
exports.itemCategory = itemCategory;
|
|
@@ -15905,22 +16973,33 @@ exports.moduleSlotTypeToCode = moduleSlotTypeToCode;
|
|
|
15905
16973
|
exports.needsRecharge = needsRecharge;
|
|
15906
16974
|
exports.normalizeDisplayName = normalizeDisplayName;
|
|
15907
16975
|
exports.parseWireEntity = parseWireEntity;
|
|
16976
|
+
exports.partnerRegion = partnerRegion;
|
|
16977
|
+
exports.planParallelGather = planParallelGather;
|
|
16978
|
+
exports.planParallelTransfer = planParallelTransfer;
|
|
15908
16979
|
exports.projectEntity = projectEntity;
|
|
15909
16980
|
exports.projectEntityAt = projectEntityAt;
|
|
15910
16981
|
exports.projectRemainingAt = projectRemainingAt;
|
|
15911
16982
|
exports.projectedCargoAvailableAt = projectedCargoAvailableAt;
|
|
15912
16983
|
exports.rawScheduleEnd = rawScheduleEnd;
|
|
15913
16984
|
exports.readCommonBase = readCommonBase;
|
|
16985
|
+
exports.regionOf = regionOf;
|
|
15914
16986
|
exports.removeFromStacks = removeFromStacks;
|
|
15915
16987
|
exports.renderDescription = renderDescription;
|
|
15916
16988
|
exports.resolveItem = resolveItem;
|
|
15917
16989
|
exports.resolveItemCategory = resolveItemCategory;
|
|
16990
|
+
exports.resolveLaneCrafter = resolveLaneCrafter;
|
|
16991
|
+
exports.resolveLaneGatherer = resolveLaneGatherer;
|
|
16992
|
+
exports.resolveLaneLoader = resolveLaneLoader;
|
|
15918
16993
|
exports.resolveLockedAmount = resolveLockedAmount;
|
|
15919
16994
|
exports.resolveStats = resolveStats;
|
|
15920
16995
|
exports.rollTier = rollTier;
|
|
15921
16996
|
exports.rollWithinTier = rollWithinTier;
|
|
16997
|
+
exports.rollupCrafter = rollupCrafter;
|
|
16998
|
+
exports.rollupGatherer = rollupGatherer;
|
|
16999
|
+
exports.rollupLoaders = rollupLoaders;
|
|
15922
17000
|
exports.rotation = rotation;
|
|
15923
17001
|
exports.schedule = schedule;
|
|
17002
|
+
exports.selectGatherLane = selectGatherLane;
|
|
15924
17003
|
exports.setSubscriptionsDebug = setSubscriptionsDebug;
|
|
15925
17004
|
exports.stackKey = stackKey;
|
|
15926
17005
|
exports.stackToCargoItem = stackToCargoItem;
|
|
@@ -15939,5 +17018,7 @@ exports.typeLabel = typeLabel;
|
|
|
15939
17018
|
exports.validateDisplayName = validateDisplayName;
|
|
15940
17019
|
exports.validateSchedule = validateSchedule;
|
|
15941
17020
|
exports.workerLaneKey = workerLaneKey;
|
|
17021
|
+
exports.wormholeAt = wormholeAt;
|
|
17022
|
+
exports.wormholeAtRegionEndpoint = wormholeAtRegionEndpoint;
|
|
15942
17023
|
exports.yieldThresholdAt = yieldThresholdAt;
|
|
15943
17024
|
//# sourceMappingURL=shipload.js.map
|