@buildonspark/spark-sdk 0.5.0 → 0.5.1

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.
Files changed (81) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/bare/index.cjs +1608 -3635
  3. package/dist/bare/index.d.cts +27 -435
  4. package/dist/bare/index.d.ts +27 -435
  5. package/dist/bare/index.js +1608 -3634
  6. package/dist/{chunk-RU434ZAE.js → chunk-F3BFSHVR.js} +357 -391
  7. package/dist/{chunk-UYEB2VPG.js → chunk-IOIEBLMK.js} +7 -1
  8. package/dist/{chunk-EU3I7GFB.js → chunk-STB6WMU7.js} +1 -1
  9. package/dist/{chunk-JE3MXMPW.js → chunk-UTECVGQQ.js} +93 -202
  10. package/dist/{chunk-ZP6Z6DFX.js → chunk-YFVVYZCS.js} +37 -5
  11. package/dist/{client-D1dLzWu0.d.ts → client-C9kc4cog.d.cts} +9 -3
  12. package/dist/{client-CVn0R_eM.d.cts → client-eyjf4knu.d.ts} +9 -3
  13. package/dist/graphql/objects/index.cjs +7 -1
  14. package/dist/graphql/objects/index.d.cts +3 -3
  15. package/dist/graphql/objects/index.d.ts +3 -3
  16. package/dist/graphql/objects/index.js +1 -1
  17. package/dist/index.browser.d.ts +27 -435
  18. package/dist/index.browser.js +1613 -3639
  19. package/dist/index.node.cjs +1613 -3640
  20. package/dist/index.node.d.cts +7 -8
  21. package/dist/index.node.d.ts +7 -8
  22. package/dist/index.node.js +5 -7
  23. package/dist/native/index.react-native.cjs +1613 -3640
  24. package/dist/native/index.react-native.d.cts +27 -435
  25. package/dist/native/index.react-native.d.ts +27 -435
  26. package/dist/native/index.react-native.js +1613 -3639
  27. package/dist/proto/spark.cjs +93 -202
  28. package/dist/proto/spark.d.cts +1 -1
  29. package/dist/proto/spark.d.ts +1 -1
  30. package/dist/proto/spark.js +1 -1
  31. package/dist/proto/spark_token.cjs +36 -4
  32. package/dist/proto/spark_token.d.cts +4 -1
  33. package/dist/proto/spark_token.d.ts +4 -1
  34. package/dist/proto/spark_token.js +2 -2
  35. package/dist/{spark-2Fxnvl8K.d.cts → spark-d6w3BLGZ.d.cts} +10 -328
  36. package/dist/{spark-2Fxnvl8K.d.ts → spark-d6w3BLGZ.d.ts} +10 -328
  37. package/dist/{spark-wallet.node-DlhZiDgY.d.ts → spark-wallet.node-MReThHBY.d.ts} +6 -7
  38. package/dist/{spark-wallet.node-xKJXzAEd.d.cts → spark-wallet.node-eR0svGws.d.cts} +6 -7
  39. package/dist/tests/test-utils.cjs +409 -2429
  40. package/dist/tests/test-utils.d.cts +3 -3
  41. package/dist/tests/test-utils.d.ts +3 -3
  42. package/dist/tests/test-utils.js +5 -5
  43. package/dist/types/index.cjs +100 -203
  44. package/dist/types/index.d.cts +2 -2
  45. package/dist/types/index.d.ts +2 -2
  46. package/dist/types/index.js +3 -3
  47. package/package.json +3 -3
  48. package/src/graphql/client.ts +36 -1
  49. package/src/graphql/objects/LightningSendRequestStatus.ts +25 -13
  50. package/src/proto/common.ts +1 -1
  51. package/src/proto/google/protobuf/descriptor.ts +1 -1
  52. package/src/proto/google/protobuf/duration.ts +1 -1
  53. package/src/proto/google/protobuf/empty.ts +1 -1
  54. package/src/proto/google/protobuf/timestamp.ts +1 -1
  55. package/src/proto/mock.ts +1 -1
  56. package/src/proto/spark.ts +113 -446
  57. package/src/proto/spark_authn.ts +1 -1
  58. package/src/proto/spark_token.ts +41 -2
  59. package/src/proto/validate/validate.ts +1 -1
  60. package/src/services/connection/connection.ts +23 -60
  61. package/src/services/coop-exit.ts +3 -5
  62. package/src/services/deposit.ts +1 -1
  63. package/src/services/lightning.ts +1 -1
  64. package/src/services/signing.ts +5 -6
  65. package/src/services/transfer.ts +250 -240
  66. package/src/services/wallet-config.ts +22 -5
  67. package/src/spark-wallet/proto-descriptors.ts +1 -1
  68. package/src/spark-wallet/proto-reflection.ts +0 -2
  69. package/src/spark-wallet/spark-wallet.ts +2 -2
  70. package/src/spark_descriptors.pb +0 -0
  71. package/src/tests/bufbuild-reflection.test.ts +2 -3
  72. package/src/tests/integration/coop-exit.test.ts +6 -1
  73. package/src/tests/integration/htlc.test.ts +5 -0
  74. package/src/tests/integration/lightning.test.ts +24 -4
  75. package/src/tests/integration/time-sync.test.ts +18 -0
  76. package/src/tests/integration/transfer.test.ts +42 -7
  77. package/src/tests/ssp-client-retry.test.ts +161 -0
  78. package/src/tests/token-hashing.test.ts +92 -0
  79. package/src/utils/token-hashing.ts +4 -51
  80. package/src/utils/transaction.ts +1 -2
  81. package/src/utils/unilateral-exit.ts +139 -142
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  SparkTokenServiceDefinition
3
- } from "./chunk-ZP6Z6DFX.js";
3
+ } from "./chunk-YFVVYZCS.js";
4
4
  import {
5
5
  mapSettingsProtoToWalletSettings,
6
6
  mapTransferToWalletTransfer,
7
7
  mapTreeNodeToWalletLeaf
8
- } from "./chunk-EU3I7GFB.js";
8
+ } from "./chunk-STB6WMU7.js";
9
9
  import {
10
10
  Empty,
11
11
  SatsPayment,
@@ -16,7 +16,7 @@ import {
16
16
  TokensPayment,
17
17
  TreeNode,
18
18
  networkToJSON
19
- } from "./chunk-JE3MXMPW.js";
19
+ } from "./chunk-UTECVGQQ.js";
20
20
  import {
21
21
  BitcoinNetwork_default,
22
22
  ClaimStaticDepositFromJson,
@@ -37,7 +37,7 @@ import {
37
37
  SparkLeavesSwapRequestStatus_default,
38
38
  SparkWalletUserToUserRequestsConnectionFromJson,
39
39
  TransferFromJson
40
- } from "./chunk-UYEB2VPG.js";
40
+ } from "./chunk-IOIEBLMK.js";
41
41
  import {
42
42
  Buffer
43
43
  } from "./chunk-MVRQ5US7.js";
@@ -1264,7 +1264,7 @@ var isWebExtension = (
1264
1264
  );
1265
1265
  var isWebExtensionContentScript = isWebExtension && "window" in globalThis;
1266
1266
  var userAgent = "navigator" in globalThis ? parseUserAgent(globalThis.navigator.userAgent) || "unknown-user-agent" : void 0;
1267
- var packageVersion = true ? "0.5.0" : "unknown";
1267
+ var packageVersion = true ? "0.5.1" : "unknown";
1268
1268
  var baseEnvStr = "unknown";
1269
1269
  if (isBun) {
1270
1270
  const bunVersion = "version" in globalThis.Bun ? globalThis.Bun.version : "unknown-version";
@@ -2533,22 +2533,22 @@ var BASE_CONFIG = {
2533
2533
  // 5 minutes
2534
2534
  minOutputsThreshold: 50
2535
2535
  },
2536
- tokenTransactionVersion: "V2"
2536
+ tokenTransactionVersion: "V3"
2537
2537
  };
2538
2538
  var LOCAL_WALLET_CONFIG = {
2539
2539
  ...BASE_CONFIG,
2540
- threshold: 3
2540
+ threshold: getLocalSigningThreshold()
2541
2541
  };
2542
2542
  var LOCAL_WALLET_CONFIG_SCHNORR = {
2543
2543
  ...LOCAL_WALLET_CONFIG,
2544
- threshold: 3
2545
- // 3 for issuance tests.
2544
+ threshold: getLocalSigningThreshold()
2545
+ // 2 for issuance tests.
2546
2546
  };
2547
2547
  var LOCAL_WALLET_CONFIG_ECDSA = {
2548
2548
  ...LOCAL_WALLET_CONFIG,
2549
2549
  tokenSignatures: "ECDSA",
2550
- threshold: 3
2551
- // 3 for issuance tests.
2550
+ threshold: getLocalSigningThreshold()
2551
+ // 2 for issuance tests.
2552
2552
  };
2553
2553
  var REGTEST_WALLET_CONFIG = {
2554
2554
  ...BASE_CONFIG,
@@ -2604,6 +2604,7 @@ function getSigningOperators() {
2604
2604
  };
2605
2605
  }
2606
2606
  function getLocalSigningOperators() {
2607
+ const numOperators = typeof process !== "undefined" && process.env.NUM_SPARK_OPERATORS !== void 0 ? parseInt(process.env.NUM_SPARK_OPERATORS, 10) : isHermeticTest ? 3 : 5;
2607
2608
  const addresses = Array.from(
2608
2609
  { length: 5 },
2609
2610
  (_, i) => isHermeticTest ? `https://${i}.spark.minikube.local` : `https://localhost:${i + 8535}`
@@ -2615,7 +2616,7 @@ function getLocalSigningOperators() {
2615
2616
  "0352aef4d49439dedd798ac4aef1e7ebef95f569545b647a25338398c1247ffdea",
2616
2617
  "02c05c88cc8fc181b1ba30006df6a4b0597de6490e24514fbdd0266d2b9cd3d0ba"
2617
2618
  ];
2618
- return {
2619
+ const allOperators = {
2619
2620
  "0000000000000000000000000000000000000000000000000000000000000001": {
2620
2621
  id: 0,
2621
2622
  identifier: "0000000000000000000000000000000000000000000000000000000000000001",
@@ -2647,6 +2648,13 @@ function getLocalSigningOperators() {
2647
2648
  identityPublicKey: pubkeys[4]
2648
2649
  }
2649
2650
  };
2651
+ return Object.fromEntries(
2652
+ Object.entries(allOperators).slice(0, numOperators)
2653
+ );
2654
+ }
2655
+ function getLocalSigningThreshold() {
2656
+ const numOperators = Object.keys(getLocalSigningOperators()).length;
2657
+ return Math.floor((numOperators + 2) / 2);
2650
2658
  }
2651
2659
 
2652
2660
  // src/utils/fetch.ts
@@ -3595,78 +3603,6 @@ function isEphemeralAnchorOutput(script, amount) {
3595
3603
  script.length === 4 && script[0] === 81 && script[1] === 2 && script[2] === 78 && script[3] === 115)
3596
3604
  );
3597
3605
  }
3598
- async function constructUnilateralExitTxs(nodeHexStrings, sparkClient, network) {
3599
- const result = [];
3600
- const nodes = nodeHexStrings.map((hex) => TreeNode.decode(hexToBytes5(hex)));
3601
- const nodeMap = /* @__PURE__ */ new Map();
3602
- for (const node of nodes) {
3603
- nodeMap.set(node.id, node);
3604
- }
3605
- for (const node of nodes) {
3606
- const transactions = [];
3607
- const chain = [];
3608
- let currentNode = node;
3609
- while (currentNode) {
3610
- chain.unshift(currentNode);
3611
- if (currentNode.parentNodeId) {
3612
- let parentNode = nodeMap.get(currentNode.parentNodeId);
3613
- if (!parentNode && sparkClient) {
3614
- try {
3615
- const response = await sparkClient.query_nodes({
3616
- source: {
3617
- $case: "nodeIds",
3618
- nodeIds: {
3619
- nodeIds: [currentNode.parentNodeId]
3620
- }
3621
- },
3622
- includeParents: true,
3623
- network: network || 0
3624
- // Default to mainnet if not provided
3625
- });
3626
- parentNode = response.nodes[currentNode.parentNodeId];
3627
- if (parentNode) {
3628
- nodeMap.set(currentNode.parentNodeId, parentNode);
3629
- }
3630
- } catch (error) {
3631
- console.warn(
3632
- `Failed to query parent node ${currentNode.parentNodeId}: ${error}`
3633
- );
3634
- break;
3635
- }
3636
- }
3637
- if (parentNode) {
3638
- currentNode = parentNode;
3639
- } else {
3640
- if (!sparkClient) {
3641
- console.warn(
3642
- `Parent node ${currentNode.parentNodeId} not found. Provide a sparkClient to fetch missing parents.`
3643
- );
3644
- } else {
3645
- console.warn(
3646
- `Parent node ${currentNode.parentNodeId} not found in database. Chain may be incomplete.`
3647
- );
3648
- }
3649
- break;
3650
- }
3651
- } else {
3652
- break;
3653
- }
3654
- }
3655
- for (const chainNode of chain) {
3656
- const nodeTx = bytesToHex5(chainNode.nodeTx);
3657
- transactions.push(nodeTx);
3658
- if (chainNode.id === node.id) {
3659
- const refundTx = bytesToHex5(chainNode.refundTx);
3660
- transactions.push(refundTx);
3661
- }
3662
- }
3663
- result.push({
3664
- leafId: node.id,
3665
- transactions
3666
- });
3667
- }
3668
- return result;
3669
- }
3670
3606
  async function constructUnilateralExitFeeBumpPackages(nodeHexStrings, utxos, feeRate, electrsUrl, sparkClient, network) {
3671
3607
  const result = [];
3672
3608
  const availableUtxos = [...utxos].sort((a, b) => {
@@ -3716,6 +3652,9 @@ async function constructUnilateralExitFeeBumpPackages(nodeHexStrings, utxos, fee
3716
3652
  const chain = [];
3717
3653
  let currentNode = node;
3718
3654
  while (currentNode) {
3655
+ if (currentNode.status !== "AVAILABLE") {
3656
+ break;
3657
+ }
3719
3658
  chain.unshift(currentNode);
3720
3659
  if (currentNode.parentNodeId) {
3721
3660
  let parentNode = nodeMap.get(currentNode.parentNodeId);
@@ -3798,7 +3737,7 @@ async function constructUnilateralExitFeeBumpPackages(nodeHexStrings, utxos, fee
3798
3737
  const {
3799
3738
  feeBumpPsbt: nodeFeeBumpPsbt,
3800
3739
  usedUtxos,
3801
- correctedParentTx
3740
+ parentTx
3802
3741
  } = constructFeeBumpTx(nodeTxHex, availableUtxos, feeRate, void 0);
3803
3742
  const feeBumpTx = btc3.Transaction.fromPSBT(hexToBytes5(nodeFeeBumpPsbt));
3804
3743
  var feeBumpOut = feeBumpTx.outputsLength === 1 ? feeBumpTx.getOutput(0) : null;
@@ -3822,7 +3761,7 @@ async function constructUnilateralExitFeeBumpPackages(nodeHexStrings, utxos, fee
3822
3761
  script: bytesToHex5(feeBumpOut.script),
3823
3762
  publicKey: feeBumpOutPubKey
3824
3763
  });
3825
- const finalNodeTx = correctedParentTx || nodeTxHex;
3764
+ const finalNodeTx = parentTx || nodeTxHex;
3826
3765
  txPackages.push({ tx: finalNodeTx, feeBumpPsbt: nodeFeeBumpPsbt });
3827
3766
  if (chainNode.id === node.id) {
3828
3767
  let refundTxHex = bytesToHex5(chainNode.refundTx);
@@ -3895,6 +3834,58 @@ function hash160(data) {
3895
3834
  const sha256Hash = sha2565(data);
3896
3835
  return ripemd160(sha256Hash);
3897
3836
  }
3837
+ function calculateTransactionVSize(txHex) {
3838
+ try {
3839
+ const tx = getTxFromRawTxHex(txHex);
3840
+ const numInputs = tx.inputsLength;
3841
+ const numOutputs = tx.outputsLength;
3842
+ return getTxEstimatedVbytesSizeByNumberOfInputsOutputs(
3843
+ numInputs,
3844
+ numOutputs
3845
+ );
3846
+ } catch (error) {
3847
+ console.warn(
3848
+ `Failed to calculate transaction vSize: ${error}, falling back to default estimate`
3849
+ );
3850
+ return 191;
3851
+ }
3852
+ }
3853
+ function selectUtxosForFee(utxos, parentTxSize, feeRate) {
3854
+ if (utxos.length === 0) {
3855
+ throw new Error("No UTXOs available for selection");
3856
+ }
3857
+ const sortedUtxos = [...utxos].sort((a, b) => {
3858
+ if (a.value > b.value) return -1;
3859
+ if (a.value < b.value) return 1;
3860
+ return 0;
3861
+ });
3862
+ const selectedUtxos = [];
3863
+ let totalValue = 0n;
3864
+ if (!feeRate?.satPerVbyte) {
3865
+ return sortedUtxos;
3866
+ }
3867
+ for (let i = 0; i < sortedUtxos.length; i++) {
3868
+ const utxo = sortedUtxos[i];
3869
+ if (!utxo) {
3870
+ continue;
3871
+ }
3872
+ selectedUtxos.push(utxo);
3873
+ totalValue += utxo.value;
3874
+ const childTxSize = getTxEstimatedVbytesSizeByNumberOfInputsOutputs(
3875
+ selectedUtxos.length + 1,
3876
+ // selected UTXOs + ephemeral anchor
3877
+ 1
3878
+ // single change output
3879
+ );
3880
+ const totalVbytes = parentTxSize + childTxSize;
3881
+ const requiredFee = BigInt(Math.ceil(totalVbytes * feeRate.satPerVbyte));
3882
+ const minChange = 546n;
3883
+ if (totalValue >= requiredFee + minChange) {
3884
+ return selectedUtxos;
3885
+ }
3886
+ }
3887
+ return sortedUtxos;
3888
+ }
3898
3889
  function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
3899
3890
  if (!txHex || txHex.length === 0) {
3900
3891
  throw new Error("Transaction hex string is empty or undefined");
@@ -3902,16 +3893,15 @@ function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
3902
3893
  if (utxos.length === 0) {
3903
3894
  throw new Error("No UTXOs available for fee bump");
3904
3895
  }
3905
- let correctedTxHex = txHex;
3906
3896
  let parentTx;
3907
3897
  try {
3908
- parentTx = getTxFromRawTxHex(correctedTxHex);
3898
+ parentTx = getTxFromRawTxHex(txHex);
3909
3899
  if (!parentTx) {
3910
3900
  throw new Error("getTxFromRawTxHex returned null/undefined");
3911
3901
  }
3912
3902
  } catch (parseError) {
3913
3903
  throw new Error(
3914
- `Failed to parse parent transaction hex: ${parseError}. Transaction hex: ${correctedTxHex}`
3904
+ `Failed to parse parent transaction hex: ${parseError}. Transaction hex: ${txHex}`
3915
3905
  );
3916
3906
  }
3917
3907
  try {
@@ -3958,6 +3948,8 @@ function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
3958
3948
  if (utxos.length === 0) {
3959
3949
  throw new Error("No UTXOs available for fee bump");
3960
3950
  }
3951
+ const parentTxSize = calculateTransactionVSize(txHex);
3952
+ const selectedUtxos = selectUtxosForFee(utxos, parentTxSize, feeRate);
3961
3953
  const builder = new btc3.Transaction({
3962
3954
  version: 3,
3963
3955
  allowUnknown: true,
@@ -3965,8 +3957,8 @@ function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
3965
3957
  });
3966
3958
  let totalValue = 0n;
3967
3959
  const processedUtxos = [];
3968
- for (let i = 0; i < utxos.length; i++) {
3969
- const fundingUtxo = utxos[i];
3960
+ for (let i = 0; i < selectedUtxos.length; i++) {
3961
+ const fundingUtxo = selectedUtxos[i];
3970
3962
  if (!fundingUtxo) {
3971
3963
  throw new Error(`UTXO at index ${i} is undefined`);
3972
3964
  }
@@ -4000,11 +3992,22 @@ function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
4000
3992
  sequence: 4294967295,
4001
3993
  witnessUtxo: {
4002
3994
  script: ephemeralAnchorOutput.script,
4003
- // Use the original script directly (not P2WSH wrapped)
4004
3995
  amount: 0n
4005
3996
  }
4006
3997
  });
4007
- const fee = 1500n;
3998
+ const childTxSize = getTxEstimatedVbytesSizeByNumberOfInputsOutputs(
3999
+ selectedUtxos.length + 1,
4000
+ // funding UTXOs + ephemeral anchor
4001
+ 1
4002
+ // single change output
4003
+ );
4004
+ const totalVbytes = parentTxSize + childTxSize;
4005
+ let fee;
4006
+ if (feeRate?.satPerVbyte) {
4007
+ fee = BigInt(Math.ceil(totalVbytes * feeRate.satPerVbyte));
4008
+ } else {
4009
+ fee = 1500n;
4010
+ }
4008
4011
  const remainingValue = totalValue - fee;
4009
4012
  if (remainingValue <= 0n) {
4010
4013
  throw new Error(
@@ -4044,8 +4047,8 @@ function constructFeeBumpTx(txHex, utxos, feeRate, previousFeeBumpTx) {
4044
4047
  }
4045
4048
  return {
4046
4049
  feeBumpPsbt: psbtHex,
4047
- usedUtxos: utxos,
4048
- correctedParentTx: correctedTxHex !== txHex ? correctedTxHex : void 0
4050
+ usedUtxos: selectedUtxos,
4051
+ parentTx: txHex !== txHex ? txHex : void 0
4049
4052
  };
4050
4053
  }
4051
4054
 
@@ -8872,7 +8875,7 @@ function isSet(value) {
8872
8875
  }
8873
8876
 
8874
8877
  // src/spark-wallet/proto-descriptors.ts
8875
- var SPARK_DESCRIPTORS_BASE64 = "Cv8BCh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvEg9nb29nbGUucHJvdG9idWYiOwoJVGltZXN0YW1wEhgKB3NlY29uZHMYASABKANSB3NlY29uZHMSFAoFbmFub3MYAiABKAVSBW5hbm9zQoUBChNjb20uZ29vZ2xlLnByb3RvYnVmQg5UaW1lc3RhbXBQcm90b1ABWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi90aW1lc3RhbXBwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCr4BChtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIHCgVFbXB0eUJ9ChNjb20uZ29vZ2xlLnByb3RvYnVmQgpFbXB0eVByb3RvUAFaLmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2VtcHR5cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqIYAogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJbChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUqDAiA7Mr/ARCB7Mr/ASKYBQoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIyCgdlZGl0aW9uGA4gASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQizAQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SNwoIZmVhdHVyZXMYMiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSbQoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFREIDiAECUgx2ZXJpZmljYXRpb24alAEKC0RlY2xhcmF0aW9uEhYKBm51bWJlchgBIAEoBVIGbnVtYmVyEhsKCWZ1bGxfbmFtZRgCIAEoCVIIZnVsbE5hbWUSEgoEdHlwZRgDIAEoCVIEdHlwZRIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkSgQIBBAFIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUEVBVEVEEAMSEgoOTEFCRUxfUkVRVUlSRUQQAiJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIq0JCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlEjcKCGZlYXR1cmVzGDIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgqECtKBAgmECdSFHBocF9nZW5lcmljX3NlcnZpY2VzIvQDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAwgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoinQ0KDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJXChBlZGl0aW9uX2RlZmF1bHRzGBQgAygLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdFIPZWRpdGlvbkRlZmF1bHRzEjcKCGZlYXR1cmVzGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElUKD2ZlYXR1cmVfc3VwcG9ydBgWIAEoCzIsLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRmVhdHVyZVN1cHBvcnRSDmZlYXR1cmVTdXBwb3J0ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uGloKDkVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUalgIKDkZlYXR1cmVTdXBwb3J0EkcKEmVkaXRpb25faW50cm9kdWNlZBgBIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uSW50cm9kdWNlZBJHChJlZGl0aW9uX2RlcHJlY2F0ZWQYAiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIRZWRpdGlvbkRlcHJlY2F0ZWQSLwoTZGVwcmVjYXRpb25fd2FybmluZxgDIAEoCVISZGVwcmVjYXRpb25XYXJuaW5nEkEKD2VkaXRpb25fcmVtb3ZlZBgEIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5lZGl0aW9uUmVtb3ZlZCIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFSgQIEhATIqwBCgxPbmVvZk9wdGlvbnMSNwoIZmVhdHVyZXMYASABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLRAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYi2AIKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSNwoIZmVhdHVyZXMYAiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSKAoMZGVidWdfcmVkYWN0GAMgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSVQoPZmVhdHVyZV9zdXBwb3J0GAQgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLVAQoOU2VydmljZU9wdGlvbnMSNwoIZmVhdHVyZXMYIiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKZAwoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSNwoIZmVhdHVyZXMYIyABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiKnCgoKRmVhdHVyZVNldBKRAQoOZmllbGRfcHJlc2VuY2UYASABKA4yKS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlQj+IAQGYAQSYAQGiAQ0SCEVYUExJQ0lUGIQHogENEghJTVBMSUNJVBjnB6IBDRIIRVhQTElDSVQY6AeyAQMI6AdSDWZpZWxkUHJlc2VuY2USbAoJZW51bV90eXBlGAIgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGVCKYgBAZgBBpgBAaIBCxIGQ0xPU0VEGIQHogEJEgRPUEVOGOcHsgEDCOgHUghlbnVtVHlwZRKYAQoXcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmcYAyABKA4yMS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5SZXBlYXRlZEZpZWxkRW5jb2RpbmdCLYgBAZgBBJgBAaIBDRIIRVhQQU5ERUQYhAeiAQsSBlBBQ0tFRBjnB7IBAwjoB1IVcmVwZWF0ZWRGaWVsZEVuY29kaW5nEn4KD3V0ZjhfdmFsaWRhdGlvbhgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uQimIAQGYAQSYAQGiAQkSBE5PTkUYhAeiAQsSBlZFUklGWRjnB7IBAwjoB1IOdXRmOFZhbGlkYXRpb24SfgoQbWVzc2FnZV9lbmNvZGluZxgFIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lk1lc3NhZ2VFbmNvZGluZ0ImiAEBmAEEmAEBogEUEg9MRU5HVEhfUFJFRklYRUQYhAeyAQMI6AdSD21lc3NhZ2VFbmNvZGluZxKCAQoLanNvbl9mb3JtYXQYBiABKA4yJi5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0QjmIAQGYAQOYAQaYAQGiARcSEkxFR0FDWV9CRVNUX0VGRk9SVBiEB6IBChIFQUxMT1cY5weyAQMI6AdSCmpzb25Gb3JtYXQiXAoNRmllbGRQcmVzZW5jZRIaChZGSUVMRF9QUkVTRU5DRV9VTktOT1dOEAASDAoIRVhQTElDSVQQARIMCghJTVBMSUNJVBACEhMKD0xFR0FDWV9SRVFVSVJFRBADIjcKCEVudW1UeXBlEhUKEUVOVU1fVFlQRV9VTktOT1dOEAASCAoET1BFThABEgoKBkNMT1NFRBACIlYKFVJlcGVhdGVkRmllbGRFbmNvZGluZxIjCh9SRVBFQVRFRF9GSUVMRF9FTkNPRElOR19VTktOT1dOEAASCgoGUEFDS0VEEAESDAoIRVhQQU5ERUQQAiJJCg5VdGY4VmFsaWRhdGlvbhIbChdVVEY4X1ZBTElEQVRJT05fVU5LTk9XThAAEgoKBlZFUklGWRACEggKBE5PTkUQAyIECAEQASJTCg9NZXNzYWdlRW5jb2RpbmcSHAoYTUVTU0FHRV9FTkNPRElOR19VTktOT1dOEAASEwoPTEVOR1RIX1BSRUZJWEVEEAESDQoJREVMSU1JVEVEEAIiSAoKSnNvbkZvcm1hdBIXChNKU09OX0ZPUk1BVF9VTktOT1dOEAASCQoFQUxMT1cQARIWChJMRUdBQ1lfQkVTVF9FRkZPUlQQAioGCOgHEItOKgYIi04QkE4qBgiQThCRTkoGCOcHEOgHIu8DChJGZWF0dXJlU2V0RGVmYXVsdHMSWAoIZGVmYXVsdHMYASADKAsyPC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdFIIZGVmYXVsdHMSQQoPbWluaW11bV9lZGl0aW9uGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1pbmltdW1FZGl0aW9uEkEKD21heGltdW1fZWRpdGlvbhgFIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5tYXhpbXVtRWRpdGlvbhr4AQoYRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhJOChRvdmVycmlkYWJsZV9mZWF0dXJlcxgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UhNvdmVycmlkYWJsZUZlYXR1cmVzEkIKDmZpeGVkX2ZlYXR1cmVzGAUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSDWZpeGVkRmVhdHVyZXNKBAgBEAJKBAgCEANSCGZlYXR1cmVzIrUCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyoMCIDsyv8BEIHsyv8BItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////B0J+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCvsBCh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI6CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINRHVyYXRpb25Qcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKrzEKF3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvEgh2YWxpZGF0ZRogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byLICAoKRmllbGRSdWxlcxIwCgdtZXNzYWdlGBEgASgLMhYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlEiwKBWZsb2F0GAEgASgLMhQudmFsaWRhdGUuRmxvYXRSdWxlc0gAUgVmbG9hdBIvCgZkb3VibGUYAiABKAsyFS52YWxpZGF0ZS5Eb3VibGVSdWxlc0gAUgZkb3VibGUSLAoFaW50MzIYAyABKAsyFC52YWxpZGF0ZS5JbnQzMlJ1bGVzSABSBWludDMyEiwKBWludDY0GAQgASgLMhQudmFsaWRhdGUuSW50NjRSdWxlc0gAUgVpbnQ2NBIvCgZ1aW50MzIYBSABKAsyFS52YWxpZGF0ZS5VSW50MzJSdWxlc0gAUgZ1aW50MzISLwoGdWludDY0GAYgASgLMhUudmFsaWRhdGUuVUludDY0UnVsZXNIAFIGdWludDY0Ei8KBnNpbnQzMhgHIAEoCzIVLnZhbGlkYXRlLlNJbnQzMlJ1bGVzSABSBnNpbnQzMhIvCgZzaW50NjQYCCABKAsyFS52YWxpZGF0ZS5TSW50NjRSdWxlc0gAUgZzaW50NjQSMgoHZml4ZWQzMhgJIAEoCzIWLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAUgdmaXhlZDMyEjIKB2ZpeGVkNjQYCiABKAsyFi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIAFIHZml4ZWQ2NBI1CghzZml4ZWQzMhgLIAEoCzIXLnZhbGlkYXRlLlNGaXhlZDMyUnVsZXNIAFIIc2ZpeGVkMzISNQoIc2ZpeGVkNjQYDCABKAsyFy52YWxpZGF0ZS5TRml4ZWQ2NFJ1bGVzSABSCHNmaXhlZDY0EikKBGJvb2wYDSABKAsyEy52YWxpZGF0ZS5Cb29sUnVsZXNIAFIEYm9vbBIvCgZzdHJpbmcYDiABKAsyFS52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAUgZzdHJpbmcSLAoFYnl0ZXMYDyABKAsyFC52YWxpZGF0ZS5CeXRlc1J1bGVzSABSBWJ5dGVzEikKBGVudW0YECABKAsyEy52YWxpZGF0ZS5FbnVtUnVsZXNIAFIEZW51bRI1CghyZXBlYXRlZBgSIAEoCzIXLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIAFIIcmVwZWF0ZWQSJgoDbWFwGBMgASgLMhIudmFsaWRhdGUuTWFwUnVsZXNIAFIDbWFwEiYKA2FueRgUIAEoCzISLnZhbGlkYXRlLkFueVJ1bGVzSABSA2FueRI1CghkdXJhdGlvbhgVIAEoCzIXLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIAFIIZHVyYXRpb24SOAoJdGltZXN0YW1wGBYgASgLMhgudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAFIJdGltZXN0YW1wQgYKBHR5cGUisAEKCkZsb2F0UnVsZXMSFAoFY29uc3QYASABKAJSBWNvbnN0Eg4KAmx0GAIgASgCUgJsdBIQCgNsdGUYAyABKAJSA2x0ZRIOCgJndBgEIAEoAlICZ3QSEAoDZ3RlGAUgASgCUgNndGUSDgoCaW4YBiADKAJSAmluEhUKBm5vdF9pbhgHIAMoAlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKxAQoLRG91YmxlUnVsZXMSFAoFY29uc3QYASABKAFSBWNvbnN0Eg4KAmx0GAIgASgBUgJsdBIQCgNsdGUYAyABKAFSA2x0ZRIOCgJndBgEIAEoAVICZ3QSEAoDZ3RlGAUgASgBUgNndGUSDgoCaW4YBiADKAFSAmluEhUKBm5vdF9pbhgHIAMoAVIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKwAQoKSW50MzJSdWxlcxIUCgVjb25zdBgBIAEoBVIFY29uc3QSDgoCbHQYAiABKAVSAmx0EhAKA2x0ZRgDIAEoBVIDbHRlEg4KAmd0GAQgASgFUgJndBIQCgNndGUYBSABKAVSA2d0ZRIOCgJpbhgGIAMoBVICaW4SFQoGbm90X2luGAcgAygFUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrABCgpJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgDUgVjb25zdBIOCgJsdBgCIAEoA1ICbHQSEAoDbHRlGAMgASgDUgNsdGUSDgoCZ3QYBCABKANSAmd0EhAKA2d0ZRgFIAEoA1IDZ3RlEg4KAmluGAYgAygDUgJpbhIVCgZub3RfaW4YByADKANSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgNUgVjb25zdBIOCgJsdBgCIAEoDVICbHQSEAoDbHRlGAMgASgNUgNsdGUSDgoCZ3QYBCABKA1SAmd0EhAKA2d0ZRgFIAEoDVIDZ3RlEg4KAmluGAYgAygNUgJpbhIVCgZub3RfaW4YByADKA1SBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgEUgVjb25zdBIOCgJsdBgCIAEoBFICbHQSEAoDbHRlGAMgASgEUgNsdGUSDgoCZ3QYBCABKARSAmd0EhAKA2d0ZRgFIAEoBFIDZ3RlEg4KAmluGAYgAygEUgJpbhIVCgZub3RfaW4YByADKARSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgRUgVjb25zdBIOCgJsdBgCIAEoEVICbHQSEAoDbHRlGAMgASgRUgNsdGUSDgoCZ3QYBCABKBFSAmd0EhAKA2d0ZRgFIAEoEVIDZ3RlEg4KAmluGAYgAygRUgJpbhIVCgZub3RfaW4YByADKBFSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgSUgVjb25zdBIOCgJsdBgCIAEoElICbHQSEAoDbHRlGAMgASgSUgNsdGUSDgoCZ3QYBCABKBJSAmd0EhAKA2d0ZRgFIAEoElIDZ3RlEg4KAmluGAYgAygSUgJpbhIVCgZub3RfaW4YByADKBJSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisgEKDEZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoB1IFY29uc3QSDgoCbHQYAiABKAdSAmx0EhAKA2x0ZRgDIAEoB1IDbHRlEg4KAmd0GAQgASgHUgJndBIQCgNndGUYBSABKAdSA2d0ZRIOCgJpbhgGIAMoB1ICaW4SFQoGbm90X2luGAcgAygHUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrIBCgxGaXhlZDY0UnVsZXMSFAoFY29uc3QYASABKAZSBWNvbnN0Eg4KAmx0GAIgASgGUgJsdBIQCgNsdGUYAyABKAZSA2x0ZRIOCgJndBgEIAEoBlICZ3QSEAoDZ3RlGAUgASgGUgNndGUSDgoCaW4YBiADKAZSAmluEhUKBm5vdF9pbhgHIAMoBlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKzAQoNU0ZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoD1IFY29uc3QSDgoCbHQYAiABKA9SAmx0EhAKA2x0ZRgDIAEoD1IDbHRlEg4KAmd0GAQgASgPUgJndBIQCgNndGUYBSABKA9SA2d0ZRIOCgJpbhgGIAMoD1ICaW4SFQoGbm90X2luGAcgAygPUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrMBCg1TRml4ZWQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgQUgVjb25zdBIOCgJsdBgCIAEoEFICbHQSEAoDbHRlGAMgASgQUgNsdGUSDgoCZ3QYBCABKBBSAmd0EhAKA2d0ZRgFIAEoEFIDZ3RlEg4KAmluGAYgAygQUgJpbhIVCgZub3RfaW4YByADKBBSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkiIQoJQm9vbFJ1bGVzEhQKBWNvbnN0GAEgASgIUgVjb25zdCLUBQoLU3RyaW5nUnVsZXMSFAoFY29uc3QYASABKAlSBWNvbnN0EhAKA2xlbhgTIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGwoJbGVuX2J5dGVzGBQgASgEUghsZW5CeXRlcxIbCgltaW5fYnl0ZXMYBCABKARSCG1pbkJ5dGVzEhsKCW1heF9ieXRlcxgFIAEoBFIIbWF4Qnl0ZXMSGAoHcGF0dGVybhgGIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYByABKAlSBnByZWZpeBIWCgZzdWZmaXgYCCABKAlSBnN1ZmZpeBIaCghjb250YWlucxgJIAEoCVIIY29udGFpbnMSIQoMbm90X2NvbnRhaW5zGBcgASgJUgtub3RDb250YWlucxIOCgJpbhgKIAMoCVICaW4SFQoGbm90X2luGAsgAygJUgVub3RJbhIWCgVlbWFpbBgMIAEoCEgAUgVlbWFpbBIcCghob3N0bmFtZRgNIAEoCEgAUghob3N0bmFtZRIQCgJpcBgOIAEoCEgAUgJpcBIUCgRpcHY0GA8gASgISABSBGlwdjQSFAoEaXB2NhgQIAEoCEgAUgRpcHY2EhIKA3VyaRgRIAEoCEgAUgN1cmkSGQoHdXJpX3JlZhgSIAEoCEgAUgZ1cmlSZWYSGgoHYWRkcmVzcxgVIAEoCEgAUgdhZGRyZXNzEhQKBHV1aWQYFiABKAhIAFIEdXVpZBJAChB3ZWxsX2tub3duX3JlZ2V4GBggASgOMhQudmFsaWRhdGUuS25vd25SZWdleEgAUg53ZWxsS25vd25SZWdleBIcCgZzdHJpY3QYGSABKAg6BHRydWVSBnN0cmljdBIhCgxpZ25vcmVfZW1wdHkYGiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24i4gIKCkJ5dGVzUnVsZXMSFAoFY29uc3QYASABKAxSBWNvbnN0EhAKA2xlbhgNIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGAoHcGF0dGVybhgEIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYBSABKAxSBnByZWZpeBIWCgZzdWZmaXgYBiABKAxSBnN1ZmZpeBIaCghjb250YWlucxgHIAEoDFIIY29udGFpbnMSDgoCaW4YCCADKAxSAmluEhUKBm5vdF9pbhgJIAMoDFIFbm90SW4SEAoCaXAYCiABKAhIAFICaXASFAoEaXB2NBgLIAEoCEgAUgRpcHY0EhQKBGlwdjYYDCABKAhIAFIEaXB2NhIhCgxpZ25vcmVfZW1wdHkYDiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24iawoJRW51bVJ1bGVzEhQKBWNvbnN0GAEgASgFUgVjb25zdBIhCgxkZWZpbmVkX29ubHkYAiABKAhSC2RlZmluZWRPbmx5Eg4KAmluGAMgAygFUgJpbhIVCgZub3RfaW4YBCADKAVSBW5vdEluIj4KDE1lc3NhZ2VSdWxlcxISCgRza2lwGAEgASgIUgRza2lwEhoKCHJlcXVpcmVkGAIgASgIUghyZXF1aXJlZCKwAQoNUmVwZWF0ZWRSdWxlcxIbCgltaW5faXRlbXMYASABKARSCG1pbkl0ZW1zEhsKCW1heF9pdGVtcxgCIAEoBFIIbWF4SXRlbXMSFgoGdW5pcXVlGAMgASgIUgZ1bmlxdWUSKgoFaXRlbXMYBCABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVpdGVtcxIhCgxpZ25vcmVfZW1wdHkYBSABKAhSC2lnbm9yZUVtcHR5ItwBCghNYXBSdWxlcxIbCgltaW5fcGFpcnMYASABKARSCG1pblBhaXJzEhsKCW1heF9wYWlycxgCIAEoBFIIbWF4UGFpcnMSGwoJbm9fc3BhcnNlGAMgASgIUghub1NwYXJzZRIoCgRrZXlzGAQgASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IEa2V5cxIsCgZ2YWx1ZXMYBSABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgZ2YWx1ZXMSIQoMaWdub3JlX2VtcHR5GAYgASgIUgtpZ25vcmVFbXB0eSJNCghBbnlSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSDgoCaW4YAiADKAlSAmluEhUKBm5vdF9pbhgDIAMoCVIFbm90SW4i6QIKDUR1cmF0aW9uUnVsZXMSGgoIcmVxdWlyZWQYASABKAhSCHJlcXVpcmVkEi8KBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgVjb25zdBIpCgJsdBgDIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblICbHQSKwoDbHRlGAQgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgNsdGUSKQoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SAmd0EisKA2d0ZRgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIDZ3RlEikKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgJpbhIwCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SBW5vdEluIvMCCg5UaW1lc3RhbXBSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSMAoFY29uc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgVjb25zdBIqCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmx0EiwKA2x0ZRgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2x0ZRIqCgJndBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmd0EiwKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2d0ZRIVCgZsdF9ub3cYByABKAhSBWx0Tm93EhUKBmd0X25vdxgIIAEoCFIFZ3ROb3cSMQoGd2l0aGluGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgZ3aXRoaW4qRgoKS25vd25SZWdleBILCgdVTktOT1dOEAASFAoQSFRUUF9IRUFERVJfTkFNRRABEhUKEUhUVFBfSEVBREVSX1ZBTFVFEAI6PAoIZGlzYWJsZWQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYrwggASgIUghkaXNhYmxlZDo6CgdpZ25vcmVkEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGLAIIAEoCFIHaWdub3JlZDo6CghyZXF1aXJlZBIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMYrwggASgIUghyZXF1aXJlZDpKCgVydWxlcxIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYrwggASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IFcnVsZXNCUAoaaW8uZW52b3lwcm94eS5wZ3YudmFsaWRhdGVaMmdpdGh1Yi5jb20vZW52b3lwcm94eS9wcm90b2MtZ2VuLXZhbGlkYXRlL3ZhbGlkYXRlCrcDCgxjb21tb24ucHJvdG8SBmNvbW1vbiKHAQoKUGFja2FnZU1hcBI8CghwYWNrYWdlcxgBIAMoCzIgLmNvbW1vbi5QYWNrYWdlTWFwLlBhY2thZ2VzRW50cnlSCHBhY2thZ2VzGjsKDVBhY2thZ2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJFChFTaWduaW5nQ29tbWl0bWVudBIWCgZoaWRpbmcYASABKAxSBmhpZGluZxIYCgdiaW5kaW5nGAIgASgMUgdiaW5kaW5nIjgKDVNpZ25pbmdSZXN1bHQSJwoPc2lnbmF0dXJlX3NoYXJlGAEgASgMUg5zaWduYXR1cmVTaGFyZSpdCg9TaWduYXR1cmVJbnRlbnQSDAoIQ1JFQVRJT04QABIMCghUUkFOU0ZFUhABEg0KCUFHR1JFR0FURRACEg8KB1JFRlJFU0gQAxoCCAESDgoGRVhURU5EEAQaAggBQi1aK2dpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9jb21tb25iBnByb3RvMwqeuQIKC3NwYXJrLnByb3RvEgVzcGFyaxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxobZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvGhd2YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxoMY29tbW9uLnByb3RvIkoKGFN1YnNjcmliZVRvRXZlbnRzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAogASgMUhFpZGVudGl0eVB1YmxpY0tleSLAAQoZU3Vic2NyaWJlVG9FdmVudHNSZXNwb25zZRIyCgh0cmFuc2ZlchgBIAEoCzIULnNwYXJrLlRyYW5zZmVyRXZlbnRIAFIIdHJhbnNmZXISLwoHZGVwb3NpdBgCIAEoCzITLnNwYXJrLkRlcG9zaXRFdmVudEgAUgdkZXBvc2l0EjUKCWNvbm5lY3RlZBgDIAEoCzIVLnNwYXJrLkNvbm5lY3RlZEV2ZW50SABSCWNvbm5lY3RlZEIHCgVldmVudCIQCg5Db25uZWN0ZWRFdmVudCI8Cg1UcmFuc2ZlckV2ZW50EisKCHRyYW5zZmVyGAogASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjkKDERlcG9zaXRFdmVudBIpCgdkZXBvc2l0GAogASgLMg8uc3BhcmsuVHJlZU5vZGVSB2RlcG9zaXQicgoLUGFnZVJlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgFUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIuCglkaXJlY3Rpb24YAyABKA4yEC5zcGFyay5EaXJlY3Rpb25SCWRpcmVjdGlvbiKoAQoMUGFnZVJlc3BvbnNlEiIKDWhhc19uZXh0X3BhZ2UYASABKAhSC2hhc05leHRQYWdlEioKEWhhc19wcmV2aW91c19wYWdlGAIgASgIUg9oYXNQcmV2aW91c1BhZ2USHwoLbmV4dF9jdXJzb3IYAyABKAlSCm5leHRDdXJzb3ISJwoPcHJldmlvdXNfY3Vyc29yGAQgASgJUg5wcmV2aW91c0N1cnNvciKAAgoTRGVwb3NpdEFkZHJlc3NQcm9vZhJgChJhZGRyZXNzX3NpZ25hdHVyZXMYASADKAsyMS5zcGFyay5EZXBvc2l0QWRkcmVzc1Byb29mLkFkZHJlc3NTaWduYXR1cmVzRW50cnlSEWFkZHJlc3NTaWduYXR1cmVzEkEKHXByb29mX29mX3Bvc3Nlc3Npb25fc2lnbmF0dXJlGAIgASgMUhpwcm9vZk9mUG9zc2Vzc2lvblNpZ25hdHVyZRpEChZBZGRyZXNzU2lnbmF0dXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEilQIKHUdlbmVyYXRlRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EiwKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDFIQc2lnbmluZ1B1YmxpY0tleRIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSJgoHbGVhZl9pZBgEIAEoCUII+kIFcgOwAQFIAFIGbGVhZklkiAEBEiAKCWlzX3N0YXRpYxgFIAEoCEgBUghpc1N0YXRpY4gBAUIKCghfbGVhZl9pZEIMCgpfaXNfc3RhdGljIrUBCgdBZGRyZXNzEhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSIwoNdmVyaWZ5aW5nX2tleRgCIAEoDFIMdmVyaWZ5aW5nS2V5Ek4KFWRlcG9zaXRfYWRkcmVzc19wcm9vZhgDIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZSE2RlcG9zaXRBZGRyZXNzUHJvb2YSGwoJaXNfc3RhdGljGAUgASgIUghpc1N0YXRpYyJZCh5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVzcG9uc2USNwoPZGVwb3NpdF9hZGRyZXNzGAEgASgLMg4uc3BhcmsuQWRkcmVzc1IOZGVwb3NpdEFkZHJlc3MiyQEKI0dlbmVyYXRlU3RhdGljRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EjUKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIQc2lnbmluZ1B1YmxpY0tleRI3ChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsiXwokR2VuZXJhdGVTdGF0aWNEZXBvc2l0QWRkcmVzc1Jlc3BvbnNlEjcKD2RlcG9zaXRfYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSDmRlcG9zaXRBZGRyZXNzInkKBFVUWE8SFQoGcmF3X3R4GAEgASgMUgVyYXdUeBISCgR2b3V0GAIgASgNUgR2b3V0EjIKB25ldHdvcmsYAyABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxISCgR0eGlkGAQgASgMUgR0eGlkIjkKCk5vZGVPdXRwdXQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhIKBHZvdXQYAiABKA1SBHZvdXQipgEKClNpZ25pbmdKb2ISLAoSc2lnbmluZ19wdWJsaWNfa2V5GAEgASgMUhBzaWduaW5nUHVibGljS2V5EhUKBnJhd190eBgCIAEoDFIFcmF3VHgSUwoYc2lnbmluZ19ub25jZV9jb21taXRtZW50GAMgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UhZzaWduaW5nTm9uY2VDb21taXRtZW50IsoCCg9TaWduaW5nS2V5c2hhcmUSKwoRb3duZXJfaWRlbnRpZmllcnMYASADKAlSEG93bmVySWRlbnRpZmllcnMSHAoJdGhyZXNob2xkGAIgASgNUgl0aHJlc2hvbGQSHQoKcHVibGljX2tleRgDIAEoDFIJcHVibGljS2V5Ek0KDXB1YmxpY19zaGFyZXMYBCADKAsyKC5zcGFyay5TaWduaW5nS2V5c2hhcmUuUHVibGljU2hhcmVzRW50cnlSDHB1YmxpY1NoYXJlcxI9Cgx1cGRhdGVkX3RpbWUYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRo/ChFQdWJsaWNTaGFyZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIsgECg1TaWduaW5nUmVzdWx0EkUKC3B1YmxpY19rZXlzGAEgAygLMiQuc3BhcmsuU2lnbmluZ1Jlc3VsdC5QdWJsaWNLZXlzRW50cnlSCnB1YmxpY0tleXMSbQoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgCIAMoCzIxLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeVIXc2lnbmluZ05vbmNlQ29tbWl0bWVudHMSVAoQc2lnbmF0dXJlX3NoYXJlcxgDIAMoCzIpLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmF0dXJlU2hhcmVzRW50cnlSD3NpZ25hdHVyZVNoYXJlcxJBChBzaWduaW5nX2tleXNoYXJlGAQgASgLMhYuc3BhcmsuU2lnbmluZ0tleXNoYXJlUg9zaWduaW5nS2V5c2hhcmUaPQoPUHVibGljS2V5c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEaZQocU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIvCgV2YWx1ZRgCIAEoCzIZLmNvbW1vbi5TaWduaW5nQ29tbWl0bWVudFIFdmFsdWU6AjgBGkIKFFNpZ25hdHVyZVNoYXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEikgMKEFJlbmV3TGVhZlJlcXVlc3QSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEmoKH3JlbmV3X25vZGVfdGltZWxvY2tfc2lnbmluZ19qb2IYAiABKAsyIi5zcGFyay5SZW5ld05vZGVUaW1lbG9ja1NpZ25pbmdKb2JIAFIbcmVuZXdOb2RlVGltZWxvY2tTaWduaW5nSm9iEnAKIXJlbmV3X3JlZnVuZF90aW1lbG9ja19zaWduaW5nX2pvYhgDIAEoCzIkLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iSABSHXJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iEncKJHJlbmV3X25vZGVfemVyb190aW1lbG9ja19zaWduaW5nX2pvYhgEIAEoCzImLnNwYXJrLlJlbmV3Tm9kZVplcm9UaW1lbG9ja1NpZ25pbmdKb2JIAFIfcmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYkIOCgxzaWduaW5nX2pvYnMipwUKG1JlbmV3Tm9kZVRpbWVsb2NrU2lnbmluZ0pvYhJXChlzcGxpdF9ub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIVc3BsaXROb2RlVHhTaWduaW5nSm9iEmQKIHNwbGl0X25vZGVfZGlyZWN0X3R4X3NpZ25pbmdfam9iGAIgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIbc3BsaXROb2RlRGlyZWN0VHhTaWduaW5nSm9iEkwKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iElAKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJZChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISXQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJvCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIuoDCh1SZW5ld1JlZnVuZFRpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEl0KHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISbwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBSABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKTAwofUmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEm8KJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAUgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2JKBAgEEAUi0wIKEVJlbmV3TGVhZlJlc3BvbnNlEl0KGnJlbmV3X25vZGVfdGltZWxvY2tfcmVzdWx0GAEgASgLMh4uc3BhcmsuUmVuZXdOb2RlVGltZWxvY2tSZXN1bHRIAFIXcmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSYwoccmVuZXdfcmVmdW5kX3RpbWVsb2NrX3Jlc3VsdBgCIAEoCzIgLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHRIAFIZcmVuZXdSZWZ1bmRUaW1lbG9ja1Jlc3VsdBJqCh9yZW5ld19ub2RlX3plcm9fdGltZWxvY2tfcmVzdWx0GAMgASgLMiIuc3BhcmsuUmVuZXdOb2RlWmVyb1RpbWVsb2NrUmVzdWx0SABSG3JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdEIOCgxyZW5ld19yZXN1bHQibgoXUmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSLgoKc3BsaXRfbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUglzcGxpdE5vZGUSIwoEbm9kZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlIkAKGVJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHQSIwoEbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlInIKG1JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdBIuCgpzcGxpdF9ub2RlGAEgASgLMg8uc3BhcmsuVHJlZU5vZGVSCXNwbGl0Tm9kZRIjCgRub2RlGAIgASgLMg8uc3BhcmsuVHJlZU5vZGVSBG5vZGUijwQKE05vZGVTaWduYXR1cmVTaGFyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEkkKFm5vZGVfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0Ek0KGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFXJlZnVuZFR4U2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAQgASgMUgx2ZXJpZnlpbmdLZXkSVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCLKAgoOTm9kZVNpZ25hdHVyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEioKEW5vZGVfdHhfc2lnbmF0dXJlGAIgASgMUg9ub2RlVHhTaWduYXR1cmUSLgoTcmVmdW5kX3R4X3NpZ25hdHVyZRgDIAEoDFIRcmVmdW5kVHhTaWduYXR1cmUSNwoYZGlyZWN0X25vZGVfdHhfc2lnbmF0dXJlGAQgASgMUhVkaXJlY3ROb2RlVHhTaWduYXR1cmUSOwoaZGlyZWN0X3JlZnVuZF90eF9zaWduYXR1cmUYBSABKAxSF2RpcmVjdFJlZnVuZFR4U2lnbmF0dXJlEk0KJGRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25hdHVyZRgGIAEoDFIfZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25hdHVyZSKKBAoYU3RhcnRUcmVlQ3JlYXRpb25SZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5Ei8KDW9uX2NoYWluX3V0eG8YAiABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJAChNyb290X3R4X3NpZ25pbmdfam9iGAMgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIQcm9vdFR4U2lnbmluZ0pvYhJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISTQoaZGlyZWN0X3Jvb3RfdHhfc2lnbmluZ19qb2IYBSABKAsyES5zcGFyay5TaWduaW5nSm9iUhZkaXJlY3RSb290VHhTaWduaW5nSm9iElEKHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBiABKAsyES5zcGFyay5TaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISYwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYByABKAsyES5zcGFyay5TaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKNAQoZU3RhcnRUcmVlQ3JlYXRpb25SZXNwb25zZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSVwoacm9vdF9ub2RlX3NpZ25hdHVyZV9zaGFyZXMYAiABKAsyGi5zcGFyay5Ob2RlU2lnbmF0dXJlU2hhcmVzUhdyb290Tm9kZVNpZ25hdHVyZVNoYXJlcyKRBAofU3RhcnREZXBvc2l0VHJlZUNyZWF0aW9uUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIvCg1vbl9jaGFpbl91dHhvGAIgASgLMgsuc3BhcmsuVVRYT1ILb25DaGFpblV0eG8SQAoTcm9vdF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEHJvb3RUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAQgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEk0KGmRpcmVjdF9yb290X3R4X3NpZ25pbmdfam9iGAUgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIWZGlyZWN0Um9vdFR4U2lnbmluZ0pvYhJRChxkaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAYgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIYZGlyZWN0UmVmdW5kVHhTaWduaW5nSm9iEmMKJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAcgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2IilAEKIFN0YXJ0RGVwb3NpdFRyZWVDcmVhdGlvblJlc3BvbnNlEhcKB3RyZWVfaWQYASABKAlSBnRyZWVJZBJXChpyb290X25vZGVfc2lnbmF0dXJlX3NoYXJlcxgCIAEoCzIaLnNwYXJrLk5vZGVTaWduYXR1cmVTaGFyZXNSF3Jvb3ROb2RlU2lnbmF0dXJlU2hhcmVzIpsBChJUb2tlbk91dHB1dFRvU3BlbmQSRgobcHJldl90b2tlbl90cmFuc2FjdGlvbl9oYXNoGAEgASgMQgf6QgR6AmggUhhwcmV2VG9rZW5UcmFuc2FjdGlvbkhhc2gSPQobcHJldl90b2tlbl90cmFuc2FjdGlvbl92b3V0GAIgASgNUhhwcmV2VG9rZW5UcmFuc2FjdGlvblZvdXQiWQoSVG9rZW5UcmFuc2ZlcklucHV0EkMKEG91dHB1dHNfdG9fc3BlbmQYASADKAsyGS5zcGFyay5Ub2tlbk91dHB1dFRvU3BlbmRSDm91dHB1dHNUb1NwZW5kIs8BCg5Ub2tlbk1pbnRJbnB1dBIzChFpc3N1ZXJfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIPaXNzdWVyUHVibGljS2V5EjoKGWlzc3Vlcl9wcm92aWRlZF90aW1lc3RhbXAYAiABKARSF2lzc3VlclByb3ZpZGVkVGltZXN0YW1wEjcKEHRva2VuX2lkZW50aWZpZXIYAyABKAxCB/pCBHoCaCBIAFIPdG9rZW5JZGVudGlmaWVyiAEBQhMKEV90b2tlbl9pZGVudGlmaWVyIvYCChBUb2tlbkNyZWF0ZUlucHV0EjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBAUIdChtfY3JlYXRpb25fZW50aXR5X3B1YmxpY19rZXkixwQKC1Rva2VuT3V0cHV0Eh0KAmlkGAEgASgJQgj6QgVyA7ABAUgAUgJpZIgBARIxChBvd25lcl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRJBChVyZXZvY2F0aW9uX2NvbW1pdG1lbnQYAyABKAxCB/pCBHoCaCFIAVIUcmV2b2NhdGlvbkNvbW1pdG1lbnSIAQESMQoSd2l0aGRyYXdfYm9uZF9zYXRzGAQgASgESAJSEHdpdGhkcmF3Qm9uZFNhdHOIAQESTAogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYBSABKARIA1Idd2l0aGRyYXdSZWxhdGl2ZUJsb2NrTG9ja3RpbWWIAQESNgoQdG9rZW5fcHVibGljX2tleRgGIAEoDEIH+kIEegJoIUgEUg50b2tlblB1YmxpY0tleYgBARI3ChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggSAVSD3Rva2VuSWRlbnRpZmllcogBARIqCgx0b2tlbl9hbW91bnQYByABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50QgUKA19pZEIYChZfcmV2b2NhdGlvbl9jb21taXRtZW50QhUKE193aXRoZHJhd19ib25kX3NhdHNCIwohX3dpdGhkcmF3X3JlbGF0aXZlX2Jsb2NrX2xvY2t0aW1lQhMKEV90b2tlbl9wdWJsaWNfa2V5QhMKEV90b2tlbl9pZGVudGlmaWVyIqUDChBUb2tlblRyYW5zYWN0aW9uEjYKCm1pbnRfaW5wdXQYASABKAsyFS5zcGFyay5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSQgoOdHJhbnNmZXJfaW5wdXQYAiABKAsyGS5zcGFyay5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBI8CgxjcmVhdGVfaW5wdXQYBSABKAsyFy5zcGFyay5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0EjcKDXRva2VuX291dHB1dHMYAyADKAsyEi5zcGFyay5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAQgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSMgoHbmV0d29yaxgKIAEoDjIOLnNwYXJrLk5ldHdvcmtCCPpCBYIBAiAAUgduZXR3b3JrQg4KDHRva2VuX2lucHV0cyJeChJTaWduYXR1cmVXaXRoSW5kZXgSJwoJc2lnbmF0dXJlGAEgASgMQgn6QgZ6BBBAGElSCXNpZ25hdHVyZRIfCgtpbnB1dF9pbmRleBgCIAEoDVIKaW5wdXRJbmRleCLFAQovT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWQSSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5IrYBCh5PcGVyYXRvclNwZWNpZmljT3duZXJTaWduYXR1cmUSQgoPb3duZXJfc2lnbmF0dXJlGAEgASgLMhkuc3BhcmsuU2lnbmF0dXJlV2l0aEluZGV4Ug5vd25lclNpZ25hdHVyZRJQCgdwYXlsb2FkGAIgASgLMjYuc3BhcmsuT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWRSB3BheWxvYWQicgoZUmV2b2NhdGlvblNlY3JldFdpdGhJbmRleBIfCgtpbnB1dF9pbmRleBgBIAEoDVIKaW5wdXRJbmRleBI0ChFyZXZvY2F0aW9uX3NlY3JldBgCIAEoDEIH+kIEegJoIFIQcmV2b2NhdGlvblNlY3JldCL4AgoTRnJlZXplVG9rZW5zUGF5bG9hZBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIxChB0b2tlbl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg50b2tlblB1YmxpY0tleRI6Chlpc3N1ZXJfcHJvdmlkZWRfdGltZXN0YW1wGAMgASgEUhdpc3N1ZXJQcm92aWRlZFRpbWVzdGFtcBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5EicKD3Nob3VsZF91bmZyZWV6ZRgFIAEoCFIOc2hvdWxkVW5mcmVlemUSNwoQdG9rZW5faWRlbnRpZmllchgGIAEoDEIH+kIEegJoIEgAUg90b2tlbklkZW50aWZpZXKIAQFCEwoRX3Rva2VuX2lkZW50aWZpZXIimwEKE0ZyZWV6ZVRva2Vuc1JlcXVlc3QSTgoVZnJlZXplX3Rva2Vuc19wYXlsb2FkGAEgASgLMhouc3BhcmsuRnJlZXplVG9rZW5zUGF5bG9hZFITZnJlZXplVG9rZW5zUGF5bG9hZBI0ChBpc3N1ZXJfc2lnbmF0dXJlGAIgASgMQgn6QgZ6BBBAGElSD2lzc3VlclNpZ25hdHVyZSKJAQoURnJlZXplVG9rZW5zUmVzcG9uc2USPQoTaW1wYWN0ZWRfb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIRaW1wYWN0ZWRPdXRwdXRJZHMSMgoVaW1wYWN0ZWRfdG9rZW5fYW1vdW50GAIgASgMUhNpbXBhY3RlZFRva2VuQW1vdW50Iv0FCghUcmVlTm9kZRIOCgJpZBgBIAEoCVICaWQSFwoHdHJlZV9pZBgCIAEoCVIGdHJlZUlkEhQKBXZhbHVlGAMgASgEUgV2YWx1ZRIpCg5wYXJlbnRfbm9kZV9pZBgEIAEoCUgAUgxwYXJlbnROb2RlSWSIAQESFwoHbm9kZV90eBgFIAEoDFIGbm9kZVR4EhsKCXJlZnVuZF90eBgGIAEoDFIIcmVmdW5kVHgSEgoEdm91dBgHIAEoDVIEdm91dBIwChR2ZXJpZnlpbmdfcHVibGljX2tleRgIIAEoDFISdmVyaWZ5aW5nUHVibGljS2V5EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYCSABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQQoQc2lnbmluZ19rZXlzaGFyZRgKIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIPc2lnbmluZ0tleXNoYXJlEhYKBnN0YXR1cxgLIAEoCVIGc3RhdHVzEigKB25ldHdvcmsYDCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEj0KDGNyZWF0ZWRfdGltZRgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC2NyZWF0ZWRUaW1lEj0KDHVwZGF0ZWRfdGltZRgOIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC3VwZGF0ZWRUaW1lEjcKGG93bmVyX3NpZ25pbmdfcHVibGljX2tleRgPIAEoDFIVb3duZXJTaWduaW5nUHVibGljS2V5EhsKCWRpcmVjdF90eBgQIAEoDFIIZGlyZWN0VHgSKAoQZGlyZWN0X3JlZnVuZF90eBgRIAEoDFIOZGlyZWN0UmVmdW5kVHgSOgoaZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHgYEiABKAxSFmRpcmVjdEZyb21DcGZwUmVmdW5kVHhCEQoPX3BhcmVudF9ub2RlX2lkIpABCh1GaW5hbGl6ZU5vZGVTaWduYXR1cmVzUmVxdWVzdBIvCgZpbnRlbnQYASABKA4yFy5jb21tb24uU2lnbmF0dXJlSW50ZW50UgZpbnRlbnQSPgoPbm9kZV9zaWduYXR1cmVzGAIgAygLMhUuc3BhcmsuTm9kZVNpZ25hdHVyZXNSDm5vZGVTaWduYXR1cmVzIkcKHkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXNwb25zZRIlCgVub2RlcxgBIAMoCzIPLnNwYXJrLlRyZWVOb2RlUgVub2RlcyJICgtTZWNyZXRTaGFyZRIhCgxzZWNyZXRfc2hhcmUYASABKAxSC3NlY3JldFNoYXJlEhYKBnByb29mcxgCIAMoDFIGcHJvb2ZzIiUKC1NlY3JldFByb29mEhYKBnByb29mcxgBIAMoDFIGcHJvb2ZzIq8CChZMZWFmUmVmdW5kVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIr4CChZVc2VyU2lnbmVkVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBIsChJzaWduaW5nX3B1YmxpY19rZXkYAiABKAxSEHNpZ25pbmdQdWJsaWNLZXkSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJTChhzaWduaW5nX25vbmNlX2NvbW1pdG1lbnQYBCABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFnNpZ25pbmdOb25jZUNvbW1pdG1lbnQSJQoOdXNlcl9zaWduYXR1cmUYBSABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgGIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzIvICChlMZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSIwoNdmVyaWZ5aW5nX2tleRgDIAEoDFIMdmVyaWZ5aW5nS2V5EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCL1AwoeU3RhcnRVc2VyU2lnbmVkVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQwoObGVhdmVzX3RvX3NlbmQYAyADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUgxsZWF2ZXNUb1NlbmQSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI7CgtleHBpcnlfdGltZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCmV4cGlyeVRpbWUSUAoVZGlyZWN0X2xlYXZlc190b19zZW5kGAYgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlISZGlyZWN0TGVhdmVzVG9TZW5kEmIKH2RpcmVjdF9mcm9tX2NwZnBfbGVhdmVzX3RvX3NlbmQYByADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhpkaXJlY3RGcm9tQ3BmcExlYXZlc1RvU2VuZCKpAwoUU3RhcnRUcmFuc2ZlclJlcXVlc3QSHwoLdHJhbnNmZXJfaWQYASABKAlSCnRyYW5zZmVySWQSOQoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIWb3duZXJJZGVudGl0eVB1YmxpY0tleRJDCg5sZWF2ZXNfdG9fc2VuZBgDIAMoCzIdLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBI/ChxyZWNlaXZlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMUhlyZWNlaXZlcklkZW50aXR5UHVibGljS2V5EjsKC2V4cGlyeV90aW1lGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRJBChB0cmFuc2Zlcl9wYWNrYWdlGAcgASgLMhYuc3BhcmsuVHJhbnNmZXJQYWNrYWdlUg90cmFuc2ZlclBhY2thZ2USIwoNc3BhcmtfaW52b2ljZRgKIAEoCVIMc3BhcmtJbnZvaWNlSgQIBhAHSgQICRAKIo8BChVTdGFydFRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi0AMKD1RyYW5zZmVyUGFja2FnZRJDCg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBJXChFrZXlfdHdlYWtfcGFja2FnZRgCIAMoCzIrLnNwYXJrLlRyYW5zZmVyUGFja2FnZS5LZXlUd2Vha1BhY2thZ2VFbnRyeVIPa2V5VHdlYWtQYWNrYWdlEiUKDnVzZXJfc2lnbmF0dXJlGAMgASgMUg11c2VyU2lnbmF0dXJlElAKFWRpcmVjdF9sZWF2ZXNfdG9fc2VuZBgEIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEmRpcmVjdExlYXZlc1RvU2VuZBJiCh9kaXJlY3RfZnJvbV9jcGZwX2xlYXZlc190b19zZW5kGAUgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIaZGlyZWN0RnJvbUNwZnBMZWF2ZXNUb1NlbmQaQgoUS2V5VHdlYWtQYWNrYWdlRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJSChFTZW5kTGVhZktleVR3ZWFrcxI9Cg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIXLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWtSDGxlYXZlc1RvU2VuZCKDBAoQU2VuZExlYWZLZXlUd2VhaxIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSQAoSc2VjcmV0X3NoYXJlX3R3ZWFrGAIgASgLMhIuc3BhcmsuU2VjcmV0U2hhcmVSEHNlY3JldFNoYXJlVHdlYWsSXgoTcHVia2V5X3NoYXJlc190d2VhaxgDIAMoCzIuLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWsuUHVia2V5U2hhcmVzVHdlYWtFbnRyeVIRcHVia2V5U2hhcmVzVHdlYWsSIwoNc2VjcmV0X2NpcGhlchgEIAEoDFIMc2VjcmV0Q2lwaGVyEhwKCXNpZ25hdHVyZRgFIAEoDFIJc2lnbmF0dXJlEikKEHJlZnVuZF9zaWduYXR1cmUYBiABKAxSD3JlZnVuZFNpZ25hdHVyZRI2ChdkaXJlY3RfcmVmdW5kX3NpZ25hdHVyZRgHIAEoDFIVZGlyZWN0UmVmdW5kU2lnbmF0dXJlEkgKIWRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3NpZ25hdHVyZRgIIAEoDFIdZGlyZWN0RnJvbUNwZnBSZWZ1bmRTaWduYXR1cmUaRAoWUHVia2V5U2hhcmVzVHdlYWtFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIuYBChdGaW5hbGl6ZVRyYW5zZmVyUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5Ej0KDmxlYXZlc190b19zZW5kGAMgAygLMhcuc3BhcmsuU2VuZExlYWZLZXlUd2Vha1IMbGVhdmVzVG9TZW5kEjAKFHNwYXJrX3BheW1lbnRfaW50ZW50GAQgASgJUhJzcGFya1BheW1lbnRJbnRlbnQiywEKKkZpbmFsaXplVHJhbnNmZXJXaXRoVHJhbnNmZXJQYWNrYWdlUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkEKEHRyYW5zZmVyX3BhY2thZ2UYAyABKAsyFi5zcGFyay5UcmFuc2ZlclBhY2thZ2VSD3RyYW5zZmVyUGFja2FnZSJHChhGaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXIiyAQKCFRyYW5zZmVyEg4KAmlkGAEgASgJUgJpZBI7ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIXc2VuZGVySWRlbnRpdHlQdWJsaWNLZXkSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgDIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRItCgZzdGF0dXMYBCABKA4yFS5zcGFyay5UcmFuc2ZlclN0YXR1c1IGc3RhdHVzEh8KC3RvdGFsX3ZhbHVlGAUgASgEUgp0b3RhbFZhbHVlEjsKC2V4cGlyeV90aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRIrCgZsZWF2ZXMYByADKAsyEy5zcGFyay5UcmFuc2ZlckxlYWZSBmxlYXZlcxI9CgxjcmVhdGVkX3RpbWUYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgtjcmVhdGVkVGltZRI9Cgx1cGRhdGVkX3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRInCgR0eXBlGAogASgOMhMuc3BhcmsuVHJhbnNmZXJUeXBlUgR0eXBlEiMKDXNwYXJrX2ludm9pY2UYCyABKAlSDHNwYXJrSW52b2ljZRIoCgduZXR3b3JrGAwgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayKEAwoMVHJhbnNmZXJMZWFmEiMKBGxlYWYYASABKAsyDy5zcGFyay5UcmVlTm9kZVIEbGVhZhIjCg1zZWNyZXRfY2lwaGVyGAIgASgMUgxzZWNyZXRDaXBoZXISHAoJc2lnbmF0dXJlGAMgASgMUglzaWduYXR1cmUSNAoWaW50ZXJtZWRpYXRlX3JlZnVuZF90eBgEIAEoDFIUaW50ZXJtZWRpYXRlUmVmdW5kVHgSQQodaW50ZXJtZWRpYXRlX2RpcmVjdF9yZWZ1bmRfdHgYBSABKAxSGmludGVybWVkaWF0ZURpcmVjdFJlZnVuZFR4ElMKJ2ludGVybWVkaWF0ZV9kaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eBgGIAEoDFIiaW50ZXJtZWRpYXRlRGlyZWN0RnJvbUNwZnBSZWZ1bmRUeBI+ChxwZW5kaW5nX2tleV90d2Vha19wdWJsaWNfa2V5GAcgASgMUhhwZW5kaW5nS2V5VHdlYWtQdWJsaWNLZXki8wMKDlRyYW5zZmVyRmlsdGVyEkEKHHJlY2VpdmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxIAFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI9ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDEgAUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleRJTCiZzZW5kZXJfb3JfcmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRg8IAEoDEgAUiFzZW5kZXJPclJlY2VpdmVySWRlbnRpdHlQdWJsaWNLZXkSIQoMdHJhbnNmZXJfaWRzGAMgAygJUgt0cmFuc2ZlcklkcxIUCgVsaW1pdBgoIAEoA1IFbGltaXQSFgoGb2Zmc2V0GDIgASgDUgZvZmZzZXQSKQoFdHlwZXMYRiADKA4yEy5zcGFyay5UcmFuc2ZlclR5cGVSBXR5cGVzEigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEjEKCHN0YXR1c2VzGFAgAygOMhUuc3BhcmsuVHJhbnNmZXJTdGF0dXNSCHN0YXR1c2VzEiIKBW9yZGVyGAUgASgOMgwuc3BhcmsuT3JkZXJSBW9yZGVyQg0KC3BhcnRpY2lwYW50Il8KFlF1ZXJ5VHJhbnNmZXJzUmVzcG9uc2USLQoJdHJhbnNmZXJzGAEgAygLMg8uc3BhcmsuVHJhbnNmZXJSCXRyYW5zZmVycxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCKVAgoRQ2xhaW1MZWFmS2V5VHdlYWsSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEkAKEnNlY3JldF9zaGFyZV90d2VhaxgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUhBzZWNyZXRTaGFyZVR3ZWFrEl8KE3B1YmtleV9zaGFyZXNfdHdlYWsYAyADKAsyLy5zcGFyay5DbGFpbUxlYWZLZXlUd2Vhay5QdWJrZXlTaGFyZXNUd2Vha0VudHJ5UhFwdWJrZXlTaGFyZXNUd2VhaxpEChZQdWJrZXlTaGFyZXNUd2Vha0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEiwQEKHUNsYWltVHJhbnNmZXJUd2Vha0tleXNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSRAoRbGVhdmVzX3RvX3JlY2VpdmUYAyADKAsyGC5zcGFyay5DbGFpbUxlYWZLZXlUd2Vha1IPbGVhdmVzVG9SZWNlaXZlIsUBCh9DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQAoMc2lnbmluZ19qb2JzGAMgAygLMh0uc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ0pvYlILc2lnbmluZ0pvYnNKBAgEEAUibQogQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVzcG9uc2USSQoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9wEKGVN0b3JlUHJlaW1hZ2VTaGFyZVJlcXVlc3QSIQoMcGF5bWVudF9oYXNoGAEgASgMUgtwYXltZW50SGFzaBI5Cg5wcmVpbWFnZV9zaGFyZRgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUg1wcmVpbWFnZVNoYXJlEhwKCXRocmVzaG9sZBgDIAEoDVIJdGhyZXNob2xkEiUKDmludm9pY2Vfc3RyaW5nGAQgASgJUg1pbnZvaWNlU3RyaW5nEjcKGHVzZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIVdXNlcklkZW50aXR5UHVibGljS2V5IoECChtSZXF1ZXN0ZWRTaWduaW5nQ29tbWl0bWVudHMSewoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgBIAMoCzI/LnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5UhdzaWduaW5nTm9uY2VDb21taXRtZW50cxplChxTaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEiTwocR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVxdWVzdBIZCghub2RlX2lkcxgBIAMoCVIHbm9kZUlkcxIUCgVjb3VudBgCIAEoDVIFY291bnQidAodR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVzcG9uc2USUwoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIiLnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzItoBChJTaWduaW5nQ29tbWl0bWVudHMSYgoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIxLnNwYXJrLlNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nQ29tbWl0bWVudHNFbnRyeVISc2lnbmluZ0NvbW1pdG1lbnRzGmAKF1NpZ25pbmdDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEixgIKEFVzZXJTaWduZWRSZWZ1bmQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhsKCXJlZnVuZF90eBgCIAEoDFIIcmVmdW5kVHgSJQoOdXNlcl9zaWduYXR1cmUYAyABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgEIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzElUKGXVzZXJfc2lnbmF0dXJlX2NvbW1pdG1lbnQYBSABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSF3VzZXJTaWduYXR1cmVDb21taXRtZW50EjIKB25ldHdvcmsYBiABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yayI7ChJJbnZvaWNlQW1vdW50UHJvb2YSJQoOYm9sdDExX2ludm9pY2UYASABKAlSDWJvbHQxMUludm9pY2UiewoNSW52b2ljZUFtb3VudBIdCgp2YWx1ZV9zYXRzGAEgASgEUgl2YWx1ZVNhdHMSSwoUaW52b2ljZV9hbW91bnRfcHJvb2YYAiABKAsyGS5zcGFyay5JbnZvaWNlQW1vdW50UHJvb2ZSEmludm9pY2VBbW91bnRQcm9vZiLWAwobSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSOwoOaW52b2ljZV9hbW91bnQYAiABKAsyFC5zcGFyay5JbnZvaWNlQW1vdW50Ug1pbnZvaWNlQW1vdW50EkEKBnJlYXNvbhgDIAEoDjIpLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdC5SZWFzb25SBnJlYXNvbhJBCgh0cmFuc2ZlchgEIAEoCzIlLnNwYXJrLlN0YXJ0VXNlclNpZ25lZFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRIZCghmZWVfc2F0cxgGIAEoBFIHZmVlU2F0cxJGChB0cmFuc2Zlcl9yZXF1ZXN0GAcgASgLMhsuc3BhcmsuU3RhcnRUcmFuc2ZlclJlcXVlc3RSD3RyYW5zZmVyUmVxdWVzdCItCgZSZWFzb24SDwoLUkVBU09OX1NFTkQQABISCg5SRUFTT05fUkVDRUlWRRABImcKHEluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2USGgoIcHJlaW1hZ2UYASABKAxSCHByZWltYWdlEisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjIKCE91dFBvaW50EhIKBHR4aWQYASABKAxSBHR4aWQSEgoEdm91dBgCIAEoDVIEdm91dCKHAQoWQ29vcGVyYXRpdmVFeGl0UmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchIXCgdleGl0X2lkGAIgASgJUgZleGl0SWQSGwoJZXhpdF90eGlkGAMgASgMUghleGl0VHhpZCKRAQoXQ29vcGVyYXRpdmVFeGl0UmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMioAIKFkNvdW50ZXJMZWFmU3dhcFJlcXVlc3QSNwoIdHJhbnNmZXIYASABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISFwoHc3dhcF9pZBgCIAEoCVIGc3dhcElkEiwKEmFkYXB0b3JfcHVibGljX2tleRgDIAEoDFIQYWRhcHRvclB1YmxpY0tleRI5ChlkaXJlY3RfYWRhcHRvcl9wdWJsaWNfa2V5GAQgASgMUhZkaXJlY3RBZGFwdG9yUHVibGljS2V5EksKI2RpcmVjdF9mcm9tX2NwZnBfYWRhcHRvcl9wdWJsaWNfa2V5GAUgASgMUh5kaXJlY3RGcm9tQ3BmcEFkYXB0b3JQdWJsaWNLZXkikQEKF0NvdW50ZXJMZWFmU3dhcFJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD3NpZ25pbmdfcmVzdWx0cxgCIAMoCzIgLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIqIBChZSZWZyZXNoVGltZWxvY2tSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EjQKDHNpZ25pbmdfam9icxgDIAMoCzIRLnNwYXJrLlNpZ25pbmdKb2JSC3NpZ25pbmdKb2JzIoABChxSZWZyZXNoVGltZWxvY2tTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkiZwoXUmVmcmVzaFRpbWVsb2NrUmVzcG9uc2USTAoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiMuc3BhcmsuUmVmcmVzaFRpbWVsb2NrU2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9gMKEUV4dGVuZExlYWZSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkAKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iEkQKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iInsKF0V4dGVuZExlYWZTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkimwQKEkV4dGVuZExlYWZSZXNwb25zZRIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSUwoWbm9kZV90eF9zaWduaW5nX3Jlc3VsdBgCIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0ElcKGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSYAodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyHi5zcGFyay5FeHRlbmRMZWFmU2lnbmluZ1Jlc3VsdFIZZGlyZWN0Tm9kZVR4U2lnbmluZ1Jlc3VsdBJkCh9kaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfcmVzdWx0GAUgASgLMh4uc3BhcmsuRXh0ZW5kTGVhZlNpZ25pbmdSZXN1bHRSG2RpcmVjdFJlZnVuZFR4U2lnbmluZ1Jlc3VsdBJ2CilkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgGIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJzChJBZGRyZXNzUmVxdWVzdE5vZGUSJgoPdXNlcl9wdWJsaWNfa2V5GAEgASgMUg11c2VyUHVibGljS2V5EjUKCGNoaWxkcmVuGAIgAygLMhkuc3BhcmsuQWRkcmVzc1JlcXVlc3ROb2RlUghjaGlsZHJlbiKDAgoZUHJlcGFyZVRyZWVBZGRyZXNzUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SLQoEbm9kZRgDIAEoCzIZLnNwYXJrLkFkZHJlc3NSZXF1ZXN0Tm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UiZwoLQWRkcmVzc05vZGUSKAoHYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSB2FkZHJlc3MSLgoIY2hpbGRyZW4YAiADKAsyEi5zcGFyay5BZGRyZXNzTm9kZVIIY2hpbGRyZW4iRAoaUHJlcGFyZVRyZWVBZGRyZXNzUmVzcG9uc2USJgoEbm9kZRgBIAEoCzISLnNwYXJrLkFkZHJlc3NOb2RlUgRub2RlIs4DCgxDcmVhdGlvbk5vZGUSQAoTbm9kZV90eF9zaWduaW5nX2pvYhgBIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEG5vZGVUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAIgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEi8KCGNoaWxkcmVuGAMgAygLMhMuc3BhcmsuQ3JlYXRpb25Ob2RlUghjaGlsZHJlbhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIvUBChFDcmVhdGVUcmVlUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SJwoEbm9kZRgDIAEoCzITLnNwYXJrLkNyZWF0aW9uTm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UipAQKFENyZWF0aW9uUmVzcG9uc2VOb2RlEhcKB25vZGVfaWQYASABKAlSBm5vZGVJZBJJChZub2RlX3R4X3NpZ25pbmdfcmVzdWx0GAIgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFITbm9kZVR4U2lnbmluZ1Jlc3VsdBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAyABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSNwoIY2hpbGRyZW4YBCADKAsyGy5zcGFyay5DcmVhdGlvblJlc3BvbnNlTm9kZVIIY2hpbGRyZW4SVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJFChJDcmVhdGVUcmVlUmVzcG9uc2USLwoEbm9kZRgBIAEoCzIbLnNwYXJrLkNyZWF0aW9uUmVzcG9uc2VOb2RlUgRub2RlIoQBChNTaWduaW5nT3BlcmF0b3JJbmZvEhQKBWluZGV4GAEgASgEUgVpbmRleBIeCgppZGVudGlmaWVyGAIgASgJUgppZGVudGlmaWVyEh0KCnB1YmxpY19rZXkYAyABKAxSCXB1YmxpY0tleRIYCgdhZGRyZXNzGAQgASgJUgdhZGRyZXNzIusBCh5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2USaAoRc2lnbmluZ19vcGVyYXRvcnMYASADKAsyOy5zcGFyay5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2UuU2lnbmluZ09wZXJhdG9yc0VudHJ5UhBzaWduaW5nT3BlcmF0b3JzGl8KFVNpZ25pbmdPcGVyYXRvcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIwCgV2YWx1ZRgCIAEoCzIaLnNwYXJrLlNpZ25pbmdPcGVyYXRvckluZm9SBXZhbHVlOgI4ASJyCh1RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVxdWVzdBIhCgxwYXltZW50X2hhc2gYASABKAxSC3BheW1lbnRIYXNoEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSEWlkZW50aXR5UHVibGljS2V5IpwBCh5RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVzcG9uc2USRwoTdXNlcl9zaWduZWRfcmVmdW5kcxgBIAMoCzIXLnNwYXJrLlVzZXJTaWduZWRSZWZ1bmRSEXVzZXJTaWduZWRSZWZ1bmRzEisKCHRyYW5zZmVyGAMgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVySgQIAhADIqQDChtQcmVpbWFnZVJlcXVlc3RXaXRoVHJhbnNmZXISKgoMcGF5bWVudF9oYXNoGAEgASgMQgf6QgR6AmggUgtwYXltZW50SGFzaBJBChhyZWNlaXZlcl9pZGVudGl0eV9wdWJrZXkYAiABKAxCB/pCBHoCaCFSFnJlY2VpdmVySWRlbnRpdHlQdWJrZXkSNAoGc3RhdHVzGAMgASgOMhwuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0U3RhdHVzUgZzdGF0dXMSPQoMY3JlYXRlZF90aW1lGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFILY3JlYXRlZFRpbWUSMAoIdHJhbnNmZXIYBSABKAsyDy5zcGFyay5UcmFuc2ZlckgAUgh0cmFuc2ZlcogBARIfCghwcmVpbWFnZRgGIAEoDEgBUghwcmVpbWFnZYgBARI0ChZzZW5kZXJfaWRlbnRpdHlfcHVia2V5GAcgASgMUhRzZW5kZXJJZGVudGl0eVB1YmtleUILCglfdHJhbnNmZXJCCwoJX3ByZWltYWdlIsQCChBRdWVyeUh0bGNSZXF1ZXN0EiUKDnBheW1lbnRfaGFzaGVzGAEgAygMUg1wYXltZW50SGFzaGVzEjcKE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5EjkKBnN0YXR1cxgDIAEoDjIcLnNwYXJrLlByZWltYWdlUmVxdWVzdFN0YXR1c0gAUgZzdGF0dXOIAQESFAoFbGltaXQYBCABKANSBWxpbWl0EhYKBm9mZnNldBgFIAEoA1IGb2Zmc2V0EiEKDHRyYW5zZmVyX2lkcxgGIAMoCVILdHJhbnNmZXJJZHMSOQoKbWF0Y2hfcm9sZRgHIAEoDjIaLnNwYXJrLlByZWltYWdlUmVxdWVzdFJvbGVSCW1hdGNoUm9sZUIJCgdfc3RhdHVzInwKEVF1ZXJ5SHRsY1Jlc3BvbnNlEk8KEXByZWltYWdlX3JlcXVlc3RzGAEgAygLMiIuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0V2l0aFRyYW5zZmVyUhBwcmVpbWFnZVJlcXVlc3RzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0IocBChZQcm92aWRlUHJlaW1hZ2VSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSGgoIcHJlaW1hZ2UYAiABKAxSCHByZWltYWdlEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAyABKAxSEWlkZW50aXR5UHVibGljS2V5IkYKF1Byb3ZpZGVQcmVpbWFnZVJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIigKC1RyZWVOb2RlSWRzEhkKCG5vZGVfaWRzGAEgAygJUgdub2RlSWRzIrgCChFRdWVyeU5vZGVzUmVxdWVzdBI0ChVvd25lcl9pZGVudGl0eV9wdWJrZXkYASABKAxIAFITb3duZXJJZGVudGl0eVB1YmtleRIvCghub2RlX2lkcxgCIAEoCzISLnNwYXJrLlRyZWVOb2RlSWRzSABSB25vZGVJZHMSJwoPaW5jbHVkZV9wYXJlbnRzGAMgASgIUg5pbmNsdWRlUGFyZW50cxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSKAoHbmV0d29yaxgGIAEoDjIOLnNwYXJrLk5ldHdvcmtSB25ldHdvcmsSMQoIc3RhdHVzZXMYByADKA4yFS5zcGFyay5UcmVlTm9kZVN0YXR1c1IIc3RhdHVzZXNCCAoGc291cmNlIrMBChJRdWVyeU5vZGVzUmVzcG9uc2USOgoFbm9kZXMYASADKAsyJC5zcGFyay5RdWVyeU5vZGVzUmVzcG9uc2UuTm9kZXNFbnRyeVIFbm9kZXMSFgoGb2Zmc2V0GAIgASgDUgZvZmZzZXQaSQoKTm9kZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIlCgV2YWx1ZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgV2YWx1ZToCOAEidQoVQ2FuY2VsVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjsKGnNlbmRlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleSJFChZDYW5jZWxUcmFuc2ZlclJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIqwBCiJRdWVyeVVudXNlZERlcG9zaXRBZGRyZXNzZXNSZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5EigKB25ldHdvcmsYAiABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEhQKBWxpbWl0GAMgASgDUgVsaW1pdBIWCgZvZmZzZXQYBCABKANSBm9mZnNldCLuAQoiUXVlcnlTdGF0aWNEZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yaxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSLAoPZGVwb3NpdF9hZGRyZXNzGAYgASgJSABSDmRlcG9zaXRBZGRyZXNziAEBQhIKEF9kZXBvc2l0X2FkZHJlc3MiygIKGURlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHQSJwoPZGVwb3NpdF9hZGRyZXNzGAEgASgJUg5kZXBvc2l0QWRkcmVzcxI1Chd1c2VyX3NpZ25pbmdfcHVibGljX2tleRgCIAEoDFIUdXNlclNpZ25pbmdQdWJsaWNLZXkSMAoUdmVyaWZ5aW5nX3B1YmxpY19rZXkYAyABKAxSEnZlcmlmeWluZ1B1YmxpY0tleRImCgdsZWFmX2lkGAQgASgJQgj6QgVyA7ABAUgAUgZsZWFmSWSIAQESTwoTcHJvb2Zfb2ZfcG9zc2Vzc2lvbhgFIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZIAVIRcHJvb2ZPZlBvc3Nlc3Npb26IAQFCCgoIX2xlYWZfaWRCFgoUX3Byb29mX29mX3Bvc3Nlc3Npb24ijAEKI1F1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlEk0KEWRlcG9zaXRfYWRkcmVzc2VzGAEgAygLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIQZGVwb3NpdEFkZHJlc3NlcxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCJ0CiNRdWVyeVN0YXRpY0RlcG9zaXRBZGRyZXNzZXNSZXNwb25zZRJNChFkZXBvc2l0X2FkZHJlc3NlcxgBIAMoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSEGRlcG9zaXRBZGRyZXNzZXMibwoTUXVlcnlCYWxhbmNlUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayLFAQoUUXVlcnlCYWxhbmNlUmVzcG9uc2USGAoHYmFsYW5jZRgBIAEoBFIHYmFsYW5jZRJSCg1ub2RlX2JhbGFuY2VzGAIgAygLMi0uc3BhcmsuUXVlcnlCYWxhbmNlUmVzcG9uc2UuTm9kZUJhbGFuY2VzRW50cnlSDG5vZGVCYWxhbmNlcxo/ChFOb2RlQmFsYW5jZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoBFIFdmFsdWU6AjgBIsUBCgxTcGFya0FkZHJlc3MSLgoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDFIRaWRlbnRpdHlQdWJsaWNLZXkSSwoUc3BhcmtfaW52b2ljZV9maWVsZHMYAiABKAsyGS5zcGFyay5TcGFya0ludm9pY2VGaWVsZHNSEnNwYXJrSW52b2ljZUZpZWxkcxIqCglzaWduYXR1cmUYAyABKAxCB/pCBHoCaEBIAFIJc2lnbmF0dXJliAEBQgwKCl9zaWduYXR1cmUinAMKElNwYXJrSW52b2ljZUZpZWxkcxIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEhcKAmlkGAIgASgMQgf6QgR6AmgQUgJpZBI9Cg50b2tlbnNfcGF5bWVudBgDIAEoCzIULnNwYXJrLlRva2Vuc1BheW1lbnRIAFINdG9rZW5zUGF5bWVudBI3CgxzYXRzX3BheW1lbnQYBCABKAsyEi5zcGFyay5TYXRzUGF5bWVudEgAUgtzYXRzUGF5bWVudBIgCgRtZW1vGAUgASgJQgf6QgRyAih4SAFSBG1lbW+IAQESOAoRc2VuZGVyX3B1YmxpY19rZXkYBiABKAxCB/pCBHoCaCFIAlIPc2VuZGVyUHVibGljS2V5iAEBEkAKC2V4cGlyeV90aW1lGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDUgpleHBpcnlUaW1liAEBQg4KDHBheW1lbnRfdHlwZUIHCgVfbWVtb0IUChJfc2VuZGVyX3B1YmxpY19rZXlCDgoMX2V4cGlyeV90aW1lIjUKC1NhdHNQYXltZW50EhsKBmFtb3VudBgBIAEoBEgAUgZhbW91bnSIAQFCCQoHX2Ftb3VudCKOAQoNVG9rZW5zUGF5bWVudBI3ChB0b2tlbl9pZGVudGlmaWVyGAEgASgMQgf6QgR6AmggSABSD3Rva2VuSWRlbnRpZmllcogBARIkCgZhbW91bnQYAiABKAxCB/pCBHoCGBBIAVIGYW1vdW50iAEBQhMKEV90b2tlbl9pZGVudGlmaWVyQgkKB19hbW91bnQixgEKJkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISJQoOdXNlcl9zaWduYXR1cmUYBCABKAxSDXVzZXJTaWduYXR1cmUiwwEKJ0luaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXNwb25zZRJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYASABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSSQoPZGVwb3NpdF9hZGRyZXNzGAIgASgLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIOZGVwb3NpdEFkZHJlc3MisAMKF0luaXRpYXRlVXR4b1N3YXBSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxI9CgxyZXF1ZXN0X3R5cGUYAiABKA4yGi5zcGFyay5VdHhvU3dhcFJlcXVlc3RUeXBlUgtyZXF1ZXN0VHlwZRIuChJjcmVkaXRfYW1vdW50X3NhdHMYAyABKARIAFIQY3JlZGl0QW1vdW50U2F0cxIiCgxtYXhfZmVlX3NhdHMYBCABKARIAFIKbWF4RmVlU2F0cxIjCg1zc3Bfc2lnbmF0dXJlGAUgASgMUgxzc3BTaWduYXR1cmUSJQoOdXNlcl9zaWduYXR1cmUYBiABKAxSDXVzZXJTaWduYXR1cmUSNwoIdHJhbnNmZXIYByABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISQgoUc3BlbmRfdHhfc2lnbmluZ19qb2IYCCABKAsyES5zcGFyay5TaWduaW5nSm9iUhFzcGVuZFR4U2lnbmluZ0pvYkIICgZhbW91bnQi3wEKGEluaXRpYXRlVXR4b1N3YXBSZXNwb25zZRJLChdzcGVuZF90eF9zaWduaW5nX3Jlc3VsdBgBIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFHNwZW5kVHhTaWduaW5nUmVzdWx0EisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD2RlcG9zaXRfYWRkcmVzcxgDIAEoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSDmRlcG9zaXRBZGRyZXNzIosBCgtFeGl0aW5nVHJlZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSUQoXdXNlcl9zaWduaW5nX2NvbW1pdG1lbnQYAiABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFXVzZXJTaWduaW5nQ29tbWl0bWVudBIQCgN2aW4YAyABKA1SA3ZpbiKcAQofRXhpdFNpbmdsZU5vZGVUcmVlU2lnbmluZ1Jlc3VsdBIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSOwoOc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0Ug1zaWduaW5nUmVzdWx0EiMKDXZlcmlmeWluZ19rZXkYAyABKAxSDHZlcmlmeWluZ0tleSJNChhCaXRjb2luVHJhbnNhY3Rpb25PdXRwdXQSFAoFdmFsdWUYASABKANSBXZhbHVlEhsKCXBrX3NjcmlwdBgCIAEoDFIIcGtTY3JpcHQi8wEKGkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSNwoNZXhpdGluZ190cmVlcxgCIAMoCzISLnNwYXJrLkV4aXRpbmdUcmVlUgxleGl0aW5nVHJlZXMSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJKChBwcmV2aW91c19vdXRwdXRzGAQgAygLMh8uc3BhcmsuQml0Y29pblRyYW5zYWN0aW9uT3V0cHV0Ug9wcmV2aW91c091dHB1dHMibgobRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlEk8KD3NpZ25pbmdfcmVzdWx0cxgBIAMoCzImLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZVNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIloKHVF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkizwEKHlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZRJoChFub2RlX2Rpc3RyaWJ1dGlvbhgBIAMoCzI7LnNwYXJrLlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZS5Ob2RlRGlzdHJpYnV0aW9uRW50cnlSEG5vZGVEaXN0cmlidXRpb24aQwoVTm9kZURpc3RyaWJ1dGlvbkVudHJ5EhAKA2tleRgBIAEoBFIDa2V5EhQKBXZhbHVlGAIgASgEUgV2YWx1ZToCOAEimQEKGFF1ZXJ5Tm9kZXNCeVZhbHVlUmVxdWVzdBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EhQKBXZhbHVlGAIgASgDUgV2YWx1ZRIWCgZvZmZzZXQYAyABKANSBm9mZnNldBIUCgVsaW1pdBgEIAEoA1IFbGltaXQiwQEKGVF1ZXJ5Tm9kZXNCeVZhbHVlUmVzcG9uc2USQQoFbm9kZXMYASADKAsyKy5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlc3BvbnNlLk5vZGVzRW50cnlSBW5vZGVzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0GkkKCk5vZGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSJQoFdmFsdWUYAiABKAsyDy5zcGFyay5UcmVlTm9kZVIFdmFsdWU6AjgBIrYBChlHZXRVdHhvc0ZvckFkZHJlc3NSZXF1ZXN0EhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSFgoGb2Zmc2V0GAIgASgEUgZvZmZzZXQSFAoFbGltaXQYAyABKARSBWxpbWl0EigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEicKD2V4Y2x1ZGVfY2xhaW1lZBgFIAEoCFIOZXhjbHVkZUNsYWltZWQiVwoaR2V0VXR4b3NGb3JBZGRyZXNzUmVzcG9uc2USIQoFdXR4b3MYASADKAsyCy5zcGFyay5VVFhPUgV1dHhvcxIWCgZvZmZzZXQYAiABKARSBm9mZnNldCJjChlRdWVyeVNwYXJrSW52b2ljZXNSZXF1ZXN0EhQKBWxpbWl0GAEgASgDUgVsaW1pdBIWCgZvZmZzZXQYAiABKANSBm9mZnNldBIYCgdpbnZvaWNlGAMgAygJUgdpbnZvaWNlIncKGlF1ZXJ5U3BhcmtJbnZvaWNlc1Jlc3BvbnNlEhYKBm9mZnNldBgBIAEoA1IGb2Zmc2V0EkEKEGludm9pY2Vfc3RhdHVzZXMYAiADKAsyFi5zcGFyay5JbnZvaWNlUmVzcG9uc2VSD2ludm9pY2VTdGF0dXNlcyLlAQoPSW52b2ljZVJlc3BvbnNlEhgKB2ludm9pY2UYASABKAlSB2ludm9pY2USLAoGc3RhdHVzGAIgASgOMhQuc3BhcmsuSW52b2ljZVN0YXR1c1IGc3RhdHVzEjoKDXNhdHNfdHJhbnNmZXIYAyABKAsyEy5zcGFyay5TYXRzVHJhbnNmZXJIAFIMc2F0c1RyYW5zZmVyEj0KDnRva2VuX3RyYW5zZmVyGAQgASgLMhQuc3BhcmsuVG9rZW5UcmFuc2ZlckgAUg10b2tlblRyYW5zZmVyQg8KDXRyYW5zZmVyX3R5cGUiOAoMU2F0c1RyYW5zZmVyEigKC3RyYW5zZmVyX2lkGAEgASgMQgf6QgR6AmgQUgp0cmFuc2ZlcklkIlkKDVRva2VuVHJhbnNmZXISSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaCKtAQoiSW5pdGlhdGVTd2FwUHJpbWFyeVRyYW5zZmVyUmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchJOChNhZGFwdG9yX3B1YmxpY19rZXlzGAIgASgLMh4uc3BhcmsuQWRhcHRvclB1YmxpY0tleVBhY2thZ2VSEWFkYXB0b3JQdWJsaWNLZXlzIp0BCiNJbml0aWF0ZVN3YXBQcmltYXJ5VHJhbnNmZXJSZXNwb25zZRIrCgh0cmFuc2ZlchgBIAEoCzIPLnNwYXJrLlRyYW5zZmVyUgh0cmFuc2ZlchJJCg9zaWduaW5nX3Jlc3VsdHMYAiADKAsyIC5zcGFyay5MZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0Ug5zaWduaW5nUmVzdWx0cyLPAQoXQWRhcHRvclB1YmxpY0tleVBhY2thZ2USLAoSYWRhcHRvcl9wdWJsaWNfa2V5GAEgASgMUhBhZGFwdG9yUHVibGljS2V5EjkKGWRpcmVjdF9hZGFwdG9yX3B1YmxpY19rZXkYAiABKAxSFmRpcmVjdEFkYXB0b3JQdWJsaWNLZXkSSwojZGlyZWN0X2Zyb21fY3BmcF9hZGFwdG9yX3B1YmxpY19rZXkYAyABKAxSHmRpcmVjdEZyb21DcGZwQWRhcHRvclB1YmxpY0tleSJ8Cg1XYWxsZXRTZXR0aW5nEkIKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSJwoPcHJpdmF0ZV9lbmFibGVkGAIgASgIUg5wcml2YXRlRW5hYmxlZCJeChpVcGRhdGVXYWxsZXRTZXR0aW5nUmVxdWVzdBIsCg9wcml2YXRlX2VuYWJsZWQYASABKAhIAFIOcHJpdmF0ZUVuYWJsZWSIAQFCEgoQX3ByaXZhdGVfZW5hYmxlZCJaChtVcGRhdGVXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nIhsKGVF1ZXJ5V2FsbGV0U2V0dGluZ1JlcXVlc3QiWQoaUXVlcnlXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nKk0KB05ldHdvcmsSDwoLVU5TUEVDSUZJRUQQABILCgdNQUlOTkVUEAESCwoHUkVHVEVTVBACEgsKB1RFU1RORVQQAxIKCgZTSUdORVQQBCojCglEaXJlY3Rpb24SCAoETkVYVBAAEgwKCFBSRVZJT1VTEAEq/AMKDlRyYW5zZmVyU3RhdHVzEiQKIFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEEAASLAooVFJBTlNGRVJfU1RBVFVTX1NFTkRFUl9LRVlfVFdFQUtfUEVORElORxABEiYKIlRSQU5TRkVSX1NUQVRVU19TRU5ERVJfS0VZX1RXRUFLRUQQAhIoCiRUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLRUQQAxIqCiZUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfUkVGVU5EX1NJR05FRBAEEh0KGVRSQU5TRkVSX1NUQVRVU19DT01QTEVURUQQBRIbChdUUkFOU0ZFUl9TVEFUVVNfRVhQSVJFRBAGEhwKGFRSQU5TRkVSX1NUQVRVU19SRVRVUk5FRBAHEjAKLFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEX0NPT1JESU5BVE9SEAgSLQopVFJBTlNGRVJfU1RBVFVTX1JFQ0VJVkVSX0tFWV9UV0VBS19MT0NLRUQQCRIuCipUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLX0FQUExJRUQQChItCilUUkFOU0ZFUl9TVEFUVVNfQVBQTFlJTkdfU0VOREVSX0tFWV9UV0VBSxALKpoBCgxUcmFuc2ZlclR5cGUSEQoNUFJFSU1BR0VfU1dBUBAAEhQKEENPT1BFUkFUSVZFX0VYSVQQARIMCghUUkFOU0ZFUhACEg0KCVVUWE9fU1dBUBADEggKBFNXQVAQHhIQCgxDT1VOVEVSX1NXQVAQKBITCg9QUklNQVJZX1NXQVBfVjMQBBITCg9DT1VOVEVSX1NXQVBfVjMQBSomCgVPcmRlchIOCgpERVNDRU5ESU5HEAASDQoJQVNDRU5ESU5HEAEqnAEKFVByZWltYWdlUmVxdWVzdFN0YXR1cxIwCixQUkVJTUFHRV9SRVFVRVNUX1NUQVRVU19XQUlUSU5HX0ZPUl9QUkVJTUFHRRAAEisKJ1BSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1BSRUlNQUdFX1NIQVJFRBABEiQKIFBSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1JFVFVSTkVEEAIqWwoTUHJlaW1hZ2VSZXF1ZXN0Um9sZRIiCh5QUkVJTUFHRV9SRVFVRVNUX1JPTEVfUkVDRUlWRVIQABIgChxQUkVJTUFHRV9SRVFVRVNUX1JPTEVfU0VOREVSEAEqOAoTVXR4b1N3YXBSZXF1ZXN0VHlwZRIJCgVGaXhlZBAAEgoKBk1heEZlZRABEgoKBlJlZnVuZBACKk4KDUludm9pY2VTdGF0dXMSDQoJTk9UX0ZPVU5EEAASCwoHUEVORElORxABEg0KCUZJTkFMSVpFRBACEgwKCFJFVFVSTkVEEAQiBAgDEAMq4AIKDlRyZWVOb2RlU3RhdHVzEh0KGVRSRUVfTk9ERV9TVEFUVVNfQ1JFQVRJTkcQABIeChpUUkVFX05PREVfU1RBVFVTX0FWQUlMQUJMRRABEiUKIVRSRUVfTk9ERV9TVEFUVVNfRlJPWkVOX0JZX0lTU1VFUhACEiQKIFRSRUVfTk9ERV9TVEFUVVNfVFJBTlNGRVJfTE9DS0VEEAMSIQodVFJFRV9OT0RFX1NUQVRVU19TUExJVF9MT0NLRUQQBBIdChlUUkVFX05PREVfU1RBVFVTX1NQTElUVEVEEAUSHwobVFJFRV9OT0RFX1NUQVRVU19BR0dSRUdBVEVEEAYSHQoZVFJFRV9OT0RFX1NUQVRVU19PTl9DSEFJThAHEiMKH1RSRUVfTk9ERV9TVEFUVVNfQUdHUkVHQVRFX0xPQ0sQCBIbChdUUkVFX05PREVfU1RBVFVTX0VYSVRFRBAJMpMnCgxTcGFya1NlcnZpY2USaQoYZ2VuZXJhdGVfZGVwb3NpdF9hZGRyZXNzEiQuc3BhcmsuR2VuZXJhdGVEZXBvc2l0QWRkcmVzc1JlcXVlc3QaJS5zcGFyay5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVzcG9uc2UiABJ8Ch9nZW5lcmF0ZV9zdGF0aWNfZGVwb3NpdF9hZGRyZXNzEiouc3BhcmsuR2VuZXJhdGVTdGF0aWNEZXBvc2l0QWRkcmVzc1JlcXVlc3QaKy5zcGFyay5HZW5lcmF0ZVN0YXRpY0RlcG9zaXRBZGRyZXNzUmVzcG9uc2UiABJwChtzdGFydF9kZXBvc2l0X3RyZWVfY3JlYXRpb24SJi5zcGFyay5TdGFydERlcG9zaXRUcmVlQ3JlYXRpb25SZXF1ZXN0Gicuc3BhcmsuU3RhcnREZXBvc2l0VHJlZUNyZWF0aW9uUmVzcG9uc2UiABJdChNzdGFydF90cmVlX2NyZWF0aW9uEh8uc3BhcmsuU3RhcnRUcmVlQ3JlYXRpb25SZXF1ZXN0GiAuc3BhcmsuU3RhcnRUcmVlQ3JlYXRpb25SZXNwb25zZSIDiAIBEmwKGGZpbmFsaXplX25vZGVfc2lnbmF0dXJlcxIkLnNwYXJrLkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXF1ZXN0GiUuc3BhcmsuRmluYWxpemVOb2RlU2lnbmF0dXJlc1Jlc3BvbnNlIgOIAgESUAoOc3RhcnRfdHJhbnNmZXISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIDiAIBElkKEWZpbmFsaXplX3RyYW5zZmVyEh4uc3BhcmsuRmluYWxpemVUcmFuc2ZlclJlcXVlc3QaHy5zcGFyay5GaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2UiA4gCARJ/CidmaW5hbGl6ZV90cmFuc2Zlcl93aXRoX3RyYW5zZmVyX3BhY2thZ2USMS5zcGFyay5GaW5hbGl6ZVRyYW5zZmVyV2l0aFRyYW5zZmVyUGFja2FnZVJlcXVlc3QaHy5zcGFyay5GaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2UiABJTCg9jYW5jZWxfdHJhbnNmZXISHC5zcGFyay5DYW5jZWxUcmFuc2ZlclJlcXVlc3QaHS5zcGFyay5DYW5jZWxUcmFuc2ZlclJlc3BvbnNlIgOIAgESUQoXcXVlcnlfcGVuZGluZ190cmFuc2ZlcnMSFS5zcGFyay5UcmFuc2ZlckZpbHRlchodLnNwYXJrLlF1ZXJ5VHJhbnNmZXJzUmVzcG9uc2UiABJNChNxdWVyeV9hbGxfdHJhbnNmZXJzEhUuc3BhcmsuVHJhbnNmZXJGaWx0ZXIaHS5zcGFyay5RdWVyeVRyYW5zZmVyc1Jlc3BvbnNlIgASWwoZY2xhaW1fdHJhbnNmZXJfdHdlYWtfa2V5cxIkLnNwYXJrLkNsYWltVHJhbnNmZXJUd2Vha0tleXNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgAScwobY2xhaW1fdHJhbnNmZXJfc2lnbl9yZWZ1bmRzEiYuc3BhcmsuQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVxdWVzdBonLnNwYXJrLkNsYWltVHJhbnNmZXJTaWduUmVmdW5kc1Jlc3BvbnNlIgOIAgESUgoUc3RvcmVfcHJlaW1hZ2Vfc2hhcmUSIC5zcGFyay5TdG9yZVByZWltYWdlU2hhcmVSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgASZgoXZ2V0X3NpZ25pbmdfY29tbWl0bWVudHMSIy5zcGFyay5HZXRTaWduaW5nQ29tbWl0bWVudHNSZXF1ZXN0GiQuc3BhcmsuR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVzcG9uc2UiABJWChBjb29wZXJhdGl2ZV9leGl0Eh0uc3BhcmsuQ29vcGVyYXRpdmVFeGl0UmVxdWVzdBoeLnNwYXJrLkNvb3BlcmF0aXZlRXhpdFJlc3BvbnNlIgOIAgESZgoWaW5pdGlhdGVfcHJlaW1hZ2Vfc3dhcBIiLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdBojLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2UiA4gCARJTChBwcm92aWRlX3ByZWltYWdlEh0uc3BhcmsuUHJvdmlkZVByZWltYWdlUmVxdWVzdBoeLnNwYXJrLlByb3ZpZGVQcmVpbWFnZVJlc3BvbnNlIgASQQoKcXVlcnlfaHRsYxIXLnNwYXJrLlF1ZXJ5SHRsY1JlcXVlc3QaGC5zcGFyay5RdWVyeUh0bGNSZXNwb25zZSIAEk4KD3N0YXJ0X2xlYWZfc3dhcBIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ghwuc3BhcmsuU3RhcnRUcmFuc2ZlclJlc3BvbnNlIgASTwoJbGVhZl9zd2FwEh0uc3BhcmsuQ291bnRlckxlYWZTd2FwUmVxdWVzdBoeLnNwYXJrLkNvdW50ZXJMZWFmU3dhcFJlc3BvbnNlIgOIAgESVwoRY291bnRlcl9sZWFmX3N3YXASHS5zcGFyay5Db3VudGVyTGVhZlN3YXBSZXF1ZXN0Gh4uc3BhcmsuQ291bnRlckxlYWZTd2FwUmVzcG9uc2UiA4gCARJWChByZWZyZXNoX3RpbWVsb2NrEh0uc3BhcmsuUmVmcmVzaFRpbWVsb2NrUmVxdWVzdBoeLnNwYXJrLlJlZnJlc2hUaW1lbG9ja1Jlc3BvbnNlIgOIAgESRwoLZXh0ZW5kX2xlYWYSGC5zcGFyay5FeHRlbmRMZWFmUmVxdWVzdBoZLnNwYXJrLkV4dGVuZExlYWZSZXNwb25zZSIDiAIBEkEKCnJlbmV3X2xlYWYSFy5zcGFyay5SZW5ld0xlYWZSZXF1ZXN0Ghguc3BhcmsuUmVuZXdMZWFmUmVzcG9uc2UiABJcChlnZXRfc2lnbmluZ19vcGVyYXRvcl9saXN0EhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5GiUuc3BhcmsuR2V0U2lnbmluZ09wZXJhdG9yTGlzdFJlc3BvbnNlIgASRAoLcXVlcnlfbm9kZXMSGC5zcGFyay5RdWVyeU5vZGVzUmVxdWVzdBoZLnNwYXJrLlF1ZXJ5Tm9kZXNSZXNwb25zZSIAEmwKGHF1ZXJ5X25vZGVzX2Rpc3RyaWJ1dGlvbhIkLnNwYXJrLlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXF1ZXN0GiUuc3BhcmsuUXVlcnlOb2Rlc0Rpc3RyaWJ1dGlvblJlc3BvbnNlIgOIAgESXgoUcXVlcnlfbm9kZXNfYnlfdmFsdWUSHy5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlcXVlc3QaIC5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlc3BvbnNlIgOIAgESSgoNcXVlcnlfYmFsYW5jZRIaLnNwYXJrLlF1ZXJ5QmFsYW5jZVJlcXVlc3QaGy5zcGFyay5RdWVyeUJhbGFuY2VSZXNwb25zZSIAEmoKGXF1ZXJ5X3VzZXJfc2lnbmVkX3JlZnVuZHMSJC5zcGFyay5RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVxdWVzdBolLnNwYXJrLlF1ZXJ5VXNlclNpZ25lZFJlZnVuZHNSZXNwb25zZSIAEnkKHnF1ZXJ5X3VudXNlZF9kZXBvc2l0X2FkZHJlc3NlcxIpLnNwYXJrLlF1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1JlcXVlc3QaKi5zcGFyay5RdWVyeVVudXNlZERlcG9zaXRBZGRyZXNzZXNSZXNwb25zZSIAEnkKHnF1ZXJ5X3N0YXRpY19kZXBvc2l0X2FkZHJlc3NlcxIpLnNwYXJrLlF1ZXJ5U3RhdGljRGVwb3NpdEFkZHJlc3Nlc1JlcXVlc3QaKi5zcGFyay5RdWVyeVN0YXRpY0RlcG9zaXRBZGRyZXNzZXNSZXNwb25zZSIAElwKE3N1YnNjcmliZV90b19ldmVudHMSHy5zcGFyay5TdWJzY3JpYmVUb0V2ZW50c1JlcXVlc3QaIC5zcGFyay5TdWJzY3JpYmVUb0V2ZW50c1Jlc3BvbnNlIgAwARKGAQojaW5pdGlhdGVfc3RhdGljX2RlcG9zaXRfdXR4b19yZWZ1bmQSLS5zcGFyay5Jbml0aWF0ZVN0YXRpY0RlcG9zaXRVdHhvUmVmdW5kUmVxdWVzdBouLnNwYXJrLkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXNwb25zZSIAEloKEmluaXRpYXRlX3V0eG9fc3dhcBIeLnNwYXJrLkluaXRpYXRlVXR4b1N3YXBSZXF1ZXN0Gh8uc3BhcmsuSW5pdGlhdGVVdHhvU3dhcFJlc3BvbnNlIgOIAgESYQoWZXhpdF9zaW5nbGVfbm9kZV90cmVlcxIhLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0GiIuc3BhcmsuRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlIgASVgoTY29vcGVyYXRpdmVfZXhpdF92MhIdLnNwYXJrLkNvb3BlcmF0aXZlRXhpdFJlcXVlc3QaHi5zcGFyay5Db29wZXJhdGl2ZUV4aXRSZXNwb25zZSIAEkoKDmV4dGVuZF9sZWFmX3YyEhguc3BhcmsuRXh0ZW5kTGVhZlJlcXVlc3QaGS5zcGFyay5FeHRlbmRMZWFmUmVzcG9uc2UiA4gCARJzCh5jbGFpbV90cmFuc2Zlcl9zaWduX3JlZnVuZHNfdjISJi5zcGFyay5DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXF1ZXN0Gicuc3BhcmsuQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVzcG9uc2UiABJsChtmaW5hbGl6ZV9ub2RlX3NpZ25hdHVyZXNfdjISJC5zcGFyay5GaW5hbGl6ZU5vZGVTaWduYXR1cmVzUmVxdWVzdBolLnNwYXJrLkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXNwb25zZSIAEmYKGWluaXRpYXRlX3ByZWltYWdlX3N3YXBfdjISIi5zcGFyay5Jbml0aWF0ZVByZWltYWdlU3dhcFJlcXVlc3QaIy5zcGFyay5Jbml0aWF0ZVByZWltYWdlU3dhcFJlc3BvbnNlIgASZgoZaW5pdGlhdGVfcHJlaW1hZ2Vfc3dhcF92MxIiLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdBojLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2UiABJRChJzdGFydF9sZWFmX3N3YXBfdjISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIAEloKFGNvdW50ZXJfbGVhZl9zd2FwX3YyEh0uc3BhcmsuQ291bnRlckxlYWZTd2FwUmVxdWVzdBoeLnNwYXJrLkNvdW50ZXJMZWFmU3dhcFJlc3BvbnNlIgOIAgESUAoRc3RhcnRfdHJhbnNmZXJfdjISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIAElkKE3JlZnJlc2hfdGltZWxvY2tfdjISHS5zcGFyay5SZWZyZXNoVGltZWxvY2tSZXF1ZXN0Gh4uc3BhcmsuUmVmcmVzaFRpbWVsb2NrUmVzcG9uc2UiA4gCARJeChVnZXRfdXR4b3NfZm9yX2FkZHJlc3MSIC5zcGFyay5HZXRVdHhvc0ZvckFkZHJlc3NSZXF1ZXN0GiEuc3BhcmsuR2V0VXR4b3NGb3JBZGRyZXNzUmVzcG9uc2UiABJdChRxdWVyeV9zcGFya19pbnZvaWNlcxIgLnNwYXJrLlF1ZXJ5U3BhcmtJbnZvaWNlc1JlcXVlc3QaIS5zcGFyay5RdWVyeVNwYXJrSW52b2ljZXNSZXNwb25zZSIAEnkKHmluaXRpYXRlX3N3YXBfcHJpbWFyeV90cmFuc2ZlchIpLnNwYXJrLkluaXRpYXRlU3dhcFByaW1hcnlUcmFuc2ZlclJlcXVlc3QaKi5zcGFyay5Jbml0aWF0ZVN3YXBQcmltYXJ5VHJhbnNmZXJSZXNwb25zZSIAEmAKFXVwZGF0ZV93YWxsZXRfc2V0dGluZxIhLnNwYXJrLlVwZGF0ZVdhbGxldFNldHRpbmdSZXF1ZXN0GiIuc3BhcmsuVXBkYXRlV2FsbGV0U2V0dGluZ1Jlc3BvbnNlIgASXQoUcXVlcnlfd2FsbGV0X3NldHRpbmcSIC5zcGFyay5RdWVyeVdhbGxldFNldHRpbmdSZXF1ZXN0GiEuc3BhcmsuUXVlcnlXYWxsZXRTZXR0aW5nUmVzcG9uc2UiAEIsWipnaXRodWIuY29tL2xpZ2h0c3BhcmtkZXYvc3BhcmsvcHJvdG8vc3BhcmtiBnByb3RvMwqIVQoRc3BhcmtfdG9rZW4ucHJvdG8SC3NwYXJrX3Rva2VuGh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvGgtzcGFyay5wcm90bxoXdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8imwEKElRva2VuT3V0cHV0VG9TcGVuZBJGChtwcmV2X3Rva2VuX3RyYW5zYWN0aW9uX2hhc2gYASABKAxCB/pCBHoCaCBSGHByZXZUb2tlblRyYW5zYWN0aW9uSGFzaBI9ChtwcmV2X3Rva2VuX3RyYW5zYWN0aW9uX3ZvdXQYAiABKA1SGHByZXZUb2tlblRyYW5zYWN0aW9uVm91dCJfChJUb2tlblRyYW5zZmVySW5wdXQSSQoQb3V0cHV0c190b19zcGVuZBgBIAMoCzIfLnNwYXJrX3Rva2VuLlRva2VuT3V0cHV0VG9TcGVuZFIOb3V0cHV0c1RvU3BlbmQikwEKDlRva2VuTWludElucHV0EjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSNwoQdG9rZW5faWRlbnRpZmllchgCIAEoDEIH+kIEegJoIEgAUg90b2tlbklkZW50aWZpZXKIAQFCEwoRX3Rva2VuX2lkZW50aWZpZXIi9gIKEFRva2VuQ3JlYXRlSW5wdXQSMwoRaXNzdWVyX3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSD2lzc3VlclB1YmxpY0tleRImCgp0b2tlbl9uYW1lGAIgASgJQgf6QgRyAhgUUgl0b2tlbk5hbWUSKgoMdG9rZW5fdGlja2VyGAMgASgJQgf6QgRyAhgGUgt0b2tlblRpY2tlchIkCghkZWNpbWFscxgEIAEoDUII+kIFKgMY/wFSCGRlY2ltYWxzEiYKCm1heF9zdXBwbHkYBSABKAxCB/pCBHoCaBBSCW1heFN1cHBseRIhCgxpc19mcmVlemFibGUYBiABKAhSC2lzRnJlZXphYmxlEkkKGmNyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5GAcgASgMQgf6QgR6AmghSABSF2NyZWF0aW9uRW50aXR5UHVibGljS2V5iAEBQh0KG19jcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleSLHBAoLVG9rZW5PdXRwdXQSHQoCaWQYASABKAlCCPpCBXIDsAEBSABSAmlkiAEBEjEKEG93bmVyX3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSDm93bmVyUHVibGljS2V5EkEKFXJldm9jYXRpb25fY29tbWl0bWVudBgDIAEoDEIH+kIEegJoIUgBUhRyZXZvY2F0aW9uQ29tbWl0bWVudIgBARIxChJ3aXRoZHJhd19ib25kX3NhdHMYBCABKARIAlIQd2l0aGRyYXdCb25kU2F0c4gBARJMCiB3aXRoZHJhd19yZWxhdGl2ZV9ibG9ja19sb2NrdGltZRgFIAEoBEgDUh13aXRoZHJhd1JlbGF0aXZlQmxvY2tMb2NrdGltZYgBARI2ChB0b2tlbl9wdWJsaWNfa2V5GAYgASgMQgf6QgR6AmghSARSDnRva2VuUHVibGljS2V5iAEBEjcKEHRva2VuX2lkZW50aWZpZXIYCCABKAxCB/pCBHoCaCBIBVIPdG9rZW5JZGVudGlmaWVyiAEBEioKDHRva2VuX2Ftb3VudBgHIAEoDEIH+kIEegJoEFILdG9rZW5BbW91bnRCBQoDX2lkQhgKFl9yZXZvY2F0aW9uX2NvbW1pdG1lbnRCFQoTX3dpdGhkcmF3X2JvbmRfc2F0c0IjCiFfd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWVCEwoRX3Rva2VuX3B1YmxpY19rZXlCEwoRX3Rva2VuX2lkZW50aWZpZXIingIKElBhcnRpYWxUb2tlbk91dHB1dBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIsChJ3aXRoZHJhd19ib25kX3NhdHMYAiABKARSEHdpdGhkcmF3Qm9uZFNhdHMSRwogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYAyABKARSHXdpdGhkcmF3UmVsYXRpdmVCbG9ja0xvY2t0aW1lEjIKEHRva2VuX2lkZW50aWZpZXIYBCABKAxCB/pCBHoCaCBSD3Rva2VuSWRlbnRpZmllchIqCgx0b2tlbl9hbW91bnQYBSABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50IqMBChBGaW5hbFRva2VuT3V0cHV0ElEKFHBhcnRpYWxfdG9rZW5fb3V0cHV0GAEgASgLMh8uc3BhcmtfdG9rZW4uUGFydGlhbFRva2VuT3V0cHV0UhJwYXJ0aWFsVG9rZW5PdXRwdXQSPAoVcmV2b2NhdGlvbl9jb21taXRtZW50GAIgASgMQgf6QgR6AmghUhRyZXZvY2F0aW9uQ29tbWl0bWVudCKaBgoQVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEjwKCm1pbnRfaW5wdXQYAiABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYAyABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYCCABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0Ej0KDXRva2VuX291dHB1dHMYBCADKAsyGC5zcGFya190b2tlbi5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAUgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSOwoLZXhwaXJ5X3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgpleHBpcnlUaW1lEjIKB25ldHdvcmsYByABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxJUChhjbGllbnRfY3JlYXRlZF90aW1lc3RhbXAYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUhZjbGllbnRDcmVhdGVkVGltZXN0YW1wEk8KE2ludm9pY2VfYXR0YWNobWVudHMYCiADKAsyHi5zcGFya190b2tlbi5JbnZvaWNlQXR0YWNobWVudFISaW52b2ljZUF0dGFjaG1lbnRzEj8KGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYCyABKARIAVIXdmFsaWRpdHlEdXJhdGlvblNlY29uZHOIAQFCDgoMdG9rZW5faW5wdXRzQhwKGl92YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzIpkDChhUb2tlblRyYW5zYWN0aW9uTWV0YWRhdGESWgojc3Bhcmtfb3BlcmF0b3JfaWRlbnRpdHlfcHVibGljX2tleXMYAiADKAxCDPpCCZIBBiIEegJoIVIfc3BhcmtPcGVyYXRvcklkZW50aXR5UHVibGljS2V5cxIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSVAoYY2xpZW50X2NyZWF0ZWRfdGltZXN0YW1wGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIWY2xpZW50Q3JlYXRlZFRpbWVzdGFtcBJGChl2YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzGAUgASgEQgr6QgcyBRisAigBUhd2YWxpZGl0eUR1cmF0aW9uU2Vjb25kcxJPChNpbnZvaWNlX2F0dGFjaG1lbnRzGAYgAygLMh4uc3BhcmtfdG9rZW4uSW52b2ljZUF0dGFjaG1lbnRSEmludm9pY2VBdHRhY2htZW50cyLJAwoXUGFydGlhbFRva2VuVHJhbnNhY3Rpb24SGAoHdmVyc2lvbhgBIAEoDVIHdmVyc2lvbhJjChp0b2tlbl90cmFuc2FjdGlvbl9tZXRhZGF0YRgCIAEoCzIlLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25NZXRhZGF0YVIYdG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhEjwKCm1pbnRfaW5wdXQYAyABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYBCABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYBSABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0ElMKFXBhcnRpYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIfLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlbk91dHB1dFITcGFydGlhbFRva2VuT3V0cHV0c0IOCgx0b2tlbl9pbnB1dHMiwQMKFUZpbmFsVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEmMKGnRva2VuX3RyYW5zYWN0aW9uX21ldGFkYXRhGAIgASgLMiUuc3BhcmtfdG9rZW4uVG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhUhh0b2tlblRyYW5zYWN0aW9uTWV0YWRhdGESPAoKbWludF9pbnB1dBgDIAEoCzIbLnNwYXJrX3Rva2VuLlRva2VuTWludElucHV0SABSCW1pbnRJbnB1dBJICg50cmFuc2Zlcl9pbnB1dBgEIAEoCzIfLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNmZXJJbnB1dEgAUg10cmFuc2ZlcklucHV0EkIKDGNyZWF0ZV9pbnB1dBgFIAEoCzIdLnNwYXJrX3Rva2VuLlRva2VuQ3JlYXRlSW5wdXRIAFILY3JlYXRlSW5wdXQSTQoTZmluYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIdLnNwYXJrX3Rva2VuLkZpbmFsVG9rZW5PdXRwdXRSEWZpbmFsVG9rZW5PdXRwdXRzQg4KDHRva2VuX2lucHV0cyI4ChFJbnZvaWNlQXR0YWNobWVudBIjCg1zcGFya19pbnZvaWNlGAEgASgJUgxzcGFya0ludm9pY2UiXgoSU2lnbmF0dXJlV2l0aEluZGV4EicKCXNpZ25hdHVyZRgBIAEoDEIJ+kIGegQQQBhJUglzaWduYXR1cmUSHwoLaW5wdXRfaW5kZXgYAiABKA1SCmlucHV0SW5kZXgitAEKHklucHV0VHR4b1NpZ25hdHVyZXNQZXJPcGVyYXRvchJICg90dHhvX3NpZ25hdHVyZXMYASADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSDnR0eG9TaWduYXR1cmVzEkgKHG9wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSGW9wZXJhdG9ySWRlbnRpdHlQdWJsaWNLZXki8gIKF1N0YXJ0VHJhbnNhY3Rpb25SZXF1ZXN0EjcKE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5ElkKGXBhcnRpYWxfdG9rZW5fdHJhbnNhY3Rpb24YAiABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJ7CipwYXJ0aWFsX3Rva2VuX3RyYW5zYWN0aW9uX293bmVyX3NpZ25hdHVyZXMYAyADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSJnBhcnRpYWxUb2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzEkYKGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYBCABKARCCvpCBzIFGKwCKAFSF3ZhbGlkaXR5RHVyYXRpb25TZWNvbmRzIq4BChhTdGFydFRyYW5zYWN0aW9uUmVzcG9uc2USVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SOwoNa2V5c2hhcmVfaW5mbxgCIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIMa2V5c2hhcmVJbmZvIvgCChhDb21taXRUcmFuc2FjdGlvblJlcXVlc3QSVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgCIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJ3CiJpbnB1dF90dHhvX3NpZ25hdHVyZXNfcGVyX29wZXJhdG9yGAMgAygLMisuc3BhcmtfdG9rZW4uSW5wdXRUdHhvU2lnbmF0dXJlc1Blck9wZXJhdG9yUh5pbnB1dFR0eG9TaWduYXR1cmVzUGVyT3BlcmF0b3ISQgoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDEIH+kIEegJoIVIWb3duZXJJZGVudGl0eVB1YmxpY0tleSK6AQoOQ29tbWl0UHJvZ3Jlc3MSUQoeY29tbWl0dGVkX29wZXJhdG9yX3B1YmxpY19rZXlzGAEgAygMQgz6QgmSAQYiBHoCaCFSG2NvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cxJVCiB1bmNvbW1pdHRlZF9vcGVyYXRvcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUh11bmNvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cyKhAQoZQ29tbWl0VHJhbnNhY3Rpb25SZXNwb25zZRI+Cg1jb21taXRfc3RhdHVzGAEgASgOMhkuc3BhcmtfdG9rZW4uQ29tbWl0U3RhdHVzUgxjb21taXRTdGF0dXMSRAoPY29tbWl0X3Byb2dyZXNzGAIgASgLMhsuc3BhcmtfdG9rZW4uQ29tbWl0UHJvZ3Jlc3NSDmNvbW1pdFByb2dyZXNzIqYCChtCcm9hZGNhc3RUcmFuc2FjdGlvblJlcXVlc3QSNwoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIRaWRlbnRpdHlQdWJsaWNLZXkSYAoZcGFydGlhbF90b2tlbl90cmFuc2FjdGlvbhgCIAEoCzIkLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJsCiJ0b2tlbl90cmFuc2FjdGlvbl9vd25lcl9zaWduYXR1cmVzGAMgAygLMh8uc3BhcmtfdG9rZW4uU2lnbmF0dXJlV2l0aEluZGV4Uh90b2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzIoACChxCcm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlEloKF2ZpbmFsX3Rva2VuX3RyYW5zYWN0aW9uGAEgASgLMiIuc3BhcmtfdG9rZW4uRmluYWxUb2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SPgoNY29tbWl0X3N0YXR1cxgCIAEoDjIZLnNwYXJrX3Rva2VuLkNvbW1pdFN0YXR1c1IMY29tbWl0U3RhdHVzEkQKD2NvbW1pdF9wcm9ncmVzcxgDIAEoCzIbLnNwYXJrX3Rva2VuLkNvbW1pdFByb2dyZXNzUg5jb21taXRQcm9ncmVzcyKSAQoZUXVlcnlUb2tlbk1ldGFkYXRhUmVxdWVzdBI5ChF0b2tlbl9pZGVudGlmaWVycxgBIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEjoKEmlzc3Vlcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUhBpc3N1ZXJQdWJsaWNLZXlzIqcDCg1Ub2tlbk1ldGFkYXRhEjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBARIyChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggUg90b2tlbklkZW50aWZpZXJCHQobX2NyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5Il8KGlF1ZXJ5VG9rZW5NZXRhZGF0YVJlc3BvbnNlEkEKDnRva2VuX21ldGFkYXRhGAEgAygLMhouc3BhcmtfdG9rZW4uVG9rZW5NZXRhZGF0YVINdG9rZW5NZXRhZGF0YSKsAgoYUXVlcnlUb2tlbk91dHB1dHNSZXF1ZXN0EjgKEW93bmVyX3B1YmxpY19rZXlzGAEgAygMQgz6QgmSAQYiBHoCaCFSD293bmVyUHVibGljS2V5cxI6ChJpc3N1ZXJfcHVibGljX2tleXMYAiADKAxCDPpCCZIBBiIEegJoIVIQaXNzdWVyUHVibGljS2V5cxI5ChF0b2tlbl9pZGVudGlmaWVycxgEIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEigKB25ldHdvcmsYAyABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEjUKDHBhZ2VfcmVxdWVzdBgFIAEoCzISLnNwYXJrLlBhZ2VSZXF1ZXN0UgtwYWdlUmVxdWVzdCKtAwodUXVlcnlUb2tlblRyYW5zYWN0aW9uc1JlcXVlc3QSLAoKb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIJb3V0cHV0SWRzEjgKEW93bmVyX3B1YmxpY19rZXlzGAIgAygMQgz6QgmSAQYiBHoCaCFSD293bmVyUHVibGljS2V5cxI6ChJpc3N1ZXJfcHVibGljX2tleXMYAyADKAxCDPpCCZIBBiIEegJoIVIQaXNzdWVyUHVibGljS2V5cxI5ChF0b2tlbl9pZGVudGlmaWVycxgHIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEkYKGHRva2VuX3RyYW5zYWN0aW9uX2hhc2hlcxgEIAMoDEIM+kIJkgEGIgR6AmggUhZ0b2tlblRyYW5zYWN0aW9uSGFzaGVzEiIKBW9yZGVyGAggASgOMgwuc3BhcmsuT3JkZXJSBW9yZGVyEiAKBWxpbWl0GAUgASgDQgr6QgciBRjoBygAUgVsaW1pdBIfCgZvZmZzZXQYBiABKANCB/pCBCICKABSBm9mZnNldCKmAQoeUXVlcnlUb2tlblRyYW5zYWN0aW9uc1Jlc3BvbnNlEmwKHnRva2VuX3RyYW5zYWN0aW9uc193aXRoX3N0YXR1cxgBIAMoCzInLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25XaXRoU3RhdHVzUht0b2tlblRyYW5zYWN0aW9uc1dpdGhTdGF0dXMSFgoGb2Zmc2V0GAIgASgDUgZvZmZzZXQi1gEKIU91dHB1dFdpdGhQcmV2aW91c1RyYW5zYWN0aW9uRGF0YRIwCgZvdXRwdXQYASABKAsyGC5zcGFya190b2tlbi5Ub2tlbk91dHB1dFIGb3V0cHV0EkMKGXByZXZpb3VzX3RyYW5zYWN0aW9uX2hhc2gYAiABKAxCB/pCBHoCaCBSF3ByZXZpb3VzVHJhbnNhY3Rpb25IYXNoEjoKGXByZXZpb3VzX3RyYW5zYWN0aW9uX3ZvdXQYAyABKA1SF3ByZXZpb3VzVHJhbnNhY3Rpb25Wb3V0ItoBChlRdWVyeVRva2VuT3V0cHV0c1Jlc3BvbnNlEoIBCiZvdXRwdXRzX3dpdGhfcHJldmlvdXNfdHJhbnNhY3Rpb25fZGF0YRgBIAMoCzIuLnNwYXJrX3Rva2VuLk91dHB1dFdpdGhQcmV2aW91c1RyYW5zYWN0aW9uRGF0YVIib3V0cHV0c1dpdGhQcmV2aW91c1RyYW5zYWN0aW9uRGF0YRI4Cg1wYWdlX3Jlc3BvbnNlGAIgASgLMhMuc3BhcmsuUGFnZVJlc3BvbnNlUgxwYWdlUmVzcG9uc2UiZAoYU3BlbnRUb2tlbk91dHB1dE1ldGFkYXRhEhsKCW91dHB1dF9pZBgBIAEoCVIIb3V0cHV0SWQSKwoRcmV2b2NhdGlvbl9zZWNyZXQYAiABKAxSEHJldm9jYXRpb25TZWNyZXQijgEKJFRva2VuVHJhbnNhY3Rpb25Db25maXJtYXRpb25NZXRhZGF0YRJmChxzcGVudF90b2tlbl9vdXRwdXRzX21ldGFkYXRhGAEgAygLMiUuc3BhcmtfdG9rZW4uU3BlbnRUb2tlbk91dHB1dE1ldGFkYXRhUhlzcGVudFRva2VuT3V0cHV0c01ldGFkYXRhIswCChpUb2tlblRyYW5zYWN0aW9uV2l0aFN0YXR1cxJKChF0b2tlbl90cmFuc2FjdGlvbhgBIAEoCzIdLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25SEHRva2VuVHJhbnNhY3Rpb24SOwoGc3RhdHVzGAIgASgOMiMuc3BhcmtfdG9rZW4uVG9rZW5UcmFuc2FjdGlvblN0YXR1c1IGc3RhdHVzEmYKFWNvbmZpcm1hdGlvbl9tZXRhZGF0YRgDIAEoCzIxLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25Db25maXJtYXRpb25NZXRhZGF0YVIUY29uZmlybWF0aW9uTWV0YWRhdGESPQoWdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgEIAEoDEIH+kIEegJoIFIUdG9rZW5UcmFuc2FjdGlvbkhhc2girAMKE0ZyZWV6ZVRva2Vuc1BheWxvYWQSGAoHdmVyc2lvbhgBIAEoDVIHdmVyc2lvbhIxChBvd25lcl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRI2ChB0b2tlbl9wdWJsaWNfa2V5GAMgASgMQgf6QgR6AmghSABSDnRva2VuUHVibGljS2V5iAEBEjcKEHRva2VuX2lkZW50aWZpZXIYBCABKAxCB/pCBHoCaCBIAVIPdG9rZW5JZGVudGlmaWVyiAEBEjoKGWlzc3Vlcl9wcm92aWRlZF90aW1lc3RhbXAYBSABKARSF2lzc3VlclByb3ZpZGVkVGltZXN0YW1wEkgKHG9wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXkYBiABKAxCB/pCBHoCaCFSGW9wZXJhdG9ySWRlbnRpdHlQdWJsaWNLZXkSJwoPc2hvdWxkX3VuZnJlZXplGAcgASgIUg5zaG91bGRVbmZyZWV6ZUITChFfdG9rZW5fcHVibGljX2tleUITChFfdG9rZW5faWRlbnRpZmllciKhAQoTRnJlZXplVG9rZW5zUmVxdWVzdBJUChVmcmVlemVfdG9rZW5zX3BheWxvYWQYASABKAsyIC5zcGFya190b2tlbi5GcmVlemVUb2tlbnNQYXlsb2FkUhNmcmVlemVUb2tlbnNQYXlsb2FkEjQKEGlzc3Vlcl9zaWduYXR1cmUYAiABKAxCCfpCBnoEEEAYSVIPaXNzdWVyU2lnbmF0dXJlIokBChRGcmVlemVUb2tlbnNSZXNwb25zZRI9ChNpbXBhY3RlZF9vdXRwdXRfaWRzGAEgAygJQg36QgqSAQciBXIDsAEBUhFpbXBhY3RlZE91dHB1dElkcxIyChVpbXBhY3RlZF90b2tlbl9hbW91bnQYAiABKAxSE2ltcGFjdGVkVG9rZW5BbW91bnQqpwEKFFRva2VuVHJhbnNhY3Rpb25UeXBlEiYKIlRPS0VOX1RSQU5TQUNUSU9OX1RZUEVfVU5TUEVDSUZJRUQQABIhCh1UT0tFTl9UUkFOU0FDVElPTl9UWVBFX0NSRUFURRABEh8KG1RPS0VOX1RSQU5TQUNUSU9OX1RZUEVfTUlOVBACEiMKH1RPS0VOX1RSQU5TQUNUSU9OX1RZUEVfVFJBTlNGRVIQAypTCgxDb21taXRTdGF0dXMSFgoSQ09NTUlUX1VOU1BFQ0lGSUVEEAASFQoRQ09NTUlUX1BST0NFU1NJTkcQARIUChBDT01NSVRfRklOQUxJWkVEEAIqhgIKFlRva2VuVHJhbnNhY3Rpb25TdGF0dXMSHQoZVE9LRU5fVFJBTlNBQ1RJT05fU1RBUlRFRBAAEhwKGFRPS0VOX1RSQU5TQUNUSU9OX1NJR05FRBABEh4KGlRPS0VOX1RSQU5TQUNUSU9OX1JFVkVBTEVEEAUSHwobVE9LRU5fVFJBTlNBQ1RJT05fRklOQUxJWkVEEAISJwojVE9LRU5fVFJBTlNBQ1RJT05fU1RBUlRFRF9DQU5DRUxMRUQQAxImCiJUT0tFTl9UUkFOU0FDVElPTl9TSUdORURfQ0FOQ0VMTEVEEAQSHQoZVE9LRU5fVFJBTlNBQ1RJT05fVU5LTk9XThAKMvAFChFTcGFya1Rva2VuU2VydmljZRJiChFzdGFydF90cmFuc2FjdGlvbhIkLnNwYXJrX3Rva2VuLlN0YXJ0VHJhbnNhY3Rpb25SZXF1ZXN0GiUuc3BhcmtfdG9rZW4uU3RhcnRUcmFuc2FjdGlvblJlc3BvbnNlIgASZQoSY29tbWl0X3RyYW5zYWN0aW9uEiUuc3BhcmtfdG9rZW4uQ29tbWl0VHJhbnNhY3Rpb25SZXF1ZXN0GiYuc3BhcmtfdG9rZW4uQ29tbWl0VHJhbnNhY3Rpb25SZXNwb25zZSIAEmkKFHF1ZXJ5X3Rva2VuX21ldGFkYXRhEiYuc3BhcmtfdG9rZW4uUXVlcnlUb2tlbk1ldGFkYXRhUmVxdWVzdBonLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5NZXRhZGF0YVJlc3BvbnNlIgASdQoYcXVlcnlfdG9rZW5fdHJhbnNhY3Rpb25zEiouc3BhcmtfdG9rZW4uUXVlcnlUb2tlblRyYW5zYWN0aW9uc1JlcXVlc3QaKy5zcGFya190b2tlbi5RdWVyeVRva2VuVHJhbnNhY3Rpb25zUmVzcG9uc2UiABJmChNxdWVyeV90b2tlbl9vdXRwdXRzEiUuc3BhcmtfdG9rZW4uUXVlcnlUb2tlbk91dHB1dHNSZXF1ZXN0GiYuc3BhcmtfdG9rZW4uUXVlcnlUb2tlbk91dHB1dHNSZXNwb25zZSIAElYKDWZyZWV6ZV90b2tlbnMSIC5zcGFya190b2tlbi5GcmVlemVUb2tlbnNSZXF1ZXN0GiEuc3BhcmtfdG9rZW4uRnJlZXplVG9rZW5zUmVzcG9uc2UiABJuChVicm9hZGNhc3RfdHJhbnNhY3Rpb24SKC5zcGFya190b2tlbi5Ccm9hZGNhc3RUcmFuc2FjdGlvblJlcXVlc3QaKS5zcGFya190b2tlbi5Ccm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlIgBCMlowZ2l0aHViLmNvbS9saWdodHNwYXJrZGV2L3NwYXJrL3Byb3RvL3NwYXJrX3Rva2VuYgZwcm90bzMKpQQKCm1vY2sucHJvdG8SBG1vY2saG2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byJAChtDbGVhblVwUHJlaW1hZ2VTaGFyZVJlcXVlc3QSIQoMcGF5bWVudF9oYXNoGAEgASgMUgtwYXltZW50SGFzaCJNChhVcGRhdGVOb2Rlc1N0YXR1c1JlcXVlc3QSGQoIbm9kZV9pZHMYASADKAlSB25vZGVJZHMSFgoGc3RhdHVzGAIgASgJUgZzdGF0dXMiMQoSVHJpZ2dlclRhc2tSZXF1ZXN0EhsKCXRhc2tfbmFtZRgBIAEoCVIIdGFza05hbWUy+gEKC01vY2tTZXJ2aWNlElYKF2NsZWFuX3VwX3ByZWltYWdlX3NoYXJlEiEubW9jay5DbGVhblVwUHJlaW1hZ2VTaGFyZVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiABJPChN1cGRhdGVfbm9kZXNfc3RhdHVzEh4ubW9jay5VcGRhdGVOb2Rlc1N0YXR1c1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiABJCCgx0cmlnZ2VyX3Rhc2sSGC5tb2NrLlRyaWdnZXJUYXNrUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIAQitaKWdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9tb2NrYgZwcm90bzMK6gcKEXNwYXJrX2F1dGhuLnByb3RvEgtzcGFya19hdXRobiJ4CglDaGFsbGVuZ2USGAoHdmVyc2lvbhgBIAEoBVIHdmVyc2lvbhIcCgl0aW1lc3RhbXAYAiABKANSCXRpbWVzdGFtcBIUCgVub25jZRgDIAEoDFIFbm9uY2USHQoKcHVibGljX2tleRgEIAEoDFIJcHVibGljS2V5IoUBChJQcm90ZWN0ZWRDaGFsbGVuZ2USGAoHdmVyc2lvbhgBIAEoBVIHdmVyc2lvbhI0CgljaGFsbGVuZ2UYAiABKAsyFi5zcGFya19hdXRobi5DaGFsbGVuZ2VSCWNoYWxsZW5nZRIfCgtzZXJ2ZXJfaG1hYxgDIAEoDFIKc2VydmVySG1hYyI0ChNHZXRDaGFsbGVuZ2VSZXF1ZXN0Eh0KCnB1YmxpY19rZXkYASABKAxSCXB1YmxpY0tleSJoChRHZXRDaGFsbGVuZ2VSZXNwb25zZRJQChNwcm90ZWN0ZWRfY2hhbGxlbmdlGAEgASgLMh8uc3BhcmtfYXV0aG4uUHJvdGVjdGVkQ2hhbGxlbmdlUhJwcm90ZWN0ZWRDaGFsbGVuZ2UipwEKFlZlcmlmeUNoYWxsZW5nZVJlcXVlc3QSUAoTcHJvdGVjdGVkX2NoYWxsZW5nZRgBIAEoCzIfLnNwYXJrX2F1dGhuLlByb3RlY3RlZENoYWxsZW5nZVIScHJvdGVjdGVkQ2hhbGxlbmdlEhwKCXNpZ25hdHVyZRgCIAEoDFIJc2lnbmF0dXJlEh0KCnB1YmxpY19rZXkYAyABKAxSCXB1YmxpY0tleSJxChdWZXJpZnlDaGFsbGVuZ2VSZXNwb25zZRIjCg1zZXNzaW9uX3Rva2VuGAEgASgJUgxzZXNzaW9uVG9rZW4SMQoUZXhwaXJhdGlvbl90aW1lc3RhbXAYAiABKANSE2V4cGlyYXRpb25UaW1lc3RhbXAyzAEKEVNwYXJrQXV0aG5TZXJ2aWNlElYKDWdldF9jaGFsbGVuZ2USIC5zcGFya19hdXRobi5HZXRDaGFsbGVuZ2VSZXF1ZXN0GiEuc3BhcmtfYXV0aG4uR2V0Q2hhbGxlbmdlUmVzcG9uc2UiABJfChB2ZXJpZnlfY2hhbGxlbmdlEiMuc3BhcmtfYXV0aG4uVmVyaWZ5Q2hhbGxlbmdlUmVxdWVzdBokLnNwYXJrX2F1dGhuLlZlcmlmeUNoYWxsZW5nZVJlc3BvbnNlIgBCMlowZ2l0aHViLmNvbS9saWdodHNwYXJrZGV2L3NwYXJrL3Byb3RvL3NwYXJrX2F1dGhuYgZwcm90bzM=";
8878
+ var SPARK_DESCRIPTORS_BASE64 = "Cv8BCh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvEg9nb29nbGUucHJvdG9idWYiOwoJVGltZXN0YW1wEhgKB3NlY29uZHMYASABKANSB3NlY29uZHMSFAoFbmFub3MYAiABKAVSBW5hbm9zQoUBChNjb20uZ29vZ2xlLnByb3RvYnVmQg5UaW1lc3RhbXBQcm90b1ABWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi90aW1lc3RhbXBwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCr4BChtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIHCgVFbXB0eUJ9ChNjb20uZ29vZ2xlLnByb3RvYnVmQgpFbXB0eVByb3RvUAFaLmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2VtcHR5cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqIYAogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJbChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUqDAiA7Mr/ARCB7Mr/ASKYBQoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIyCgdlZGl0aW9uGA4gASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQizAQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SNwoIZmVhdHVyZXMYMiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSbQoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFREIDiAECUgx2ZXJpZmljYXRpb24alAEKC0RlY2xhcmF0aW9uEhYKBm51bWJlchgBIAEoBVIGbnVtYmVyEhsKCWZ1bGxfbmFtZRgCIAEoCVIIZnVsbE5hbWUSEgoEdHlwZRgDIAEoCVIEdHlwZRIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkSgQIBBAFIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUEVBVEVEEAMSEgoOTEFCRUxfUkVRVUlSRUQQAiJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIq0JCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlEjcKCGZlYXR1cmVzGDIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgqECtKBAgmECdSFHBocF9nZW5lcmljX3NlcnZpY2VzIvQDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAwgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoinQ0KDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJXChBlZGl0aW9uX2RlZmF1bHRzGBQgAygLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdFIPZWRpdGlvbkRlZmF1bHRzEjcKCGZlYXR1cmVzGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElUKD2ZlYXR1cmVfc3VwcG9ydBgWIAEoCzIsLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRmVhdHVyZVN1cHBvcnRSDmZlYXR1cmVTdXBwb3J0ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uGloKDkVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUalgIKDkZlYXR1cmVTdXBwb3J0EkcKEmVkaXRpb25faW50cm9kdWNlZBgBIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uSW50cm9kdWNlZBJHChJlZGl0aW9uX2RlcHJlY2F0ZWQYAiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIRZWRpdGlvbkRlcHJlY2F0ZWQSLwoTZGVwcmVjYXRpb25fd2FybmluZxgDIAEoCVISZGVwcmVjYXRpb25XYXJuaW5nEkEKD2VkaXRpb25fcmVtb3ZlZBgEIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5lZGl0aW9uUmVtb3ZlZCIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFSgQIEhATIqwBCgxPbmVvZk9wdGlvbnMSNwoIZmVhdHVyZXMYASABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLRAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYi2AIKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSNwoIZmVhdHVyZXMYAiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSKAoMZGVidWdfcmVkYWN0GAMgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSVQoPZmVhdHVyZV9zdXBwb3J0GAQgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLVAQoOU2VydmljZU9wdGlvbnMSNwoIZmVhdHVyZXMYIiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKZAwoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSNwoIZmVhdHVyZXMYIyABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiKnCgoKRmVhdHVyZVNldBKRAQoOZmllbGRfcHJlc2VuY2UYASABKA4yKS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlQj+IAQGYAQSYAQGiAQ0SCEVYUExJQ0lUGIQHogENEghJTVBMSUNJVBjnB6IBDRIIRVhQTElDSVQY6AeyAQMI6AdSDWZpZWxkUHJlc2VuY2USbAoJZW51bV90eXBlGAIgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGVCKYgBAZgBBpgBAaIBCxIGQ0xPU0VEGIQHogEJEgRPUEVOGOcHsgEDCOgHUghlbnVtVHlwZRKYAQoXcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmcYAyABKA4yMS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5SZXBlYXRlZEZpZWxkRW5jb2RpbmdCLYgBAZgBBJgBAaIBDRIIRVhQQU5ERUQYhAeiAQsSBlBBQ0tFRBjnB7IBAwjoB1IVcmVwZWF0ZWRGaWVsZEVuY29kaW5nEn4KD3V0ZjhfdmFsaWRhdGlvbhgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uQimIAQGYAQSYAQGiAQkSBE5PTkUYhAeiAQsSBlZFUklGWRjnB7IBAwjoB1IOdXRmOFZhbGlkYXRpb24SfgoQbWVzc2FnZV9lbmNvZGluZxgFIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lk1lc3NhZ2VFbmNvZGluZ0ImiAEBmAEEmAEBogEUEg9MRU5HVEhfUFJFRklYRUQYhAeyAQMI6AdSD21lc3NhZ2VFbmNvZGluZxKCAQoLanNvbl9mb3JtYXQYBiABKA4yJi5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0QjmIAQGYAQOYAQaYAQGiARcSEkxFR0FDWV9CRVNUX0VGRk9SVBiEB6IBChIFQUxMT1cY5weyAQMI6AdSCmpzb25Gb3JtYXQiXAoNRmllbGRQcmVzZW5jZRIaChZGSUVMRF9QUkVTRU5DRV9VTktOT1dOEAASDAoIRVhQTElDSVQQARIMCghJTVBMSUNJVBACEhMKD0xFR0FDWV9SRVFVSVJFRBADIjcKCEVudW1UeXBlEhUKEUVOVU1fVFlQRV9VTktOT1dOEAASCAoET1BFThABEgoKBkNMT1NFRBACIlYKFVJlcGVhdGVkRmllbGRFbmNvZGluZxIjCh9SRVBFQVRFRF9GSUVMRF9FTkNPRElOR19VTktOT1dOEAASCgoGUEFDS0VEEAESDAoIRVhQQU5ERUQQAiJJCg5VdGY4VmFsaWRhdGlvbhIbChdVVEY4X1ZBTElEQVRJT05fVU5LTk9XThAAEgoKBlZFUklGWRACEggKBE5PTkUQAyIECAEQASJTCg9NZXNzYWdlRW5jb2RpbmcSHAoYTUVTU0FHRV9FTkNPRElOR19VTktOT1dOEAASEwoPTEVOR1RIX1BSRUZJWEVEEAESDQoJREVMSU1JVEVEEAIiSAoKSnNvbkZvcm1hdBIXChNKU09OX0ZPUk1BVF9VTktOT1dOEAASCQoFQUxMT1cQARIWChJMRUdBQ1lfQkVTVF9FRkZPUlQQAioGCOgHEItOKgYIi04QkE4qBgiQThCRTkoGCOcHEOgHIu8DChJGZWF0dXJlU2V0RGVmYXVsdHMSWAoIZGVmYXVsdHMYASADKAsyPC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdFIIZGVmYXVsdHMSQQoPbWluaW11bV9lZGl0aW9uGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1pbmltdW1FZGl0aW9uEkEKD21heGltdW1fZWRpdGlvbhgFIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5tYXhpbXVtRWRpdGlvbhr4AQoYRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhJOChRvdmVycmlkYWJsZV9mZWF0dXJlcxgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UhNvdmVycmlkYWJsZUZlYXR1cmVzEkIKDmZpeGVkX2ZlYXR1cmVzGAUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSDWZpeGVkRmVhdHVyZXNKBAgBEAJKBAgCEANSCGZlYXR1cmVzIrUCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyoMCIDsyv8BEIHsyv8BItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////B0J+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCvsBCh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI6CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINRHVyYXRpb25Qcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKrzEKF3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvEgh2YWxpZGF0ZRogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byLICAoKRmllbGRSdWxlcxIwCgdtZXNzYWdlGBEgASgLMhYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlEiwKBWZsb2F0GAEgASgLMhQudmFsaWRhdGUuRmxvYXRSdWxlc0gAUgVmbG9hdBIvCgZkb3VibGUYAiABKAsyFS52YWxpZGF0ZS5Eb3VibGVSdWxlc0gAUgZkb3VibGUSLAoFaW50MzIYAyABKAsyFC52YWxpZGF0ZS5JbnQzMlJ1bGVzSABSBWludDMyEiwKBWludDY0GAQgASgLMhQudmFsaWRhdGUuSW50NjRSdWxlc0gAUgVpbnQ2NBIvCgZ1aW50MzIYBSABKAsyFS52YWxpZGF0ZS5VSW50MzJSdWxlc0gAUgZ1aW50MzISLwoGdWludDY0GAYgASgLMhUudmFsaWRhdGUuVUludDY0UnVsZXNIAFIGdWludDY0Ei8KBnNpbnQzMhgHIAEoCzIVLnZhbGlkYXRlLlNJbnQzMlJ1bGVzSABSBnNpbnQzMhIvCgZzaW50NjQYCCABKAsyFS52YWxpZGF0ZS5TSW50NjRSdWxlc0gAUgZzaW50NjQSMgoHZml4ZWQzMhgJIAEoCzIWLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAUgdmaXhlZDMyEjIKB2ZpeGVkNjQYCiABKAsyFi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIAFIHZml4ZWQ2NBI1CghzZml4ZWQzMhgLIAEoCzIXLnZhbGlkYXRlLlNGaXhlZDMyUnVsZXNIAFIIc2ZpeGVkMzISNQoIc2ZpeGVkNjQYDCABKAsyFy52YWxpZGF0ZS5TRml4ZWQ2NFJ1bGVzSABSCHNmaXhlZDY0EikKBGJvb2wYDSABKAsyEy52YWxpZGF0ZS5Cb29sUnVsZXNIAFIEYm9vbBIvCgZzdHJpbmcYDiABKAsyFS52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAUgZzdHJpbmcSLAoFYnl0ZXMYDyABKAsyFC52YWxpZGF0ZS5CeXRlc1J1bGVzSABSBWJ5dGVzEikKBGVudW0YECABKAsyEy52YWxpZGF0ZS5FbnVtUnVsZXNIAFIEZW51bRI1CghyZXBlYXRlZBgSIAEoCzIXLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIAFIIcmVwZWF0ZWQSJgoDbWFwGBMgASgLMhIudmFsaWRhdGUuTWFwUnVsZXNIAFIDbWFwEiYKA2FueRgUIAEoCzISLnZhbGlkYXRlLkFueVJ1bGVzSABSA2FueRI1CghkdXJhdGlvbhgVIAEoCzIXLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIAFIIZHVyYXRpb24SOAoJdGltZXN0YW1wGBYgASgLMhgudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAFIJdGltZXN0YW1wQgYKBHR5cGUisAEKCkZsb2F0UnVsZXMSFAoFY29uc3QYASABKAJSBWNvbnN0Eg4KAmx0GAIgASgCUgJsdBIQCgNsdGUYAyABKAJSA2x0ZRIOCgJndBgEIAEoAlICZ3QSEAoDZ3RlGAUgASgCUgNndGUSDgoCaW4YBiADKAJSAmluEhUKBm5vdF9pbhgHIAMoAlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKxAQoLRG91YmxlUnVsZXMSFAoFY29uc3QYASABKAFSBWNvbnN0Eg4KAmx0GAIgASgBUgJsdBIQCgNsdGUYAyABKAFSA2x0ZRIOCgJndBgEIAEoAVICZ3QSEAoDZ3RlGAUgASgBUgNndGUSDgoCaW4YBiADKAFSAmluEhUKBm5vdF9pbhgHIAMoAVIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKwAQoKSW50MzJSdWxlcxIUCgVjb25zdBgBIAEoBVIFY29uc3QSDgoCbHQYAiABKAVSAmx0EhAKA2x0ZRgDIAEoBVIDbHRlEg4KAmd0GAQgASgFUgJndBIQCgNndGUYBSABKAVSA2d0ZRIOCgJpbhgGIAMoBVICaW4SFQoGbm90X2luGAcgAygFUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrABCgpJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgDUgVjb25zdBIOCgJsdBgCIAEoA1ICbHQSEAoDbHRlGAMgASgDUgNsdGUSDgoCZ3QYBCABKANSAmd0EhAKA2d0ZRgFIAEoA1IDZ3RlEg4KAmluGAYgAygDUgJpbhIVCgZub3RfaW4YByADKANSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgNUgVjb25zdBIOCgJsdBgCIAEoDVICbHQSEAoDbHRlGAMgASgNUgNsdGUSDgoCZ3QYBCABKA1SAmd0EhAKA2d0ZRgFIAEoDVIDZ3RlEg4KAmluGAYgAygNUgJpbhIVCgZub3RfaW4YByADKA1SBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgEUgVjb25zdBIOCgJsdBgCIAEoBFICbHQSEAoDbHRlGAMgASgEUgNsdGUSDgoCZ3QYBCABKARSAmd0EhAKA2d0ZRgFIAEoBFIDZ3RlEg4KAmluGAYgAygEUgJpbhIVCgZub3RfaW4YByADKARSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgRUgVjb25zdBIOCgJsdBgCIAEoEVICbHQSEAoDbHRlGAMgASgRUgNsdGUSDgoCZ3QYBCABKBFSAmd0EhAKA2d0ZRgFIAEoEVIDZ3RlEg4KAmluGAYgAygRUgJpbhIVCgZub3RfaW4YByADKBFSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgSUgVjb25zdBIOCgJsdBgCIAEoElICbHQSEAoDbHRlGAMgASgSUgNsdGUSDgoCZ3QYBCABKBJSAmd0EhAKA2d0ZRgFIAEoElIDZ3RlEg4KAmluGAYgAygSUgJpbhIVCgZub3RfaW4YByADKBJSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisgEKDEZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoB1IFY29uc3QSDgoCbHQYAiABKAdSAmx0EhAKA2x0ZRgDIAEoB1IDbHRlEg4KAmd0GAQgASgHUgJndBIQCgNndGUYBSABKAdSA2d0ZRIOCgJpbhgGIAMoB1ICaW4SFQoGbm90X2luGAcgAygHUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrIBCgxGaXhlZDY0UnVsZXMSFAoFY29uc3QYASABKAZSBWNvbnN0Eg4KAmx0GAIgASgGUgJsdBIQCgNsdGUYAyABKAZSA2x0ZRIOCgJndBgEIAEoBlICZ3QSEAoDZ3RlGAUgASgGUgNndGUSDgoCaW4YBiADKAZSAmluEhUKBm5vdF9pbhgHIAMoBlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKzAQoNU0ZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoD1IFY29uc3QSDgoCbHQYAiABKA9SAmx0EhAKA2x0ZRgDIAEoD1IDbHRlEg4KAmd0GAQgASgPUgJndBIQCgNndGUYBSABKA9SA2d0ZRIOCgJpbhgGIAMoD1ICaW4SFQoGbm90X2luGAcgAygPUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrMBCg1TRml4ZWQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgQUgVjb25zdBIOCgJsdBgCIAEoEFICbHQSEAoDbHRlGAMgASgQUgNsdGUSDgoCZ3QYBCABKBBSAmd0EhAKA2d0ZRgFIAEoEFIDZ3RlEg4KAmluGAYgAygQUgJpbhIVCgZub3RfaW4YByADKBBSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkiIQoJQm9vbFJ1bGVzEhQKBWNvbnN0GAEgASgIUgVjb25zdCLUBQoLU3RyaW5nUnVsZXMSFAoFY29uc3QYASABKAlSBWNvbnN0EhAKA2xlbhgTIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGwoJbGVuX2J5dGVzGBQgASgEUghsZW5CeXRlcxIbCgltaW5fYnl0ZXMYBCABKARSCG1pbkJ5dGVzEhsKCW1heF9ieXRlcxgFIAEoBFIIbWF4Qnl0ZXMSGAoHcGF0dGVybhgGIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYByABKAlSBnByZWZpeBIWCgZzdWZmaXgYCCABKAlSBnN1ZmZpeBIaCghjb250YWlucxgJIAEoCVIIY29udGFpbnMSIQoMbm90X2NvbnRhaW5zGBcgASgJUgtub3RDb250YWlucxIOCgJpbhgKIAMoCVICaW4SFQoGbm90X2luGAsgAygJUgVub3RJbhIWCgVlbWFpbBgMIAEoCEgAUgVlbWFpbBIcCghob3N0bmFtZRgNIAEoCEgAUghob3N0bmFtZRIQCgJpcBgOIAEoCEgAUgJpcBIUCgRpcHY0GA8gASgISABSBGlwdjQSFAoEaXB2NhgQIAEoCEgAUgRpcHY2EhIKA3VyaRgRIAEoCEgAUgN1cmkSGQoHdXJpX3JlZhgSIAEoCEgAUgZ1cmlSZWYSGgoHYWRkcmVzcxgVIAEoCEgAUgdhZGRyZXNzEhQKBHV1aWQYFiABKAhIAFIEdXVpZBJAChB3ZWxsX2tub3duX3JlZ2V4GBggASgOMhQudmFsaWRhdGUuS25vd25SZWdleEgAUg53ZWxsS25vd25SZWdleBIcCgZzdHJpY3QYGSABKAg6BHRydWVSBnN0cmljdBIhCgxpZ25vcmVfZW1wdHkYGiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24i4gIKCkJ5dGVzUnVsZXMSFAoFY29uc3QYASABKAxSBWNvbnN0EhAKA2xlbhgNIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGAoHcGF0dGVybhgEIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYBSABKAxSBnByZWZpeBIWCgZzdWZmaXgYBiABKAxSBnN1ZmZpeBIaCghjb250YWlucxgHIAEoDFIIY29udGFpbnMSDgoCaW4YCCADKAxSAmluEhUKBm5vdF9pbhgJIAMoDFIFbm90SW4SEAoCaXAYCiABKAhIAFICaXASFAoEaXB2NBgLIAEoCEgAUgRpcHY0EhQKBGlwdjYYDCABKAhIAFIEaXB2NhIhCgxpZ25vcmVfZW1wdHkYDiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24iawoJRW51bVJ1bGVzEhQKBWNvbnN0GAEgASgFUgVjb25zdBIhCgxkZWZpbmVkX29ubHkYAiABKAhSC2RlZmluZWRPbmx5Eg4KAmluGAMgAygFUgJpbhIVCgZub3RfaW4YBCADKAVSBW5vdEluIj4KDE1lc3NhZ2VSdWxlcxISCgRza2lwGAEgASgIUgRza2lwEhoKCHJlcXVpcmVkGAIgASgIUghyZXF1aXJlZCKwAQoNUmVwZWF0ZWRSdWxlcxIbCgltaW5faXRlbXMYASABKARSCG1pbkl0ZW1zEhsKCW1heF9pdGVtcxgCIAEoBFIIbWF4SXRlbXMSFgoGdW5pcXVlGAMgASgIUgZ1bmlxdWUSKgoFaXRlbXMYBCABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVpdGVtcxIhCgxpZ25vcmVfZW1wdHkYBSABKAhSC2lnbm9yZUVtcHR5ItwBCghNYXBSdWxlcxIbCgltaW5fcGFpcnMYASABKARSCG1pblBhaXJzEhsKCW1heF9wYWlycxgCIAEoBFIIbWF4UGFpcnMSGwoJbm9fc3BhcnNlGAMgASgIUghub1NwYXJzZRIoCgRrZXlzGAQgASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IEa2V5cxIsCgZ2YWx1ZXMYBSABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgZ2YWx1ZXMSIQoMaWdub3JlX2VtcHR5GAYgASgIUgtpZ25vcmVFbXB0eSJNCghBbnlSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSDgoCaW4YAiADKAlSAmluEhUKBm5vdF9pbhgDIAMoCVIFbm90SW4i6QIKDUR1cmF0aW9uUnVsZXMSGgoIcmVxdWlyZWQYASABKAhSCHJlcXVpcmVkEi8KBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgVjb25zdBIpCgJsdBgDIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblICbHQSKwoDbHRlGAQgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgNsdGUSKQoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SAmd0EisKA2d0ZRgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIDZ3RlEikKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgJpbhIwCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SBW5vdEluIvMCCg5UaW1lc3RhbXBSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSMAoFY29uc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgVjb25zdBIqCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmx0EiwKA2x0ZRgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2x0ZRIqCgJndBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmd0EiwKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2d0ZRIVCgZsdF9ub3cYByABKAhSBWx0Tm93EhUKBmd0X25vdxgIIAEoCFIFZ3ROb3cSMQoGd2l0aGluGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgZ3aXRoaW4qRgoKS25vd25SZWdleBILCgdVTktOT1dOEAASFAoQSFRUUF9IRUFERVJfTkFNRRABEhUKEUhUVFBfSEVBREVSX1ZBTFVFEAI6PAoIZGlzYWJsZWQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYrwggASgIUghkaXNhYmxlZDo6CgdpZ25vcmVkEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGLAIIAEoCFIHaWdub3JlZDo6CghyZXF1aXJlZBIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMYrwggASgIUghyZXF1aXJlZDpKCgVydWxlcxIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYrwggASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IFcnVsZXNCUAoaaW8uZW52b3lwcm94eS5wZ3YudmFsaWRhdGVaMmdpdGh1Yi5jb20vZW52b3lwcm94eS9wcm90b2MtZ2VuLXZhbGlkYXRlL3ZhbGlkYXRlCrcDCgxjb21tb24ucHJvdG8SBmNvbW1vbiKHAQoKUGFja2FnZU1hcBI8CghwYWNrYWdlcxgBIAMoCzIgLmNvbW1vbi5QYWNrYWdlTWFwLlBhY2thZ2VzRW50cnlSCHBhY2thZ2VzGjsKDVBhY2thZ2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJFChFTaWduaW5nQ29tbWl0bWVudBIWCgZoaWRpbmcYASABKAxSBmhpZGluZxIYCgdiaW5kaW5nGAIgASgMUgdiaW5kaW5nIjgKDVNpZ25pbmdSZXN1bHQSJwoPc2lnbmF0dXJlX3NoYXJlGAEgASgMUg5zaWduYXR1cmVTaGFyZSpdCg9TaWduYXR1cmVJbnRlbnQSDAoIQ1JFQVRJT04QABIMCghUUkFOU0ZFUhABEg0KCUFHR1JFR0FURRACEg8KB1JFRlJFU0gQAxoCCAESDgoGRVhURU5EEAQaAggBQi1aK2dpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9jb21tb25iBnByb3RvMwq/rgIKC3NwYXJrLnByb3RvEgVzcGFyaxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxobZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvGhd2YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxoMY29tbW9uLnByb3RvIkoKGFN1YnNjcmliZVRvRXZlbnRzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAogASgMUhFpZGVudGl0eVB1YmxpY0tleSLAAQoZU3Vic2NyaWJlVG9FdmVudHNSZXNwb25zZRIyCgh0cmFuc2ZlchgBIAEoCzIULnNwYXJrLlRyYW5zZmVyRXZlbnRIAFIIdHJhbnNmZXISLwoHZGVwb3NpdBgCIAEoCzITLnNwYXJrLkRlcG9zaXRFdmVudEgAUgdkZXBvc2l0EjUKCWNvbm5lY3RlZBgDIAEoCzIVLnNwYXJrLkNvbm5lY3RlZEV2ZW50SABSCWNvbm5lY3RlZEIHCgVldmVudCIQCg5Db25uZWN0ZWRFdmVudCI8Cg1UcmFuc2ZlckV2ZW50EisKCHRyYW5zZmVyGAogASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjkKDERlcG9zaXRFdmVudBIpCgdkZXBvc2l0GAogASgLMg8uc3BhcmsuVHJlZU5vZGVSB2RlcG9zaXQicgoLUGFnZVJlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgFUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIuCglkaXJlY3Rpb24YAyABKA4yEC5zcGFyay5EaXJlY3Rpb25SCWRpcmVjdGlvbiKoAQoMUGFnZVJlc3BvbnNlEiIKDWhhc19uZXh0X3BhZ2UYASABKAhSC2hhc05leHRQYWdlEioKEWhhc19wcmV2aW91c19wYWdlGAIgASgIUg9oYXNQcmV2aW91c1BhZ2USHwoLbmV4dF9jdXJzb3IYAyABKAlSCm5leHRDdXJzb3ISJwoPcHJldmlvdXNfY3Vyc29yGAQgASgJUg5wcmV2aW91c0N1cnNvciKAAgoTRGVwb3NpdEFkZHJlc3NQcm9vZhJgChJhZGRyZXNzX3NpZ25hdHVyZXMYASADKAsyMS5zcGFyay5EZXBvc2l0QWRkcmVzc1Byb29mLkFkZHJlc3NTaWduYXR1cmVzRW50cnlSEWFkZHJlc3NTaWduYXR1cmVzEkEKHXByb29mX29mX3Bvc3Nlc3Npb25fc2lnbmF0dXJlGAIgASgMUhpwcm9vZk9mUG9zc2Vzc2lvblNpZ25hdHVyZRpEChZBZGRyZXNzU2lnbmF0dXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEilQIKHUdlbmVyYXRlRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EiwKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDFIQc2lnbmluZ1B1YmxpY0tleRIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSJgoHbGVhZl9pZBgEIAEoCUII+kIFcgOwAQFIAFIGbGVhZklkiAEBEiAKCWlzX3N0YXRpYxgFIAEoCEgBUghpc1N0YXRpY4gBAUIKCghfbGVhZl9pZEIMCgpfaXNfc3RhdGljIrUBCgdBZGRyZXNzEhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSIwoNdmVyaWZ5aW5nX2tleRgCIAEoDFIMdmVyaWZ5aW5nS2V5Ek4KFWRlcG9zaXRfYWRkcmVzc19wcm9vZhgDIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZSE2RlcG9zaXRBZGRyZXNzUHJvb2YSGwoJaXNfc3RhdGljGAUgASgIUghpc1N0YXRpYyJZCh5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVzcG9uc2USNwoPZGVwb3NpdF9hZGRyZXNzGAEgASgLMg4uc3BhcmsuQWRkcmVzc1IOZGVwb3NpdEFkZHJlc3MiyQEKI0dlbmVyYXRlU3RhdGljRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EjUKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIQc2lnbmluZ1B1YmxpY0tleRI3ChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsiXwokR2VuZXJhdGVTdGF0aWNEZXBvc2l0QWRkcmVzc1Jlc3BvbnNlEjcKD2RlcG9zaXRfYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSDmRlcG9zaXRBZGRyZXNzInkKBFVUWE8SFQoGcmF3X3R4GAEgASgMUgVyYXdUeBISCgR2b3V0GAIgASgNUgR2b3V0EjIKB25ldHdvcmsYAyABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxISCgR0eGlkGAQgASgMUgR0eGlkIjkKCk5vZGVPdXRwdXQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhIKBHZvdXQYAiABKA1SBHZvdXQipgEKClNpZ25pbmdKb2ISLAoSc2lnbmluZ19wdWJsaWNfa2V5GAEgASgMUhBzaWduaW5nUHVibGljS2V5EhUKBnJhd190eBgCIAEoDFIFcmF3VHgSUwoYc2lnbmluZ19ub25jZV9jb21taXRtZW50GAMgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UhZzaWduaW5nTm9uY2VDb21taXRtZW50IsoCCg9TaWduaW5nS2V5c2hhcmUSKwoRb3duZXJfaWRlbnRpZmllcnMYASADKAlSEG93bmVySWRlbnRpZmllcnMSHAoJdGhyZXNob2xkGAIgASgNUgl0aHJlc2hvbGQSHQoKcHVibGljX2tleRgDIAEoDFIJcHVibGljS2V5Ek0KDXB1YmxpY19zaGFyZXMYBCADKAsyKC5zcGFyay5TaWduaW5nS2V5c2hhcmUuUHVibGljU2hhcmVzRW50cnlSDHB1YmxpY1NoYXJlcxI9Cgx1cGRhdGVkX3RpbWUYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRo/ChFQdWJsaWNTaGFyZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIsgECg1TaWduaW5nUmVzdWx0EkUKC3B1YmxpY19rZXlzGAEgAygLMiQuc3BhcmsuU2lnbmluZ1Jlc3VsdC5QdWJsaWNLZXlzRW50cnlSCnB1YmxpY0tleXMSbQoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgCIAMoCzIxLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeVIXc2lnbmluZ05vbmNlQ29tbWl0bWVudHMSVAoQc2lnbmF0dXJlX3NoYXJlcxgDIAMoCzIpLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmF0dXJlU2hhcmVzRW50cnlSD3NpZ25hdHVyZVNoYXJlcxJBChBzaWduaW5nX2tleXNoYXJlGAQgASgLMhYuc3BhcmsuU2lnbmluZ0tleXNoYXJlUg9zaWduaW5nS2V5c2hhcmUaPQoPUHVibGljS2V5c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEaZQocU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIvCgV2YWx1ZRgCIAEoCzIZLmNvbW1vbi5TaWduaW5nQ29tbWl0bWVudFIFdmFsdWU6AjgBGkIKFFNpZ25hdHVyZVNoYXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEikgMKEFJlbmV3TGVhZlJlcXVlc3QSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEmoKH3JlbmV3X25vZGVfdGltZWxvY2tfc2lnbmluZ19qb2IYAiABKAsyIi5zcGFyay5SZW5ld05vZGVUaW1lbG9ja1NpZ25pbmdKb2JIAFIbcmVuZXdOb2RlVGltZWxvY2tTaWduaW5nSm9iEnAKIXJlbmV3X3JlZnVuZF90aW1lbG9ja19zaWduaW5nX2pvYhgDIAEoCzIkLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iSABSHXJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iEncKJHJlbmV3X25vZGVfemVyb190aW1lbG9ja19zaWduaW5nX2pvYhgEIAEoCzImLnNwYXJrLlJlbmV3Tm9kZVplcm9UaW1lbG9ja1NpZ25pbmdKb2JIAFIfcmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYkIOCgxzaWduaW5nX2pvYnMipwUKG1JlbmV3Tm9kZVRpbWVsb2NrU2lnbmluZ0pvYhJXChlzcGxpdF9ub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIVc3BsaXROb2RlVHhTaWduaW5nSm9iEmQKIHNwbGl0X25vZGVfZGlyZWN0X3R4X3NpZ25pbmdfam9iGAIgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIbc3BsaXROb2RlRGlyZWN0VHhTaWduaW5nSm9iEkwKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iElAKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJZChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISXQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJvCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIuoDCh1SZW5ld1JlZnVuZFRpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEl0KHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISbwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBSABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKTAwofUmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEm8KJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAUgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2JKBAgEEAUi0wIKEVJlbmV3TGVhZlJlc3BvbnNlEl0KGnJlbmV3X25vZGVfdGltZWxvY2tfcmVzdWx0GAEgASgLMh4uc3BhcmsuUmVuZXdOb2RlVGltZWxvY2tSZXN1bHRIAFIXcmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSYwoccmVuZXdfcmVmdW5kX3RpbWVsb2NrX3Jlc3VsdBgCIAEoCzIgLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHRIAFIZcmVuZXdSZWZ1bmRUaW1lbG9ja1Jlc3VsdBJqCh9yZW5ld19ub2RlX3plcm9fdGltZWxvY2tfcmVzdWx0GAMgASgLMiIuc3BhcmsuUmVuZXdOb2RlWmVyb1RpbWVsb2NrUmVzdWx0SABSG3JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdEIOCgxyZW5ld19yZXN1bHQibgoXUmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSLgoKc3BsaXRfbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUglzcGxpdE5vZGUSIwoEbm9kZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlIkAKGVJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHQSIwoEbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlInIKG1JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdBIuCgpzcGxpdF9ub2RlGAEgASgLMg8uc3BhcmsuVHJlZU5vZGVSCXNwbGl0Tm9kZRIjCgRub2RlGAIgASgLMg8uc3BhcmsuVHJlZU5vZGVSBG5vZGUijwQKE05vZGVTaWduYXR1cmVTaGFyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEkkKFm5vZGVfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0Ek0KGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFXJlZnVuZFR4U2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAQgASgMUgx2ZXJpZnlpbmdLZXkSVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCLKAgoOTm9kZVNpZ25hdHVyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEioKEW5vZGVfdHhfc2lnbmF0dXJlGAIgASgMUg9ub2RlVHhTaWduYXR1cmUSLgoTcmVmdW5kX3R4X3NpZ25hdHVyZRgDIAEoDFIRcmVmdW5kVHhTaWduYXR1cmUSNwoYZGlyZWN0X25vZGVfdHhfc2lnbmF0dXJlGAQgASgMUhVkaXJlY3ROb2RlVHhTaWduYXR1cmUSOwoaZGlyZWN0X3JlZnVuZF90eF9zaWduYXR1cmUYBSABKAxSF2RpcmVjdFJlZnVuZFR4U2lnbmF0dXJlEk0KJGRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25hdHVyZRgGIAEoDFIfZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25hdHVyZSKKBAoYU3RhcnRUcmVlQ3JlYXRpb25SZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5Ei8KDW9uX2NoYWluX3V0eG8YAiABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJAChNyb290X3R4X3NpZ25pbmdfam9iGAMgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIQcm9vdFR4U2lnbmluZ0pvYhJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISTQoaZGlyZWN0X3Jvb3RfdHhfc2lnbmluZ19qb2IYBSABKAsyES5zcGFyay5TaWduaW5nSm9iUhZkaXJlY3RSb290VHhTaWduaW5nSm9iElEKHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBiABKAsyES5zcGFyay5TaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISYwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYByABKAsyES5zcGFyay5TaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKNAQoZU3RhcnRUcmVlQ3JlYXRpb25SZXNwb25zZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSVwoacm9vdF9ub2RlX3NpZ25hdHVyZV9zaGFyZXMYAiABKAsyGi5zcGFyay5Ob2RlU2lnbmF0dXJlU2hhcmVzUhdyb290Tm9kZVNpZ25hdHVyZVNoYXJlcyKRBAofU3RhcnREZXBvc2l0VHJlZUNyZWF0aW9uUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIvCg1vbl9jaGFpbl91dHhvGAIgASgLMgsuc3BhcmsuVVRYT1ILb25DaGFpblV0eG8SQAoTcm9vdF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEHJvb3RUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAQgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEk0KGmRpcmVjdF9yb290X3R4X3NpZ25pbmdfam9iGAUgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIWZGlyZWN0Um9vdFR4U2lnbmluZ0pvYhJRChxkaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAYgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIYZGlyZWN0UmVmdW5kVHhTaWduaW5nSm9iEmMKJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAcgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2IilAEKIFN0YXJ0RGVwb3NpdFRyZWVDcmVhdGlvblJlc3BvbnNlEhcKB3RyZWVfaWQYASABKAlSBnRyZWVJZBJXChpyb290X25vZGVfc2lnbmF0dXJlX3NoYXJlcxgCIAEoCzIaLnNwYXJrLk5vZGVTaWduYXR1cmVTaGFyZXNSF3Jvb3ROb2RlU2lnbmF0dXJlU2hhcmVzIpsBChJUb2tlbk91dHB1dFRvU3BlbmQSRgobcHJldl90b2tlbl90cmFuc2FjdGlvbl9oYXNoGAEgASgMQgf6QgR6AmggUhhwcmV2VG9rZW5UcmFuc2FjdGlvbkhhc2gSPQobcHJldl90b2tlbl90cmFuc2FjdGlvbl92b3V0GAIgASgNUhhwcmV2VG9rZW5UcmFuc2FjdGlvblZvdXQiWQoSVG9rZW5UcmFuc2ZlcklucHV0EkMKEG91dHB1dHNfdG9fc3BlbmQYASADKAsyGS5zcGFyay5Ub2tlbk91dHB1dFRvU3BlbmRSDm91dHB1dHNUb1NwZW5kIs8BCg5Ub2tlbk1pbnRJbnB1dBIzChFpc3N1ZXJfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIPaXNzdWVyUHVibGljS2V5EjoKGWlzc3Vlcl9wcm92aWRlZF90aW1lc3RhbXAYAiABKARSF2lzc3VlclByb3ZpZGVkVGltZXN0YW1wEjcKEHRva2VuX2lkZW50aWZpZXIYAyABKAxCB/pCBHoCaCBIAFIPdG9rZW5JZGVudGlmaWVyiAEBQhMKEV90b2tlbl9pZGVudGlmaWVyIvYCChBUb2tlbkNyZWF0ZUlucHV0EjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBAUIdChtfY3JlYXRpb25fZW50aXR5X3B1YmxpY19rZXkixwQKC1Rva2VuT3V0cHV0Eh0KAmlkGAEgASgJQgj6QgVyA7ABAUgAUgJpZIgBARIxChBvd25lcl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRJBChVyZXZvY2F0aW9uX2NvbW1pdG1lbnQYAyABKAxCB/pCBHoCaCFIAVIUcmV2b2NhdGlvbkNvbW1pdG1lbnSIAQESMQoSd2l0aGRyYXdfYm9uZF9zYXRzGAQgASgESAJSEHdpdGhkcmF3Qm9uZFNhdHOIAQESTAogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYBSABKARIA1Idd2l0aGRyYXdSZWxhdGl2ZUJsb2NrTG9ja3RpbWWIAQESNgoQdG9rZW5fcHVibGljX2tleRgGIAEoDEIH+kIEegJoIUgEUg50b2tlblB1YmxpY0tleYgBARI3ChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggSAVSD3Rva2VuSWRlbnRpZmllcogBARIqCgx0b2tlbl9hbW91bnQYByABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50QgUKA19pZEIYChZfcmV2b2NhdGlvbl9jb21taXRtZW50QhUKE193aXRoZHJhd19ib25kX3NhdHNCIwohX3dpdGhkcmF3X3JlbGF0aXZlX2Jsb2NrX2xvY2t0aW1lQhMKEV90b2tlbl9wdWJsaWNfa2V5QhMKEV90b2tlbl9pZGVudGlmaWVyIqUDChBUb2tlblRyYW5zYWN0aW9uEjYKCm1pbnRfaW5wdXQYASABKAsyFS5zcGFyay5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSQgoOdHJhbnNmZXJfaW5wdXQYAiABKAsyGS5zcGFyay5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBI8CgxjcmVhdGVfaW5wdXQYBSABKAsyFy5zcGFyay5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0EjcKDXRva2VuX291dHB1dHMYAyADKAsyEi5zcGFyay5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAQgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSMgoHbmV0d29yaxgKIAEoDjIOLnNwYXJrLk5ldHdvcmtCCPpCBYIBAiAAUgduZXR3b3JrQg4KDHRva2VuX2lucHV0cyJeChJTaWduYXR1cmVXaXRoSW5kZXgSJwoJc2lnbmF0dXJlGAEgASgMQgn6QgZ6BBBAGElSCXNpZ25hdHVyZRIfCgtpbnB1dF9pbmRleBgCIAEoDVIKaW5wdXRJbmRleCLFAQovT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWQSSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5IrYBCh5PcGVyYXRvclNwZWNpZmljT3duZXJTaWduYXR1cmUSQgoPb3duZXJfc2lnbmF0dXJlGAEgASgLMhkuc3BhcmsuU2lnbmF0dXJlV2l0aEluZGV4Ug5vd25lclNpZ25hdHVyZRJQCgdwYXlsb2FkGAIgASgLMjYuc3BhcmsuT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWRSB3BheWxvYWQicgoZUmV2b2NhdGlvblNlY3JldFdpdGhJbmRleBIfCgtpbnB1dF9pbmRleBgBIAEoDVIKaW5wdXRJbmRleBI0ChFyZXZvY2F0aW9uX3NlY3JldBgCIAEoDEIH+kIEegJoIFIQcmV2b2NhdGlvblNlY3JldCL4AgoTRnJlZXplVG9rZW5zUGF5bG9hZBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIxChB0b2tlbl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg50b2tlblB1YmxpY0tleRI6Chlpc3N1ZXJfcHJvdmlkZWRfdGltZXN0YW1wGAMgASgEUhdpc3N1ZXJQcm92aWRlZFRpbWVzdGFtcBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5EicKD3Nob3VsZF91bmZyZWV6ZRgFIAEoCFIOc2hvdWxkVW5mcmVlemUSNwoQdG9rZW5faWRlbnRpZmllchgGIAEoDEIH+kIEegJoIEgAUg90b2tlbklkZW50aWZpZXKIAQFCEwoRX3Rva2VuX2lkZW50aWZpZXIimwEKE0ZyZWV6ZVRva2Vuc1JlcXVlc3QSTgoVZnJlZXplX3Rva2Vuc19wYXlsb2FkGAEgASgLMhouc3BhcmsuRnJlZXplVG9rZW5zUGF5bG9hZFITZnJlZXplVG9rZW5zUGF5bG9hZBI0ChBpc3N1ZXJfc2lnbmF0dXJlGAIgASgMQgn6QgZ6BBBAGElSD2lzc3VlclNpZ25hdHVyZSKJAQoURnJlZXplVG9rZW5zUmVzcG9uc2USPQoTaW1wYWN0ZWRfb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIRaW1wYWN0ZWRPdXRwdXRJZHMSMgoVaW1wYWN0ZWRfdG9rZW5fYW1vdW50GAIgASgMUhNpbXBhY3RlZFRva2VuQW1vdW50Iv0FCghUcmVlTm9kZRIOCgJpZBgBIAEoCVICaWQSFwoHdHJlZV9pZBgCIAEoCVIGdHJlZUlkEhQKBXZhbHVlGAMgASgEUgV2YWx1ZRIpCg5wYXJlbnRfbm9kZV9pZBgEIAEoCUgAUgxwYXJlbnROb2RlSWSIAQESFwoHbm9kZV90eBgFIAEoDFIGbm9kZVR4EhsKCXJlZnVuZF90eBgGIAEoDFIIcmVmdW5kVHgSEgoEdm91dBgHIAEoDVIEdm91dBIwChR2ZXJpZnlpbmdfcHVibGljX2tleRgIIAEoDFISdmVyaWZ5aW5nUHVibGljS2V5EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYCSABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQQoQc2lnbmluZ19rZXlzaGFyZRgKIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIPc2lnbmluZ0tleXNoYXJlEhYKBnN0YXR1cxgLIAEoCVIGc3RhdHVzEigKB25ldHdvcmsYDCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEj0KDGNyZWF0ZWRfdGltZRgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC2NyZWF0ZWRUaW1lEj0KDHVwZGF0ZWRfdGltZRgOIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC3VwZGF0ZWRUaW1lEjcKGG93bmVyX3NpZ25pbmdfcHVibGljX2tleRgPIAEoDFIVb3duZXJTaWduaW5nUHVibGljS2V5EhsKCWRpcmVjdF90eBgQIAEoDFIIZGlyZWN0VHgSKAoQZGlyZWN0X3JlZnVuZF90eBgRIAEoDFIOZGlyZWN0UmVmdW5kVHgSOgoaZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHgYEiABKAxSFmRpcmVjdEZyb21DcGZwUmVmdW5kVHhCEQoPX3BhcmVudF9ub2RlX2lkIpABCh1GaW5hbGl6ZU5vZGVTaWduYXR1cmVzUmVxdWVzdBIvCgZpbnRlbnQYASABKA4yFy5jb21tb24uU2lnbmF0dXJlSW50ZW50UgZpbnRlbnQSPgoPbm9kZV9zaWduYXR1cmVzGAIgAygLMhUuc3BhcmsuTm9kZVNpZ25hdHVyZXNSDm5vZGVTaWduYXR1cmVzIkcKHkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXNwb25zZRIlCgVub2RlcxgBIAMoCzIPLnNwYXJrLlRyZWVOb2RlUgVub2RlcyJICgtTZWNyZXRTaGFyZRIhCgxzZWNyZXRfc2hhcmUYASABKAxSC3NlY3JldFNoYXJlEhYKBnByb29mcxgCIAMoDFIGcHJvb2ZzIiUKC1NlY3JldFByb29mEhYKBnByb29mcxgBIAMoDFIGcHJvb2ZzIq8CChZMZWFmUmVmdW5kVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIr4CChZVc2VyU2lnbmVkVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBIsChJzaWduaW5nX3B1YmxpY19rZXkYAiABKAxSEHNpZ25pbmdQdWJsaWNLZXkSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJTChhzaWduaW5nX25vbmNlX2NvbW1pdG1lbnQYBCABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFnNpZ25pbmdOb25jZUNvbW1pdG1lbnQSJQoOdXNlcl9zaWduYXR1cmUYBSABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgGIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzIvICChlMZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSIwoNdmVyaWZ5aW5nX2tleRgDIAEoDFIMdmVyaWZ5aW5nS2V5EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCL1AwoeU3RhcnRVc2VyU2lnbmVkVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQwoObGVhdmVzX3RvX3NlbmQYAyADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUgxsZWF2ZXNUb1NlbmQSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI7CgtleHBpcnlfdGltZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCmV4cGlyeVRpbWUSUAoVZGlyZWN0X2xlYXZlc190b19zZW5kGAYgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlISZGlyZWN0TGVhdmVzVG9TZW5kEmIKH2RpcmVjdF9mcm9tX2NwZnBfbGVhdmVzX3RvX3NlbmQYByADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhpkaXJlY3RGcm9tQ3BmcExlYXZlc1RvU2VuZCKpAwoUU3RhcnRUcmFuc2ZlclJlcXVlc3QSHwoLdHJhbnNmZXJfaWQYASABKAlSCnRyYW5zZmVySWQSOQoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIWb3duZXJJZGVudGl0eVB1YmxpY0tleRJDCg5sZWF2ZXNfdG9fc2VuZBgDIAMoCzIdLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBI/ChxyZWNlaXZlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMUhlyZWNlaXZlcklkZW50aXR5UHVibGljS2V5EjsKC2V4cGlyeV90aW1lGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRJBChB0cmFuc2Zlcl9wYWNrYWdlGAcgASgLMhYuc3BhcmsuVHJhbnNmZXJQYWNrYWdlUg90cmFuc2ZlclBhY2thZ2USIwoNc3BhcmtfaW52b2ljZRgKIAEoCVIMc3BhcmtJbnZvaWNlSgQIBhAHSgQICRAKIo8BChVTdGFydFRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi0AMKD1RyYW5zZmVyUGFja2FnZRJDCg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBJXChFrZXlfdHdlYWtfcGFja2FnZRgCIAMoCzIrLnNwYXJrLlRyYW5zZmVyUGFja2FnZS5LZXlUd2Vha1BhY2thZ2VFbnRyeVIPa2V5VHdlYWtQYWNrYWdlEiUKDnVzZXJfc2lnbmF0dXJlGAMgASgMUg11c2VyU2lnbmF0dXJlElAKFWRpcmVjdF9sZWF2ZXNfdG9fc2VuZBgEIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEmRpcmVjdExlYXZlc1RvU2VuZBJiCh9kaXJlY3RfZnJvbV9jcGZwX2xlYXZlc190b19zZW5kGAUgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIaZGlyZWN0RnJvbUNwZnBMZWF2ZXNUb1NlbmQaQgoUS2V5VHdlYWtQYWNrYWdlRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJSChFTZW5kTGVhZktleVR3ZWFrcxI9Cg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIXLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWtSDGxlYXZlc1RvU2VuZCKDBAoQU2VuZExlYWZLZXlUd2VhaxIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSQAoSc2VjcmV0X3NoYXJlX3R3ZWFrGAIgASgLMhIuc3BhcmsuU2VjcmV0U2hhcmVSEHNlY3JldFNoYXJlVHdlYWsSXgoTcHVia2V5X3NoYXJlc190d2VhaxgDIAMoCzIuLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWsuUHVia2V5U2hhcmVzVHdlYWtFbnRyeVIRcHVia2V5U2hhcmVzVHdlYWsSIwoNc2VjcmV0X2NpcGhlchgEIAEoDFIMc2VjcmV0Q2lwaGVyEhwKCXNpZ25hdHVyZRgFIAEoDFIJc2lnbmF0dXJlEikKEHJlZnVuZF9zaWduYXR1cmUYBiABKAxSD3JlZnVuZFNpZ25hdHVyZRI2ChdkaXJlY3RfcmVmdW5kX3NpZ25hdHVyZRgHIAEoDFIVZGlyZWN0UmVmdW5kU2lnbmF0dXJlEkgKIWRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3NpZ25hdHVyZRgIIAEoDFIdZGlyZWN0RnJvbUNwZnBSZWZ1bmRTaWduYXR1cmUaRAoWUHVia2V5U2hhcmVzVHdlYWtFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIuYBChdGaW5hbGl6ZVRyYW5zZmVyUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5Ej0KDmxlYXZlc190b19zZW5kGAMgAygLMhcuc3BhcmsuU2VuZExlYWZLZXlUd2Vha1IMbGVhdmVzVG9TZW5kEjAKFHNwYXJrX3BheW1lbnRfaW50ZW50GAQgASgJUhJzcGFya1BheW1lbnRJbnRlbnQiywEKKkZpbmFsaXplVHJhbnNmZXJXaXRoVHJhbnNmZXJQYWNrYWdlUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkEKEHRyYW5zZmVyX3BhY2thZ2UYAyABKAsyFi5zcGFyay5UcmFuc2ZlclBhY2thZ2VSD3RyYW5zZmVyUGFja2FnZSJHChhGaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXIiyAQKCFRyYW5zZmVyEg4KAmlkGAEgASgJUgJpZBI7ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIXc2VuZGVySWRlbnRpdHlQdWJsaWNLZXkSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgDIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRItCgZzdGF0dXMYBCABKA4yFS5zcGFyay5UcmFuc2ZlclN0YXR1c1IGc3RhdHVzEh8KC3RvdGFsX3ZhbHVlGAUgASgEUgp0b3RhbFZhbHVlEjsKC2V4cGlyeV90aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRIrCgZsZWF2ZXMYByADKAsyEy5zcGFyay5UcmFuc2ZlckxlYWZSBmxlYXZlcxI9CgxjcmVhdGVkX3RpbWUYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgtjcmVhdGVkVGltZRI9Cgx1cGRhdGVkX3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRInCgR0eXBlGAogASgOMhMuc3BhcmsuVHJhbnNmZXJUeXBlUgR0eXBlEiMKDXNwYXJrX2ludm9pY2UYCyABKAlSDHNwYXJrSW52b2ljZRIoCgduZXR3b3JrGAwgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayKEAwoMVHJhbnNmZXJMZWFmEiMKBGxlYWYYASABKAsyDy5zcGFyay5UcmVlTm9kZVIEbGVhZhIjCg1zZWNyZXRfY2lwaGVyGAIgASgMUgxzZWNyZXRDaXBoZXISHAoJc2lnbmF0dXJlGAMgASgMUglzaWduYXR1cmUSNAoWaW50ZXJtZWRpYXRlX3JlZnVuZF90eBgEIAEoDFIUaW50ZXJtZWRpYXRlUmVmdW5kVHgSQQodaW50ZXJtZWRpYXRlX2RpcmVjdF9yZWZ1bmRfdHgYBSABKAxSGmludGVybWVkaWF0ZURpcmVjdFJlZnVuZFR4ElMKJ2ludGVybWVkaWF0ZV9kaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eBgGIAEoDFIiaW50ZXJtZWRpYXRlRGlyZWN0RnJvbUNwZnBSZWZ1bmRUeBI+ChxwZW5kaW5nX2tleV90d2Vha19wdWJsaWNfa2V5GAcgASgMUhhwZW5kaW5nS2V5VHdlYWtQdWJsaWNLZXki8wMKDlRyYW5zZmVyRmlsdGVyEkEKHHJlY2VpdmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxIAFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI9ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDEgAUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleRJTCiZzZW5kZXJfb3JfcmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRg8IAEoDEgAUiFzZW5kZXJPclJlY2VpdmVySWRlbnRpdHlQdWJsaWNLZXkSIQoMdHJhbnNmZXJfaWRzGAMgAygJUgt0cmFuc2ZlcklkcxIUCgVsaW1pdBgoIAEoA1IFbGltaXQSFgoGb2Zmc2V0GDIgASgDUgZvZmZzZXQSKQoFdHlwZXMYRiADKA4yEy5zcGFyay5UcmFuc2ZlclR5cGVSBXR5cGVzEigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEjEKCHN0YXR1c2VzGFAgAygOMhUuc3BhcmsuVHJhbnNmZXJTdGF0dXNSCHN0YXR1c2VzEiIKBW9yZGVyGAUgASgOMgwuc3BhcmsuT3JkZXJSBW9yZGVyQg0KC3BhcnRpY2lwYW50Il8KFlF1ZXJ5VHJhbnNmZXJzUmVzcG9uc2USLQoJdHJhbnNmZXJzGAEgAygLMg8uc3BhcmsuVHJhbnNmZXJSCXRyYW5zZmVycxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCKVAgoRQ2xhaW1MZWFmS2V5VHdlYWsSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEkAKEnNlY3JldF9zaGFyZV90d2VhaxgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUhBzZWNyZXRTaGFyZVR3ZWFrEl8KE3B1YmtleV9zaGFyZXNfdHdlYWsYAyADKAsyLy5zcGFyay5DbGFpbUxlYWZLZXlUd2Vhay5QdWJrZXlTaGFyZXNUd2Vha0VudHJ5UhFwdWJrZXlTaGFyZXNUd2VhaxpEChZQdWJrZXlTaGFyZXNUd2Vha0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEiwQEKHUNsYWltVHJhbnNmZXJUd2Vha0tleXNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSRAoRbGVhdmVzX3RvX3JlY2VpdmUYAyADKAsyGC5zcGFyay5DbGFpbUxlYWZLZXlUd2Vha1IPbGVhdmVzVG9SZWNlaXZlIsUBCh9DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQAoMc2lnbmluZ19qb2JzGAMgAygLMh0uc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ0pvYlILc2lnbmluZ0pvYnNKBAgEEAUibQogQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVzcG9uc2USSQoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9wEKGVN0b3JlUHJlaW1hZ2VTaGFyZVJlcXVlc3QSIQoMcGF5bWVudF9oYXNoGAEgASgMUgtwYXltZW50SGFzaBI5Cg5wcmVpbWFnZV9zaGFyZRgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUg1wcmVpbWFnZVNoYXJlEhwKCXRocmVzaG9sZBgDIAEoDVIJdGhyZXNob2xkEiUKDmludm9pY2Vfc3RyaW5nGAQgASgJUg1pbnZvaWNlU3RyaW5nEjcKGHVzZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIVdXNlcklkZW50aXR5UHVibGljS2V5IoECChtSZXF1ZXN0ZWRTaWduaW5nQ29tbWl0bWVudHMSewoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgBIAMoCzI/LnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5UhdzaWduaW5nTm9uY2VDb21taXRtZW50cxplChxTaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEiTwocR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVxdWVzdBIZCghub2RlX2lkcxgBIAMoCVIHbm9kZUlkcxIUCgVjb3VudBgCIAEoDVIFY291bnQidAodR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVzcG9uc2USUwoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIiLnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzItoBChJTaWduaW5nQ29tbWl0bWVudHMSYgoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIxLnNwYXJrLlNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nQ29tbWl0bWVudHNFbnRyeVISc2lnbmluZ0NvbW1pdG1lbnRzGmAKF1NpZ25pbmdDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEixgIKEFVzZXJTaWduZWRSZWZ1bmQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhsKCXJlZnVuZF90eBgCIAEoDFIIcmVmdW5kVHgSJQoOdXNlcl9zaWduYXR1cmUYAyABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgEIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzElUKGXVzZXJfc2lnbmF0dXJlX2NvbW1pdG1lbnQYBSABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSF3VzZXJTaWduYXR1cmVDb21taXRtZW50EjIKB25ldHdvcmsYBiABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yayI7ChJJbnZvaWNlQW1vdW50UHJvb2YSJQoOYm9sdDExX2ludm9pY2UYASABKAlSDWJvbHQxMUludm9pY2UiewoNSW52b2ljZUFtb3VudBIdCgp2YWx1ZV9zYXRzGAEgASgEUgl2YWx1ZVNhdHMSSwoUaW52b2ljZV9hbW91bnRfcHJvb2YYAiABKAsyGS5zcGFyay5JbnZvaWNlQW1vdW50UHJvb2ZSEmludm9pY2VBbW91bnRQcm9vZiLWAwobSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSOwoOaW52b2ljZV9hbW91bnQYAiABKAsyFC5zcGFyay5JbnZvaWNlQW1vdW50Ug1pbnZvaWNlQW1vdW50EkEKBnJlYXNvbhgDIAEoDjIpLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdC5SZWFzb25SBnJlYXNvbhJBCgh0cmFuc2ZlchgEIAEoCzIlLnNwYXJrLlN0YXJ0VXNlclNpZ25lZFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRIZCghmZWVfc2F0cxgGIAEoBFIHZmVlU2F0cxJGChB0cmFuc2Zlcl9yZXF1ZXN0GAcgASgLMhsuc3BhcmsuU3RhcnRUcmFuc2ZlclJlcXVlc3RSD3RyYW5zZmVyUmVxdWVzdCItCgZSZWFzb24SDwoLUkVBU09OX1NFTkQQABISCg5SRUFTT05fUkVDRUlWRRABImcKHEluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2USGgoIcHJlaW1hZ2UYASABKAxSCHByZWltYWdlEisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjIKCE91dFBvaW50EhIKBHR4aWQYASABKAxSBHR4aWQSEgoEdm91dBgCIAEoDVIEdm91dCKHAQoWQ29vcGVyYXRpdmVFeGl0UmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchIXCgdleGl0X2lkGAIgASgJUgZleGl0SWQSGwoJZXhpdF90eGlkGAMgASgMUghleGl0VHhpZCKRAQoXQ29vcGVyYXRpdmVFeGl0UmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMioAIKFkNvdW50ZXJMZWFmU3dhcFJlcXVlc3QSNwoIdHJhbnNmZXIYASABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISFwoHc3dhcF9pZBgCIAEoCVIGc3dhcElkEiwKEmFkYXB0b3JfcHVibGljX2tleRgDIAEoDFIQYWRhcHRvclB1YmxpY0tleRI5ChlkaXJlY3RfYWRhcHRvcl9wdWJsaWNfa2V5GAQgASgMUhZkaXJlY3RBZGFwdG9yUHVibGljS2V5EksKI2RpcmVjdF9mcm9tX2NwZnBfYWRhcHRvcl9wdWJsaWNfa2V5GAUgASgMUh5kaXJlY3RGcm9tQ3BmcEFkYXB0b3JQdWJsaWNLZXkikQEKF0NvdW50ZXJMZWFmU3dhcFJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD3NpZ25pbmdfcmVzdWx0cxgCIAMoCzIgLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIqIBChZSZWZyZXNoVGltZWxvY2tSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EjQKDHNpZ25pbmdfam9icxgDIAMoCzIRLnNwYXJrLlNpZ25pbmdKb2JSC3NpZ25pbmdKb2JzIoABChxSZWZyZXNoVGltZWxvY2tTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkiZwoXUmVmcmVzaFRpbWVsb2NrUmVzcG9uc2USTAoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiMuc3BhcmsuUmVmcmVzaFRpbWVsb2NrU2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9gMKEUV4dGVuZExlYWZSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkAKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iEkQKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iInsKF0V4dGVuZExlYWZTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkimwQKEkV4dGVuZExlYWZSZXNwb25zZRIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSUwoWbm9kZV90eF9zaWduaW5nX3Jlc3VsdBgCIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0ElcKGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSYAodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyHi5zcGFyay5FeHRlbmRMZWFmU2lnbmluZ1Jlc3VsdFIZZGlyZWN0Tm9kZVR4U2lnbmluZ1Jlc3VsdBJkCh9kaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfcmVzdWx0GAUgASgLMh4uc3BhcmsuRXh0ZW5kTGVhZlNpZ25pbmdSZXN1bHRSG2RpcmVjdFJlZnVuZFR4U2lnbmluZ1Jlc3VsdBJ2CilkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgGIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJzChJBZGRyZXNzUmVxdWVzdE5vZGUSJgoPdXNlcl9wdWJsaWNfa2V5GAEgASgMUg11c2VyUHVibGljS2V5EjUKCGNoaWxkcmVuGAIgAygLMhkuc3BhcmsuQWRkcmVzc1JlcXVlc3ROb2RlUghjaGlsZHJlbiKDAgoZUHJlcGFyZVRyZWVBZGRyZXNzUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SLQoEbm9kZRgDIAEoCzIZLnNwYXJrLkFkZHJlc3NSZXF1ZXN0Tm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UiZwoLQWRkcmVzc05vZGUSKAoHYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSB2FkZHJlc3MSLgoIY2hpbGRyZW4YAiADKAsyEi5zcGFyay5BZGRyZXNzTm9kZVIIY2hpbGRyZW4iRAoaUHJlcGFyZVRyZWVBZGRyZXNzUmVzcG9uc2USJgoEbm9kZRgBIAEoCzISLnNwYXJrLkFkZHJlc3NOb2RlUgRub2RlIs4DCgxDcmVhdGlvbk5vZGUSQAoTbm9kZV90eF9zaWduaW5nX2pvYhgBIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEG5vZGVUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAIgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEi8KCGNoaWxkcmVuGAMgAygLMhMuc3BhcmsuQ3JlYXRpb25Ob2RlUghjaGlsZHJlbhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIvUBChFDcmVhdGVUcmVlUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SJwoEbm9kZRgDIAEoCzITLnNwYXJrLkNyZWF0aW9uTm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UipAQKFENyZWF0aW9uUmVzcG9uc2VOb2RlEhcKB25vZGVfaWQYASABKAlSBm5vZGVJZBJJChZub2RlX3R4X3NpZ25pbmdfcmVzdWx0GAIgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFITbm9kZVR4U2lnbmluZ1Jlc3VsdBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAyABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSNwoIY2hpbGRyZW4YBCADKAsyGy5zcGFyay5DcmVhdGlvblJlc3BvbnNlTm9kZVIIY2hpbGRyZW4SVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJFChJDcmVhdGVUcmVlUmVzcG9uc2USLwoEbm9kZRgBIAEoCzIbLnNwYXJrLkNyZWF0aW9uUmVzcG9uc2VOb2RlUgRub2RlIoQBChNTaWduaW5nT3BlcmF0b3JJbmZvEhQKBWluZGV4GAEgASgEUgVpbmRleBIeCgppZGVudGlmaWVyGAIgASgJUgppZGVudGlmaWVyEh0KCnB1YmxpY19rZXkYAyABKAxSCXB1YmxpY0tleRIYCgdhZGRyZXNzGAQgASgJUgdhZGRyZXNzIusBCh5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2USaAoRc2lnbmluZ19vcGVyYXRvcnMYASADKAsyOy5zcGFyay5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2UuU2lnbmluZ09wZXJhdG9yc0VudHJ5UhBzaWduaW5nT3BlcmF0b3JzGl8KFVNpZ25pbmdPcGVyYXRvcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIwCgV2YWx1ZRgCIAEoCzIaLnNwYXJrLlNpZ25pbmdPcGVyYXRvckluZm9SBXZhbHVlOgI4ASJyCh1RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVxdWVzdBIhCgxwYXltZW50X2hhc2gYASABKAxSC3BheW1lbnRIYXNoEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSEWlkZW50aXR5UHVibGljS2V5IpwBCh5RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVzcG9uc2USRwoTdXNlcl9zaWduZWRfcmVmdW5kcxgBIAMoCzIXLnNwYXJrLlVzZXJTaWduZWRSZWZ1bmRSEXVzZXJTaWduZWRSZWZ1bmRzEisKCHRyYW5zZmVyGAMgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVySgQIAhADIqQDChtQcmVpbWFnZVJlcXVlc3RXaXRoVHJhbnNmZXISKgoMcGF5bWVudF9oYXNoGAEgASgMQgf6QgR6AmggUgtwYXltZW50SGFzaBJBChhyZWNlaXZlcl9pZGVudGl0eV9wdWJrZXkYAiABKAxCB/pCBHoCaCFSFnJlY2VpdmVySWRlbnRpdHlQdWJrZXkSNAoGc3RhdHVzGAMgASgOMhwuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0U3RhdHVzUgZzdGF0dXMSPQoMY3JlYXRlZF90aW1lGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFILY3JlYXRlZFRpbWUSMAoIdHJhbnNmZXIYBSABKAsyDy5zcGFyay5UcmFuc2ZlckgAUgh0cmFuc2ZlcogBARIfCghwcmVpbWFnZRgGIAEoDEgBUghwcmVpbWFnZYgBARI0ChZzZW5kZXJfaWRlbnRpdHlfcHVia2V5GAcgASgMUhRzZW5kZXJJZGVudGl0eVB1YmtleUILCglfdHJhbnNmZXJCCwoJX3ByZWltYWdlIsQCChBRdWVyeUh0bGNSZXF1ZXN0EiUKDnBheW1lbnRfaGFzaGVzGAEgAygMUg1wYXltZW50SGFzaGVzEjcKE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5EjkKBnN0YXR1cxgDIAEoDjIcLnNwYXJrLlByZWltYWdlUmVxdWVzdFN0YXR1c0gAUgZzdGF0dXOIAQESFAoFbGltaXQYBCABKANSBWxpbWl0EhYKBm9mZnNldBgFIAEoA1IGb2Zmc2V0EiEKDHRyYW5zZmVyX2lkcxgGIAMoCVILdHJhbnNmZXJJZHMSOQoKbWF0Y2hfcm9sZRgHIAEoDjIaLnNwYXJrLlByZWltYWdlUmVxdWVzdFJvbGVSCW1hdGNoUm9sZUIJCgdfc3RhdHVzInwKEVF1ZXJ5SHRsY1Jlc3BvbnNlEk8KEXByZWltYWdlX3JlcXVlc3RzGAEgAygLMiIuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0V2l0aFRyYW5zZmVyUhBwcmVpbWFnZVJlcXVlc3RzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0IocBChZQcm92aWRlUHJlaW1hZ2VSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSGgoIcHJlaW1hZ2UYAiABKAxSCHByZWltYWdlEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAyABKAxSEWlkZW50aXR5UHVibGljS2V5IkYKF1Byb3ZpZGVQcmVpbWFnZVJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIigKC1RyZWVOb2RlSWRzEhkKCG5vZGVfaWRzGAEgAygJUgdub2RlSWRzIrgCChFRdWVyeU5vZGVzUmVxdWVzdBI0ChVvd25lcl9pZGVudGl0eV9wdWJrZXkYASABKAxIAFITb3duZXJJZGVudGl0eVB1YmtleRIvCghub2RlX2lkcxgCIAEoCzISLnNwYXJrLlRyZWVOb2RlSWRzSABSB25vZGVJZHMSJwoPaW5jbHVkZV9wYXJlbnRzGAMgASgIUg5pbmNsdWRlUGFyZW50cxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSKAoHbmV0d29yaxgGIAEoDjIOLnNwYXJrLk5ldHdvcmtSB25ldHdvcmsSMQoIc3RhdHVzZXMYByADKA4yFS5zcGFyay5UcmVlTm9kZVN0YXR1c1IIc3RhdHVzZXNCCAoGc291cmNlIrMBChJRdWVyeU5vZGVzUmVzcG9uc2USOgoFbm9kZXMYASADKAsyJC5zcGFyay5RdWVyeU5vZGVzUmVzcG9uc2UuTm9kZXNFbnRyeVIFbm9kZXMSFgoGb2Zmc2V0GAIgASgDUgZvZmZzZXQaSQoKTm9kZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIlCgV2YWx1ZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgV2YWx1ZToCOAEidQoVQ2FuY2VsVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjsKGnNlbmRlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleSJFChZDYW5jZWxUcmFuc2ZlclJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIqwBCiJRdWVyeVVudXNlZERlcG9zaXRBZGRyZXNzZXNSZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5EigKB25ldHdvcmsYAiABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEhQKBWxpbWl0GAMgASgDUgVsaW1pdBIWCgZvZmZzZXQYBCABKANSBm9mZnNldCLuAQoiUXVlcnlTdGF0aWNEZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yaxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSLAoPZGVwb3NpdF9hZGRyZXNzGAYgASgJSABSDmRlcG9zaXRBZGRyZXNziAEBQhIKEF9kZXBvc2l0X2FkZHJlc3MiygIKGURlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHQSJwoPZGVwb3NpdF9hZGRyZXNzGAEgASgJUg5kZXBvc2l0QWRkcmVzcxI1Chd1c2VyX3NpZ25pbmdfcHVibGljX2tleRgCIAEoDFIUdXNlclNpZ25pbmdQdWJsaWNLZXkSMAoUdmVyaWZ5aW5nX3B1YmxpY19rZXkYAyABKAxSEnZlcmlmeWluZ1B1YmxpY0tleRImCgdsZWFmX2lkGAQgASgJQgj6QgVyA7ABAUgAUgZsZWFmSWSIAQESTwoTcHJvb2Zfb2ZfcG9zc2Vzc2lvbhgFIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZIAVIRcHJvb2ZPZlBvc3Nlc3Npb26IAQFCCgoIX2xlYWZfaWRCFgoUX3Byb29mX29mX3Bvc3Nlc3Npb24ijAEKI1F1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlEk0KEWRlcG9zaXRfYWRkcmVzc2VzGAEgAygLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIQZGVwb3NpdEFkZHJlc3NlcxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCJ0CiNRdWVyeVN0YXRpY0RlcG9zaXRBZGRyZXNzZXNSZXNwb25zZRJNChFkZXBvc2l0X2FkZHJlc3NlcxgBIAMoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSEGRlcG9zaXRBZGRyZXNzZXMibwoTUXVlcnlCYWxhbmNlUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayLFAQoUUXVlcnlCYWxhbmNlUmVzcG9uc2USGAoHYmFsYW5jZRgBIAEoBFIHYmFsYW5jZRJSCg1ub2RlX2JhbGFuY2VzGAIgAygLMi0uc3BhcmsuUXVlcnlCYWxhbmNlUmVzcG9uc2UuTm9kZUJhbGFuY2VzRW50cnlSDG5vZGVCYWxhbmNlcxo/ChFOb2RlQmFsYW5jZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoBFIFdmFsdWU6AjgBIsUBCgxTcGFya0FkZHJlc3MSLgoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDFIRaWRlbnRpdHlQdWJsaWNLZXkSSwoUc3BhcmtfaW52b2ljZV9maWVsZHMYAiABKAsyGS5zcGFyay5TcGFya0ludm9pY2VGaWVsZHNSEnNwYXJrSW52b2ljZUZpZWxkcxIqCglzaWduYXR1cmUYAyABKAxCB/pCBHoCaEBIAFIJc2lnbmF0dXJliAEBQgwKCl9zaWduYXR1cmUinAMKElNwYXJrSW52b2ljZUZpZWxkcxIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEhcKAmlkGAIgASgMQgf6QgR6AmgQUgJpZBI9Cg50b2tlbnNfcGF5bWVudBgDIAEoCzIULnNwYXJrLlRva2Vuc1BheW1lbnRIAFINdG9rZW5zUGF5bWVudBI3CgxzYXRzX3BheW1lbnQYBCABKAsyEi5zcGFyay5TYXRzUGF5bWVudEgAUgtzYXRzUGF5bWVudBIgCgRtZW1vGAUgASgJQgf6QgRyAih4SAFSBG1lbW+IAQESOAoRc2VuZGVyX3B1YmxpY19rZXkYBiABKAxCB/pCBHoCaCFIAlIPc2VuZGVyUHVibGljS2V5iAEBEkAKC2V4cGlyeV90aW1lGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDUgpleHBpcnlUaW1liAEBQg4KDHBheW1lbnRfdHlwZUIHCgVfbWVtb0IUChJfc2VuZGVyX3B1YmxpY19rZXlCDgoMX2V4cGlyeV90aW1lIjUKC1NhdHNQYXltZW50EhsKBmFtb3VudBgBIAEoBEgAUgZhbW91bnSIAQFCCQoHX2Ftb3VudCKOAQoNVG9rZW5zUGF5bWVudBI3ChB0b2tlbl9pZGVudGlmaWVyGAEgASgMQgf6QgR6AmggSABSD3Rva2VuSWRlbnRpZmllcogBARIkCgZhbW91bnQYAiABKAxCB/pCBHoCGBBIAVIGYW1vdW50iAEBQhMKEV90b2tlbl9pZGVudGlmaWVyQgkKB19hbW91bnQixgEKJkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISJQoOdXNlcl9zaWduYXR1cmUYBCABKAxSDXVzZXJTaWduYXR1cmUiwwEKJ0luaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXNwb25zZRJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYASABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSSQoPZGVwb3NpdF9hZGRyZXNzGAIgASgLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIOZGVwb3NpdEFkZHJlc3MisAMKF0luaXRpYXRlVXR4b1N3YXBSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxI9CgxyZXF1ZXN0X3R5cGUYAiABKA4yGi5zcGFyay5VdHhvU3dhcFJlcXVlc3RUeXBlUgtyZXF1ZXN0VHlwZRIuChJjcmVkaXRfYW1vdW50X3NhdHMYAyABKARIAFIQY3JlZGl0QW1vdW50U2F0cxIiCgxtYXhfZmVlX3NhdHMYBCABKARIAFIKbWF4RmVlU2F0cxIjCg1zc3Bfc2lnbmF0dXJlGAUgASgMUgxzc3BTaWduYXR1cmUSJQoOdXNlcl9zaWduYXR1cmUYBiABKAxSDXVzZXJTaWduYXR1cmUSNwoIdHJhbnNmZXIYByABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISQgoUc3BlbmRfdHhfc2lnbmluZ19qb2IYCCABKAsyES5zcGFyay5TaWduaW5nSm9iUhFzcGVuZFR4U2lnbmluZ0pvYkIICgZhbW91bnQi3wEKGEluaXRpYXRlVXR4b1N3YXBSZXNwb25zZRJLChdzcGVuZF90eF9zaWduaW5nX3Jlc3VsdBgBIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFHNwZW5kVHhTaWduaW5nUmVzdWx0EisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD2RlcG9zaXRfYWRkcmVzcxgDIAEoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSDmRlcG9zaXRBZGRyZXNzIosBCgtFeGl0aW5nVHJlZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSUQoXdXNlcl9zaWduaW5nX2NvbW1pdG1lbnQYAiABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFXVzZXJTaWduaW5nQ29tbWl0bWVudBIQCgN2aW4YAyABKA1SA3ZpbiKcAQofRXhpdFNpbmdsZU5vZGVUcmVlU2lnbmluZ1Jlc3VsdBIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSOwoOc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0Ug1zaWduaW5nUmVzdWx0EiMKDXZlcmlmeWluZ19rZXkYAyABKAxSDHZlcmlmeWluZ0tleSJNChhCaXRjb2luVHJhbnNhY3Rpb25PdXRwdXQSFAoFdmFsdWUYASABKANSBXZhbHVlEhsKCXBrX3NjcmlwdBgCIAEoDFIIcGtTY3JpcHQi8wEKGkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSNwoNZXhpdGluZ190cmVlcxgCIAMoCzISLnNwYXJrLkV4aXRpbmdUcmVlUgxleGl0aW5nVHJlZXMSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJKChBwcmV2aW91c19vdXRwdXRzGAQgAygLMh8uc3BhcmsuQml0Y29pblRyYW5zYWN0aW9uT3V0cHV0Ug9wcmV2aW91c091dHB1dHMibgobRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlEk8KD3NpZ25pbmdfcmVzdWx0cxgBIAMoCzImLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZVNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIloKHVF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkizwEKHlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZRJoChFub2RlX2Rpc3RyaWJ1dGlvbhgBIAMoCzI7LnNwYXJrLlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZS5Ob2RlRGlzdHJpYnV0aW9uRW50cnlSEG5vZGVEaXN0cmlidXRpb24aQwoVTm9kZURpc3RyaWJ1dGlvbkVudHJ5EhAKA2tleRgBIAEoBFIDa2V5EhQKBXZhbHVlGAIgASgEUgV2YWx1ZToCOAEimQEKGFF1ZXJ5Tm9kZXNCeVZhbHVlUmVxdWVzdBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EhQKBXZhbHVlGAIgASgDUgV2YWx1ZRIWCgZvZmZzZXQYAyABKANSBm9mZnNldBIUCgVsaW1pdBgEIAEoA1IFbGltaXQiwQEKGVF1ZXJ5Tm9kZXNCeVZhbHVlUmVzcG9uc2USQQoFbm9kZXMYASADKAsyKy5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlc3BvbnNlLk5vZGVzRW50cnlSBW5vZGVzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0GkkKCk5vZGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSJQoFdmFsdWUYAiABKAsyDy5zcGFyay5UcmVlTm9kZVIFdmFsdWU6AjgBIrYBChlHZXRVdHhvc0ZvckFkZHJlc3NSZXF1ZXN0EhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSFgoGb2Zmc2V0GAIgASgEUgZvZmZzZXQSFAoFbGltaXQYAyABKARSBWxpbWl0EigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEicKD2V4Y2x1ZGVfY2xhaW1lZBgFIAEoCFIOZXhjbHVkZUNsYWltZWQiVwoaR2V0VXR4b3NGb3JBZGRyZXNzUmVzcG9uc2USIQoFdXR4b3MYASADKAsyCy5zcGFyay5VVFhPUgV1dHhvcxIWCgZvZmZzZXQYAiABKARSBm9mZnNldCJjChlRdWVyeVNwYXJrSW52b2ljZXNSZXF1ZXN0EhQKBWxpbWl0GAEgASgDUgVsaW1pdBIWCgZvZmZzZXQYAiABKANSBm9mZnNldBIYCgdpbnZvaWNlGAMgAygJUgdpbnZvaWNlIncKGlF1ZXJ5U3BhcmtJbnZvaWNlc1Jlc3BvbnNlEhYKBm9mZnNldBgBIAEoA1IGb2Zmc2V0EkEKEGludm9pY2Vfc3RhdHVzZXMYAiADKAsyFi5zcGFyay5JbnZvaWNlUmVzcG9uc2VSD2ludm9pY2VTdGF0dXNlcyLlAQoPSW52b2ljZVJlc3BvbnNlEhgKB2ludm9pY2UYASABKAlSB2ludm9pY2USLAoGc3RhdHVzGAIgASgOMhQuc3BhcmsuSW52b2ljZVN0YXR1c1IGc3RhdHVzEjoKDXNhdHNfdHJhbnNmZXIYAyABKAsyEy5zcGFyay5TYXRzVHJhbnNmZXJIAFIMc2F0c1RyYW5zZmVyEj0KDnRva2VuX3RyYW5zZmVyGAQgASgLMhQuc3BhcmsuVG9rZW5UcmFuc2ZlckgAUg10b2tlblRyYW5zZmVyQg8KDXRyYW5zZmVyX3R5cGUiOAoMU2F0c1RyYW5zZmVyEigKC3RyYW5zZmVyX2lkGAEgASgMQgf6QgR6AmgQUgp0cmFuc2ZlcklkIlkKDVRva2VuVHJhbnNmZXISSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaCKtAQoiSW5pdGlhdGVTd2FwUHJpbWFyeVRyYW5zZmVyUmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchJOChNhZGFwdG9yX3B1YmxpY19rZXlzGAIgASgLMh4uc3BhcmsuQWRhcHRvclB1YmxpY0tleVBhY2thZ2VSEWFkYXB0b3JQdWJsaWNLZXlzIp0BCiNJbml0aWF0ZVN3YXBQcmltYXJ5VHJhbnNmZXJSZXNwb25zZRIrCgh0cmFuc2ZlchgBIAEoCzIPLnNwYXJrLlRyYW5zZmVyUgh0cmFuc2ZlchJJCg9zaWduaW5nX3Jlc3VsdHMYAiADKAsyIC5zcGFyay5MZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0Ug5zaWduaW5nUmVzdWx0cyLPAQoXQWRhcHRvclB1YmxpY0tleVBhY2thZ2USLAoSYWRhcHRvcl9wdWJsaWNfa2V5GAEgASgMUhBhZGFwdG9yUHVibGljS2V5EjkKGWRpcmVjdF9hZGFwdG9yX3B1YmxpY19rZXkYAiABKAxSFmRpcmVjdEFkYXB0b3JQdWJsaWNLZXkSSwojZGlyZWN0X2Zyb21fY3BmcF9hZGFwdG9yX3B1YmxpY19rZXkYAyABKAxSHmRpcmVjdEZyb21DcGZwQWRhcHRvclB1YmxpY0tleSLmAQoNV2FsbGV0U2V0dGluZxJCChlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUhZvd25lcklkZW50aXR5UHVibGljS2V5EicKD3ByaXZhdGVfZW5hYmxlZBgCIAEoCFIOcHJpdmF0ZUVuYWJsZWQSSQoabWFzdGVyX2lkZW50aXR5X3B1YmxpY19rZXkYAyABKAxCB/pCBHoCaCFIAFIXbWFzdGVySWRlbnRpdHlQdWJsaWNLZXmIAQFCHQobX21hc3Rlcl9pZGVudGl0eV9wdWJsaWNfa2V5IowCChpVcGRhdGVXYWxsZXRTZXR0aW5nUmVxdWVzdBIsCg9wcml2YXRlX2VuYWJsZWQYASABKAhIAVIOcHJpdmF0ZUVuYWJsZWSIAQESRAoec2V0X21hc3Rlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMSABSGnNldE1hc3RlcklkZW50aXR5UHVibGljS2V5EkgKIGNsZWFyX21hc3Rlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAMgASgISABSHGNsZWFyTWFzdGVySWRlbnRpdHlQdWJsaWNLZXlCHAoabWFzdGVyX2lkZW50aXR5X3B1YmxpY19rZXlCEgoQX3ByaXZhdGVfZW5hYmxlZCJaChtVcGRhdGVXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nIhsKGVF1ZXJ5V2FsbGV0U2V0dGluZ1JlcXVlc3QiWQoaUXVlcnlXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nKk0KB05ldHdvcmsSDwoLVU5TUEVDSUZJRUQQABILCgdNQUlOTkVUEAESCwoHUkVHVEVTVBACEgsKB1RFU1RORVQQAxIKCgZTSUdORVQQBCojCglEaXJlY3Rpb24SCAoETkVYVBAAEgwKCFBSRVZJT1VTEAEq/AMKDlRyYW5zZmVyU3RhdHVzEiQKIFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEEAASLAooVFJBTlNGRVJfU1RBVFVTX1NFTkRFUl9LRVlfVFdFQUtfUEVORElORxABEiYKIlRSQU5TRkVSX1NUQVRVU19TRU5ERVJfS0VZX1RXRUFLRUQQAhIoCiRUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLRUQQAxIqCiZUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfUkVGVU5EX1NJR05FRBAEEh0KGVRSQU5TRkVSX1NUQVRVU19DT01QTEVURUQQBRIbChdUUkFOU0ZFUl9TVEFUVVNfRVhQSVJFRBAGEhwKGFRSQU5TRkVSX1NUQVRVU19SRVRVUk5FRBAHEjAKLFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEX0NPT1JESU5BVE9SEAgSLQopVFJBTlNGRVJfU1RBVFVTX1JFQ0VJVkVSX0tFWV9UV0VBS19MT0NLRUQQCRIuCipUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLX0FQUExJRUQQChItCilUUkFOU0ZFUl9TVEFUVVNfQVBQTFlJTkdfU0VOREVSX0tFWV9UV0VBSxALKpoBCgxUcmFuc2ZlclR5cGUSEQoNUFJFSU1BR0VfU1dBUBAAEhQKEENPT1BFUkFUSVZFX0VYSVQQARIMCghUUkFOU0ZFUhACEg0KCVVUWE9fU1dBUBADEggKBFNXQVAQHhIQCgxDT1VOVEVSX1NXQVAQKBITCg9QUklNQVJZX1NXQVBfVjMQBBITCg9DT1VOVEVSX1NXQVBfVjMQBSomCgVPcmRlchIOCgpERVNDRU5ESU5HEAASDQoJQVNDRU5ESU5HEAEqnAEKFVByZWltYWdlUmVxdWVzdFN0YXR1cxIwCixQUkVJTUFHRV9SRVFVRVNUX1NUQVRVU19XQUlUSU5HX0ZPUl9QUkVJTUFHRRAAEisKJ1BSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1BSRUlNQUdFX1NIQVJFRBABEiQKIFBSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1JFVFVSTkVEEAIqigEKE1ByZWltYWdlUmVxdWVzdFJvbGUSIgoeUFJFSU1BR0VfUkVRVUVTVF9ST0xFX1JFQ0VJVkVSEAASIAocUFJFSU1BR0VfUkVRVUVTVF9ST0xFX1NFTkRFUhABEi0KKVBSRUlNQUdFX1JFUVVFU1RfUk9MRV9SRUNFSVZFUl9BTkRfU0VOREVSEAIqOAoTVXR4b1N3YXBSZXF1ZXN0VHlwZRIJCgVGaXhlZBAAEgoKBk1heEZlZRABEgoKBlJlZnVuZBACKk4KDUludm9pY2VTdGF0dXMSDQoJTk9UX0ZPVU5EEAASCwoHUEVORElORxABEg0KCUZJTkFMSVpFRBACEgwKCFJFVFVSTkVEEAQiBAgDEAMqgwMKDlRyZWVOb2RlU3RhdHVzEh0KGVRSRUVfTk9ERV9TVEFUVVNfQ1JFQVRJTkcQABIeChpUUkVFX05PREVfU1RBVFVTX0FWQUlMQUJMRRABEiUKIVRSRUVfTk9ERV9TVEFUVVNfRlJPWkVOX0JZX0lTU1VFUhACEiQKIFRSRUVfTk9ERV9TVEFUVVNfVFJBTlNGRVJfTE9DS0VEEAMSIQodVFJFRV9OT0RFX1NUQVRVU19TUExJVF9MT0NLRUQQBBIdChlUUkVFX05PREVfU1RBVFVTX1NQTElUVEVEEAUSHwobVFJFRV9OT0RFX1NUQVRVU19BR0dSRUdBVEVEEAYSHQoZVFJFRV9OT0RFX1NUQVRVU19PTl9DSEFJThAHEiMKH1RSRUVfTk9ERV9TVEFUVVNfQUdHUkVHQVRFX0xPQ0sQCBIbChdUUkVFX05PREVfU1RBVFVTX0VYSVRFRBAJEiEKHVRSRUVfTk9ERV9TVEFUVVNfUkVORVdfTE9DS0VEEAoyxxkKDFNwYXJrU2VydmljZRJpChhnZW5lcmF0ZV9kZXBvc2l0X2FkZHJlc3MSJC5zcGFyay5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVxdWVzdBolLnNwYXJrLkdlbmVyYXRlRGVwb3NpdEFkZHJlc3NSZXNwb25zZSIAEnwKH2dlbmVyYXRlX3N0YXRpY19kZXBvc2l0X2FkZHJlc3MSKi5zcGFyay5HZW5lcmF0ZVN0YXRpY0RlcG9zaXRBZGRyZXNzUmVxdWVzdBorLnNwYXJrLkdlbmVyYXRlU3RhdGljRGVwb3NpdEFkZHJlc3NSZXNwb25zZSIAEnAKG3N0YXJ0X2RlcG9zaXRfdHJlZV9jcmVhdGlvbhImLnNwYXJrLlN0YXJ0RGVwb3NpdFRyZWVDcmVhdGlvblJlcXVlc3QaJy5zcGFyay5TdGFydERlcG9zaXRUcmVlQ3JlYXRpb25SZXNwb25zZSIAEn8KJ2ZpbmFsaXplX3RyYW5zZmVyX3dpdGhfdHJhbnNmZXJfcGFja2FnZRIxLnNwYXJrLkZpbmFsaXplVHJhbnNmZXJXaXRoVHJhbnNmZXJQYWNrYWdlUmVxdWVzdBofLnNwYXJrLkZpbmFsaXplVHJhbnNmZXJSZXNwb25zZSIAElEKF3F1ZXJ5X3BlbmRpbmdfdHJhbnNmZXJzEhUuc3BhcmsuVHJhbnNmZXJGaWx0ZXIaHS5zcGFyay5RdWVyeVRyYW5zZmVyc1Jlc3BvbnNlIgASTQoTcXVlcnlfYWxsX3RyYW5zZmVycxIVLnNwYXJrLlRyYW5zZmVyRmlsdGVyGh0uc3BhcmsuUXVlcnlUcmFuc2ZlcnNSZXNwb25zZSIAElsKGWNsYWltX3RyYW5zZmVyX3R3ZWFrX2tleXMSJC5zcGFyay5DbGFpbVRyYW5zZmVyVHdlYWtLZXlzUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIAElIKFHN0b3JlX3ByZWltYWdlX3NoYXJlEiAuc3BhcmsuU3RvcmVQcmVpbWFnZVNoYXJlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIAEmYKF2dldF9zaWduaW5nX2NvbW1pdG1lbnRzEiMuc3BhcmsuR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVxdWVzdBokLnNwYXJrLkdldFNpZ25pbmdDb21taXRtZW50c1Jlc3BvbnNlIgASUwoQcHJvdmlkZV9wcmVpbWFnZRIdLnNwYXJrLlByb3ZpZGVQcmVpbWFnZVJlcXVlc3QaHi5zcGFyay5Qcm92aWRlUHJlaW1hZ2VSZXNwb25zZSIAEkEKCnF1ZXJ5X2h0bGMSFy5zcGFyay5RdWVyeUh0bGNSZXF1ZXN0Ghguc3BhcmsuUXVlcnlIdGxjUmVzcG9uc2UiABJBCgpyZW5ld19sZWFmEhcuc3BhcmsuUmVuZXdMZWFmUmVxdWVzdBoYLnNwYXJrLlJlbmV3TGVhZlJlc3BvbnNlIgASXAoZZ2V0X3NpZ25pbmdfb3BlcmF0b3JfbGlzdBIWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRolLnNwYXJrLkdldFNpZ25pbmdPcGVyYXRvckxpc3RSZXNwb25zZSIAEkQKC3F1ZXJ5X25vZGVzEhguc3BhcmsuUXVlcnlOb2Rlc1JlcXVlc3QaGS5zcGFyay5RdWVyeU5vZGVzUmVzcG9uc2UiABJKCg1xdWVyeV9iYWxhbmNlEhouc3BhcmsuUXVlcnlCYWxhbmNlUmVxdWVzdBobLnNwYXJrLlF1ZXJ5QmFsYW5jZVJlc3BvbnNlIgASagoZcXVlcnlfdXNlcl9zaWduZWRfcmVmdW5kcxIkLnNwYXJrLlF1ZXJ5VXNlclNpZ25lZFJlZnVuZHNSZXF1ZXN0GiUuc3BhcmsuUXVlcnlVc2VyU2lnbmVkUmVmdW5kc1Jlc3BvbnNlIgASeQoecXVlcnlfdW51c2VkX2RlcG9zaXRfYWRkcmVzc2VzEikuc3BhcmsuUXVlcnlVbnVzZWREZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBoqLnNwYXJrLlF1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlIgASeQoecXVlcnlfc3RhdGljX2RlcG9zaXRfYWRkcmVzc2VzEikuc3BhcmsuUXVlcnlTdGF0aWNEZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBoqLnNwYXJrLlF1ZXJ5U3RhdGljRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlIgASXAoTc3Vic2NyaWJlX3RvX2V2ZW50cxIfLnNwYXJrLlN1YnNjcmliZVRvRXZlbnRzUmVxdWVzdBogLnNwYXJrLlN1YnNjcmliZVRvRXZlbnRzUmVzcG9uc2UiADABEoYBCiNpbml0aWF0ZV9zdGF0aWNfZGVwb3NpdF91dHhvX3JlZnVuZBItLnNwYXJrLkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXF1ZXN0Gi4uc3BhcmsuSW5pdGlhdGVTdGF0aWNEZXBvc2l0VXR4b1JlZnVuZFJlc3BvbnNlIgASYQoWZXhpdF9zaW5nbGVfbm9kZV90cmVlcxIhLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0GiIuc3BhcmsuRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlIgASVgoTY29vcGVyYXRpdmVfZXhpdF92MhIdLnNwYXJrLkNvb3BlcmF0aXZlRXhpdFJlcXVlc3QaHi5zcGFyay5Db29wZXJhdGl2ZUV4aXRSZXNwb25zZSIAEnMKHmNsYWltX3RyYW5zZmVyX3NpZ25fcmVmdW5kc192MhImLnNwYXJrLkNsYWltVHJhbnNmZXJTaWduUmVmdW5kc1JlcXVlc3QaJy5zcGFyay5DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXNwb25zZSIAEmwKG2ZpbmFsaXplX25vZGVfc2lnbmF0dXJlc192MhIkLnNwYXJrLkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXF1ZXN0GiUuc3BhcmsuRmluYWxpemVOb2RlU2lnbmF0dXJlc1Jlc3BvbnNlIgASZgoZaW5pdGlhdGVfcHJlaW1hZ2Vfc3dhcF92MhIiLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdBojLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2UiABJmChlpbml0aWF0ZV9wcmVpbWFnZV9zd2FwX3YzEiIuc3BhcmsuSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXF1ZXN0GiMuc3BhcmsuSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXNwb25zZSIAElEKEnN0YXJ0X2xlYWZfc3dhcF92MhIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ghwuc3BhcmsuU3RhcnRUcmFuc2ZlclJlc3BvbnNlIgASUAoRc3RhcnRfdHJhbnNmZXJfdjISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIAEl4KFWdldF91dHhvc19mb3JfYWRkcmVzcxIgLnNwYXJrLkdldFV0eG9zRm9yQWRkcmVzc1JlcXVlc3QaIS5zcGFyay5HZXRVdHhvc0ZvckFkZHJlc3NSZXNwb25zZSIAEl0KFHF1ZXJ5X3NwYXJrX2ludm9pY2VzEiAuc3BhcmsuUXVlcnlTcGFya0ludm9pY2VzUmVxdWVzdBohLnNwYXJrLlF1ZXJ5U3BhcmtJbnZvaWNlc1Jlc3BvbnNlIgASeQoeaW5pdGlhdGVfc3dhcF9wcmltYXJ5X3RyYW5zZmVyEikuc3BhcmsuSW5pdGlhdGVTd2FwUHJpbWFyeVRyYW5zZmVyUmVxdWVzdBoqLnNwYXJrLkluaXRpYXRlU3dhcFByaW1hcnlUcmFuc2ZlclJlc3BvbnNlIgASYAoVdXBkYXRlX3dhbGxldF9zZXR0aW5nEiEuc3BhcmsuVXBkYXRlV2FsbGV0U2V0dGluZ1JlcXVlc3QaIi5zcGFyay5VcGRhdGVXYWxsZXRTZXR0aW5nUmVzcG9uc2UiABJdChRxdWVyeV93YWxsZXRfc2V0dGluZxIgLnNwYXJrLlF1ZXJ5V2FsbGV0U2V0dGluZ1JlcXVlc3QaIS5zcGFyay5RdWVyeVdhbGxldFNldHRpbmdSZXNwb25zZSIAQixaKmdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9zcGFya2IGcHJvdG8zCppWChFzcGFya190b2tlbi5wcm90bxILc3BhcmtfdG9rZW4aH2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8aC3NwYXJrLnByb3RvGhd2YWxpZGF0ZS92YWxpZGF0ZS5wcm90byKbAQoSVG9rZW5PdXRwdXRUb1NwZW5kEkYKG3ByZXZfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIYcHJldlRva2VuVHJhbnNhY3Rpb25IYXNoEj0KG3ByZXZfdG9rZW5fdHJhbnNhY3Rpb25fdm91dBgCIAEoDVIYcHJldlRva2VuVHJhbnNhY3Rpb25Wb3V0Il8KElRva2VuVHJhbnNmZXJJbnB1dBJJChBvdXRwdXRzX3RvX3NwZW5kGAEgAygLMh8uc3BhcmtfdG9rZW4uVG9rZW5PdXRwdXRUb1NwZW5kUg5vdXRwdXRzVG9TcGVuZCKTAQoOVG9rZW5NaW50SW5wdXQSMwoRaXNzdWVyX3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSD2lzc3VlclB1YmxpY0tleRI3ChB0b2tlbl9pZGVudGlmaWVyGAIgASgMQgf6QgR6AmggSABSD3Rva2VuSWRlbnRpZmllcogBAUITChFfdG9rZW5faWRlbnRpZmllciK/AwoQVG9rZW5DcmVhdGVJbnB1dBIzChFpc3N1ZXJfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIPaXNzdWVyUHVibGljS2V5EiYKCnRva2VuX25hbWUYAiABKAlCB/pCBHICGBRSCXRva2VuTmFtZRIqCgx0b2tlbl90aWNrZXIYAyABKAlCB/pCBHICGAZSC3Rva2VuVGlja2VyEiQKCGRlY2ltYWxzGAQgASgNQgj6QgUqAxj/AVIIZGVjaW1hbHMSJgoKbWF4X3N1cHBseRgFIAEoDEIH+kIEegJoEFIJbWF4U3VwcGx5EiEKDGlzX2ZyZWV6YWJsZRgGIAEoCFILaXNGcmVlemFibGUSSQoaY3JlYXRpb25fZW50aXR5X3B1YmxpY19rZXkYByABKAxCB/pCBHoCaCFIAFIXY3JlYXRpb25FbnRpdHlQdWJsaWNLZXmIAQESNAoOZXh0cmFfbWV0YWRhdGEYCCABKAxCCPpCBXoDGIAISAFSDWV4dHJhTWV0YWRhdGGIAQFCHQobX2NyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5QhEKD19leHRyYV9tZXRhZGF0YSLHBAoLVG9rZW5PdXRwdXQSHQoCaWQYASABKAlCCPpCBXIDsAEBSABSAmlkiAEBEjEKEG93bmVyX3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSDm93bmVyUHVibGljS2V5EkEKFXJldm9jYXRpb25fY29tbWl0bWVudBgDIAEoDEIH+kIEegJoIUgBUhRyZXZvY2F0aW9uQ29tbWl0bWVudIgBARIxChJ3aXRoZHJhd19ib25kX3NhdHMYBCABKARIAlIQd2l0aGRyYXdCb25kU2F0c4gBARJMCiB3aXRoZHJhd19yZWxhdGl2ZV9ibG9ja19sb2NrdGltZRgFIAEoBEgDUh13aXRoZHJhd1JlbGF0aXZlQmxvY2tMb2NrdGltZYgBARI2ChB0b2tlbl9wdWJsaWNfa2V5GAYgASgMQgf6QgR6AmghSARSDnRva2VuUHVibGljS2V5iAEBEjcKEHRva2VuX2lkZW50aWZpZXIYCCABKAxCB/pCBHoCaCBIBVIPdG9rZW5JZGVudGlmaWVyiAEBEioKDHRva2VuX2Ftb3VudBgHIAEoDEIH+kIEegJoEFILdG9rZW5BbW91bnRCBQoDX2lkQhgKFl9yZXZvY2F0aW9uX2NvbW1pdG1lbnRCFQoTX3dpdGhkcmF3X2JvbmRfc2F0c0IjCiFfd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWVCEwoRX3Rva2VuX3B1YmxpY19rZXlCEwoRX3Rva2VuX2lkZW50aWZpZXIingIKElBhcnRpYWxUb2tlbk91dHB1dBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIsChJ3aXRoZHJhd19ib25kX3NhdHMYAiABKARSEHdpdGhkcmF3Qm9uZFNhdHMSRwogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYAyABKARSHXdpdGhkcmF3UmVsYXRpdmVCbG9ja0xvY2t0aW1lEjIKEHRva2VuX2lkZW50aWZpZXIYBCABKAxCB/pCBHoCaCBSD3Rva2VuSWRlbnRpZmllchIqCgx0b2tlbl9hbW91bnQYBSABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50IqMBChBGaW5hbFRva2VuT3V0cHV0ElEKFHBhcnRpYWxfdG9rZW5fb3V0cHV0GAEgASgLMh8uc3BhcmtfdG9rZW4uUGFydGlhbFRva2VuT3V0cHV0UhJwYXJ0aWFsVG9rZW5PdXRwdXQSPAoVcmV2b2NhdGlvbl9jb21taXRtZW50GAIgASgMQgf6QgR6AmghUhRyZXZvY2F0aW9uQ29tbWl0bWVudCKaBgoQVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEjwKCm1pbnRfaW5wdXQYAiABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYAyABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYCCABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0Ej0KDXRva2VuX291dHB1dHMYBCADKAsyGC5zcGFya190b2tlbi5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAUgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSOwoLZXhwaXJ5X3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgpleHBpcnlUaW1lEjIKB25ldHdvcmsYByABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxJUChhjbGllbnRfY3JlYXRlZF90aW1lc3RhbXAYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUhZjbGllbnRDcmVhdGVkVGltZXN0YW1wEk8KE2ludm9pY2VfYXR0YWNobWVudHMYCiADKAsyHi5zcGFya190b2tlbi5JbnZvaWNlQXR0YWNobWVudFISaW52b2ljZUF0dGFjaG1lbnRzEj8KGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYCyABKARIAVIXdmFsaWRpdHlEdXJhdGlvblNlY29uZHOIAQFCDgoMdG9rZW5faW5wdXRzQhwKGl92YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzIpkDChhUb2tlblRyYW5zYWN0aW9uTWV0YWRhdGESWgojc3Bhcmtfb3BlcmF0b3JfaWRlbnRpdHlfcHVibGljX2tleXMYAiADKAxCDPpCCZIBBiIEegJoIVIfc3BhcmtPcGVyYXRvcklkZW50aXR5UHVibGljS2V5cxIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSVAoYY2xpZW50X2NyZWF0ZWRfdGltZXN0YW1wGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIWY2xpZW50Q3JlYXRlZFRpbWVzdGFtcBJGChl2YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzGAUgASgEQgr6QgcyBRisAigBUhd2YWxpZGl0eUR1cmF0aW9uU2Vjb25kcxJPChNpbnZvaWNlX2F0dGFjaG1lbnRzGAYgAygLMh4uc3BhcmtfdG9rZW4uSW52b2ljZUF0dGFjaG1lbnRSEmludm9pY2VBdHRhY2htZW50cyLJAwoXUGFydGlhbFRva2VuVHJhbnNhY3Rpb24SGAoHdmVyc2lvbhgBIAEoDVIHdmVyc2lvbhJjChp0b2tlbl90cmFuc2FjdGlvbl9tZXRhZGF0YRgCIAEoCzIlLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25NZXRhZGF0YVIYdG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhEjwKCm1pbnRfaW5wdXQYAyABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYBCABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYBSABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0ElMKFXBhcnRpYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIfLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlbk91dHB1dFITcGFydGlhbFRva2VuT3V0cHV0c0IOCgx0b2tlbl9pbnB1dHMiwQMKFUZpbmFsVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEmMKGnRva2VuX3RyYW5zYWN0aW9uX21ldGFkYXRhGAIgASgLMiUuc3BhcmtfdG9rZW4uVG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhUhh0b2tlblRyYW5zYWN0aW9uTWV0YWRhdGESPAoKbWludF9pbnB1dBgDIAEoCzIbLnNwYXJrX3Rva2VuLlRva2VuTWludElucHV0SABSCW1pbnRJbnB1dBJICg50cmFuc2Zlcl9pbnB1dBgEIAEoCzIfLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNmZXJJbnB1dEgAUg10cmFuc2ZlcklucHV0EkIKDGNyZWF0ZV9pbnB1dBgFIAEoCzIdLnNwYXJrX3Rva2VuLlRva2VuQ3JlYXRlSW5wdXRIAFILY3JlYXRlSW5wdXQSTQoTZmluYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIdLnNwYXJrX3Rva2VuLkZpbmFsVG9rZW5PdXRwdXRSEWZpbmFsVG9rZW5PdXRwdXRzQg4KDHRva2VuX2lucHV0cyI4ChFJbnZvaWNlQXR0YWNobWVudBIjCg1zcGFya19pbnZvaWNlGAEgASgJUgxzcGFya0ludm9pY2UiXgoSU2lnbmF0dXJlV2l0aEluZGV4EicKCXNpZ25hdHVyZRgBIAEoDEIJ+kIGegQQQBhJUglzaWduYXR1cmUSHwoLaW5wdXRfaW5kZXgYAiABKA1SCmlucHV0SW5kZXgitAEKHklucHV0VHR4b1NpZ25hdHVyZXNQZXJPcGVyYXRvchJICg90dHhvX3NpZ25hdHVyZXMYASADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSDnR0eG9TaWduYXR1cmVzEkgKHG9wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSGW9wZXJhdG9ySWRlbnRpdHlQdWJsaWNLZXki8gIKF1N0YXJ0VHJhbnNhY3Rpb25SZXF1ZXN0EjcKE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5ElkKGXBhcnRpYWxfdG9rZW5fdHJhbnNhY3Rpb24YAiABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJ7CipwYXJ0aWFsX3Rva2VuX3RyYW5zYWN0aW9uX293bmVyX3NpZ25hdHVyZXMYAyADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSJnBhcnRpYWxUb2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzEkYKGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYBCABKARCCvpCBzIFGKwCKAFSF3ZhbGlkaXR5RHVyYXRpb25TZWNvbmRzIq4BChhTdGFydFRyYW5zYWN0aW9uUmVzcG9uc2USVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SOwoNa2V5c2hhcmVfaW5mbxgCIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIMa2V5c2hhcmVJbmZvIvgCChhDb21taXRUcmFuc2FjdGlvblJlcXVlc3QSVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgCIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJ3CiJpbnB1dF90dHhvX3NpZ25hdHVyZXNfcGVyX29wZXJhdG9yGAMgAygLMisuc3BhcmtfdG9rZW4uSW5wdXRUdHhvU2lnbmF0dXJlc1Blck9wZXJhdG9yUh5pbnB1dFR0eG9TaWduYXR1cmVzUGVyT3BlcmF0b3ISQgoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDEIH+kIEegJoIVIWb3duZXJJZGVudGl0eVB1YmxpY0tleSK6AQoOQ29tbWl0UHJvZ3Jlc3MSUQoeY29tbWl0dGVkX29wZXJhdG9yX3B1YmxpY19rZXlzGAEgAygMQgz6QgmSAQYiBHoCaCFSG2NvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cxJVCiB1bmNvbW1pdHRlZF9vcGVyYXRvcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUh11bmNvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cyKhAQoZQ29tbWl0VHJhbnNhY3Rpb25SZXNwb25zZRI+Cg1jb21taXRfc3RhdHVzGAEgASgOMhkuc3BhcmtfdG9rZW4uQ29tbWl0U3RhdHVzUgxjb21taXRTdGF0dXMSRAoPY29tbWl0X3Byb2dyZXNzGAIgASgLMhsuc3BhcmtfdG9rZW4uQ29tbWl0UHJvZ3Jlc3NSDmNvbW1pdFByb2dyZXNzIqYCChtCcm9hZGNhc3RUcmFuc2FjdGlvblJlcXVlc3QSNwoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIRaWRlbnRpdHlQdWJsaWNLZXkSYAoZcGFydGlhbF90b2tlbl90cmFuc2FjdGlvbhgCIAEoCzIkLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJsCiJ0b2tlbl90cmFuc2FjdGlvbl9vd25lcl9zaWduYXR1cmVzGAMgAygLMh8uc3BhcmtfdG9rZW4uU2lnbmF0dXJlV2l0aEluZGV4Uh90b2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzIoACChxCcm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlEloKF2ZpbmFsX3Rva2VuX3RyYW5zYWN0aW9uGAEgASgLMiIuc3BhcmtfdG9rZW4uRmluYWxUb2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SPgoNY29tbWl0X3N0YXR1cxgCIAEoDjIZLnNwYXJrX3Rva2VuLkNvbW1pdFN0YXR1c1IMY29tbWl0U3RhdHVzEkQKD2NvbW1pdF9wcm9ncmVzcxgDIAEoCzIbLnNwYXJrX3Rva2VuLkNvbW1pdFByb2dyZXNzUg5jb21taXRQcm9ncmVzcyKSAQoZUXVlcnlUb2tlbk1ldGFkYXRhUmVxdWVzdBI5ChF0b2tlbl9pZGVudGlmaWVycxgBIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEjoKEmlzc3Vlcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUhBpc3N1ZXJQdWJsaWNLZXlzIvADCg1Ub2tlbk1ldGFkYXRhEjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBARIyChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggUg90b2tlbklkZW50aWZpZXISNAoOZXh0cmFfbWV0YWRhdGEYCSABKAxCCPpCBXoDGIAISAFSDWV4dHJhTWV0YWRhdGGIAQFCHQobX2NyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5QhEKD19leHRyYV9tZXRhZGF0YSJfChpRdWVyeVRva2VuTWV0YWRhdGFSZXNwb25zZRJBCg50b2tlbl9tZXRhZGF0YRgBIAMoCzIaLnNwYXJrX3Rva2VuLlRva2VuTWV0YWRhdGFSDXRva2VuTWV0YWRhdGEirAIKGFF1ZXJ5VG9rZW5PdXRwdXRzUmVxdWVzdBI4ChFvd25lcl9wdWJsaWNfa2V5cxgBIAMoDEIM+kIJkgEGIgR6AmghUg9vd25lclB1YmxpY0tleXMSOgoSaXNzdWVyX3B1YmxpY19rZXlzGAIgAygMQgz6QgmSAQYiBHoCaCFSEGlzc3VlclB1YmxpY0tleXMSOQoRdG9rZW5faWRlbnRpZmllcnMYBCADKAxCDPpCCZIBBiIEegJoIFIQdG9rZW5JZGVudGlmaWVycxIoCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yaxI1CgxwYWdlX3JlcXVlc3QYBSABKAsyEi5zcGFyay5QYWdlUmVxdWVzdFILcGFnZVJlcXVlc3QirQMKHVF1ZXJ5VG9rZW5UcmFuc2FjdGlvbnNSZXF1ZXN0EiwKCm91dHB1dF9pZHMYASADKAlCDfpCCpIBByIFcgOwAQFSCW91dHB1dElkcxI4ChFvd25lcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUg9vd25lclB1YmxpY0tleXMSOgoSaXNzdWVyX3B1YmxpY19rZXlzGAMgAygMQgz6QgmSAQYiBHoCaCFSEGlzc3VlclB1YmxpY0tleXMSOQoRdG9rZW5faWRlbnRpZmllcnMYByADKAxCDPpCCZIBBiIEegJoIFIQdG9rZW5JZGVudGlmaWVycxJGChh0b2tlbl90cmFuc2FjdGlvbl9oYXNoZXMYBCADKAxCDPpCCZIBBiIEegJoIFIWdG9rZW5UcmFuc2FjdGlvbkhhc2hlcxIiCgVvcmRlchgIIAEoDjIMLnNwYXJrLk9yZGVyUgVvcmRlchIgCgVsaW1pdBgFIAEoA0IK+kIHIgUY6AcoAFIFbGltaXQSHwoGb2Zmc2V0GAYgASgDQgf6QgQiAigAUgZvZmZzZXQipgEKHlF1ZXJ5VG9rZW5UcmFuc2FjdGlvbnNSZXNwb25zZRJsCh50b2tlbl90cmFuc2FjdGlvbnNfd2l0aF9zdGF0dXMYASADKAsyJy5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uV2l0aFN0YXR1c1IbdG9rZW5UcmFuc2FjdGlvbnNXaXRoU3RhdHVzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0ItYBCiFPdXRwdXRXaXRoUHJldmlvdXNUcmFuc2FjdGlvbkRhdGESMAoGb3V0cHV0GAEgASgLMhguc3BhcmtfdG9rZW4uVG9rZW5PdXRwdXRSBm91dHB1dBJDChlwcmV2aW91c190cmFuc2FjdGlvbl9oYXNoGAIgASgMQgf6QgR6AmggUhdwcmV2aW91c1RyYW5zYWN0aW9uSGFzaBI6ChlwcmV2aW91c190cmFuc2FjdGlvbl92b3V0GAMgASgNUhdwcmV2aW91c1RyYW5zYWN0aW9uVm91dCLaAQoZUXVlcnlUb2tlbk91dHB1dHNSZXNwb25zZRKCAQomb3V0cHV0c193aXRoX3ByZXZpb3VzX3RyYW5zYWN0aW9uX2RhdGEYASADKAsyLi5zcGFya190b2tlbi5PdXRwdXRXaXRoUHJldmlvdXNUcmFuc2FjdGlvbkRhdGFSIm91dHB1dHNXaXRoUHJldmlvdXNUcmFuc2FjdGlvbkRhdGESOAoNcGFnZV9yZXNwb25zZRgCIAEoCzITLnNwYXJrLlBhZ2VSZXNwb25zZVIMcGFnZVJlc3BvbnNlImQKGFNwZW50VG9rZW5PdXRwdXRNZXRhZGF0YRIbCglvdXRwdXRfaWQYASABKAlSCG91dHB1dElkEisKEXJldm9jYXRpb25fc2VjcmV0GAIgASgMUhByZXZvY2F0aW9uU2VjcmV0Io4BCiRUb2tlblRyYW5zYWN0aW9uQ29uZmlybWF0aW9uTWV0YWRhdGESZgocc3BlbnRfdG9rZW5fb3V0cHV0c19tZXRhZGF0YRgBIAMoCzIlLnNwYXJrX3Rva2VuLlNwZW50VG9rZW5PdXRwdXRNZXRhZGF0YVIZc3BlbnRUb2tlbk91dHB1dHNNZXRhZGF0YSLMAgoaVG9rZW5UcmFuc2FjdGlvbldpdGhTdGF0dXMSSgoRdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhB0b2tlblRyYW5zYWN0aW9uEjsKBnN0YXR1cxgCIAEoDjIjLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25TdGF0dXNSBnN0YXR1cxJmChVjb25maXJtYXRpb25fbWV0YWRhdGEYAyABKAsyMS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uQ29uZmlybWF0aW9uTWV0YWRhdGFSFGNvbmZpcm1hdGlvbk1ldGFkYXRhEj0KFnRva2VuX3RyYW5zYWN0aW9uX2hhc2gYBCABKAxCB/pCBHoCaCBSFHRva2VuVHJhbnNhY3Rpb25IYXNoIqwDChNGcmVlemVUb2tlbnNQYXlsb2FkEhgKB3ZlcnNpb24YASABKA1SB3ZlcnNpb24SMQoQb3duZXJfcHVibGljX2tleRgCIAEoDEIH+kIEegJoIVIOb3duZXJQdWJsaWNLZXkSNgoQdG9rZW5fcHVibGljX2tleRgDIAEoDEIH+kIEegJoIUgAUg50b2tlblB1YmxpY0tleYgBARI3ChB0b2tlbl9pZGVudGlmaWVyGAQgASgMQgf6QgR6AmggSAFSD3Rva2VuSWRlbnRpZmllcogBARI6Chlpc3N1ZXJfcHJvdmlkZWRfdGltZXN0YW1wGAUgASgEUhdpc3N1ZXJQcm92aWRlZFRpbWVzdGFtcBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAYgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5EicKD3Nob3VsZF91bmZyZWV6ZRgHIAEoCFIOc2hvdWxkVW5mcmVlemVCEwoRX3Rva2VuX3B1YmxpY19rZXlCEwoRX3Rva2VuX2lkZW50aWZpZXIioQEKE0ZyZWV6ZVRva2Vuc1JlcXVlc3QSVAoVZnJlZXplX3Rva2Vuc19wYXlsb2FkGAEgASgLMiAuc3BhcmtfdG9rZW4uRnJlZXplVG9rZW5zUGF5bG9hZFITZnJlZXplVG9rZW5zUGF5bG9hZBI0ChBpc3N1ZXJfc2lnbmF0dXJlGAIgASgMQgn6QgZ6BBBAGElSD2lzc3VlclNpZ25hdHVyZSKJAQoURnJlZXplVG9rZW5zUmVzcG9uc2USPQoTaW1wYWN0ZWRfb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIRaW1wYWN0ZWRPdXRwdXRJZHMSMgoVaW1wYWN0ZWRfdG9rZW5fYW1vdW50GAIgASgMUhNpbXBhY3RlZFRva2VuQW1vdW50KqcBChRUb2tlblRyYW5zYWN0aW9uVHlwZRImCiJUT0tFTl9UUkFOU0FDVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASIQodVE9LRU5fVFJBTlNBQ1RJT05fVFlQRV9DUkVBVEUQARIfChtUT0tFTl9UUkFOU0FDVElPTl9UWVBFX01JTlQQAhIjCh9UT0tFTl9UUkFOU0FDVElPTl9UWVBFX1RSQU5TRkVSEAMqUwoMQ29tbWl0U3RhdHVzEhYKEkNPTU1JVF9VTlNQRUNJRklFRBAAEhUKEUNPTU1JVF9QUk9DRVNTSU5HEAESFAoQQ09NTUlUX0ZJTkFMSVpFRBACKoYCChZUb2tlblRyYW5zYWN0aW9uU3RhdHVzEh0KGVRPS0VOX1RSQU5TQUNUSU9OX1NUQVJURUQQABIcChhUT0tFTl9UUkFOU0FDVElPTl9TSUdORUQQARIeChpUT0tFTl9UUkFOU0FDVElPTl9SRVZFQUxFRBAFEh8KG1RPS0VOX1RSQU5TQUNUSU9OX0ZJTkFMSVpFRBACEicKI1RPS0VOX1RSQU5TQUNUSU9OX1NUQVJURURfQ0FOQ0VMTEVEEAMSJgoiVE9LRU5fVFJBTlNBQ1RJT05fU0lHTkVEX0NBTkNFTExFRBAEEh0KGVRPS0VOX1RSQU5TQUNUSU9OX1VOS05PV04QCjLwBQoRU3BhcmtUb2tlblNlcnZpY2USYgoRc3RhcnRfdHJhbnNhY3Rpb24SJC5zcGFya190b2tlbi5TdGFydFRyYW5zYWN0aW9uUmVxdWVzdBolLnNwYXJrX3Rva2VuLlN0YXJ0VHJhbnNhY3Rpb25SZXNwb25zZSIAEmUKEmNvbW1pdF90cmFuc2FjdGlvbhIlLnNwYXJrX3Rva2VuLkNvbW1pdFRyYW5zYWN0aW9uUmVxdWVzdBomLnNwYXJrX3Rva2VuLkNvbW1pdFRyYW5zYWN0aW9uUmVzcG9uc2UiABJpChRxdWVyeV90b2tlbl9tZXRhZGF0YRImLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5NZXRhZGF0YVJlcXVlc3QaJy5zcGFya190b2tlbi5RdWVyeVRva2VuTWV0YWRhdGFSZXNwb25zZSIAEnUKGHF1ZXJ5X3Rva2VuX3RyYW5zYWN0aW9ucxIqLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5UcmFuc2FjdGlvbnNSZXF1ZXN0Gisuc3BhcmtfdG9rZW4uUXVlcnlUb2tlblRyYW5zYWN0aW9uc1Jlc3BvbnNlIgASZgoTcXVlcnlfdG9rZW5fb3V0cHV0cxIlLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5PdXRwdXRzUmVxdWVzdBomLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5PdXRwdXRzUmVzcG9uc2UiABJWCg1mcmVlemVfdG9rZW5zEiAuc3BhcmtfdG9rZW4uRnJlZXplVG9rZW5zUmVxdWVzdBohLnNwYXJrX3Rva2VuLkZyZWV6ZVRva2Vuc1Jlc3BvbnNlIgASbgoVYnJvYWRjYXN0X3RyYW5zYWN0aW9uEiguc3BhcmtfdG9rZW4uQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXF1ZXN0Gikuc3BhcmtfdG9rZW4uQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXNwb25zZSIAQjJaMGdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9zcGFya190b2tlbmIGcHJvdG8zCqUECgptb2NrLnByb3RvEgRtb2NrGhtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iQAobQ2xlYW5VcFByZWltYWdlU2hhcmVSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2giTQoYVXBkYXRlTm9kZXNTdGF0dXNSZXF1ZXN0EhkKCG5vZGVfaWRzGAEgAygJUgdub2RlSWRzEhYKBnN0YXR1cxgCIAEoCVIGc3RhdHVzIjEKElRyaWdnZXJUYXNrUmVxdWVzdBIbCgl0YXNrX25hbWUYASABKAlSCHRhc2tOYW1lMvoBCgtNb2NrU2VydmljZRJWChdjbGVhbl91cF9wcmVpbWFnZV9zaGFyZRIhLm1vY2suQ2xlYW5VcFByZWltYWdlU2hhcmVSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgASTwoTdXBkYXRlX25vZGVzX3N0YXR1cxIeLm1vY2suVXBkYXRlTm9kZXNTdGF0dXNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgASQgoMdHJpZ2dlcl90YXNrEhgubW9jay5UcmlnZ2VyVGFza1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiAEIrWilnaXRodWIuY29tL2xpZ2h0c3BhcmtkZXYvc3BhcmsvcHJvdG8vbW9ja2IGcHJvdG8zCuoHChFzcGFya19hdXRobi5wcm90bxILc3BhcmtfYXV0aG4ieAoJQ2hhbGxlbmdlEhgKB3ZlcnNpb24YASABKAVSB3ZlcnNpb24SHAoJdGltZXN0YW1wGAIgASgDUgl0aW1lc3RhbXASFAoFbm9uY2UYAyABKAxSBW5vbmNlEh0KCnB1YmxpY19rZXkYBCABKAxSCXB1YmxpY0tleSKFAQoSUHJvdGVjdGVkQ2hhbGxlbmdlEhgKB3ZlcnNpb24YASABKAVSB3ZlcnNpb24SNAoJY2hhbGxlbmdlGAIgASgLMhYuc3BhcmtfYXV0aG4uQ2hhbGxlbmdlUgljaGFsbGVuZ2USHwoLc2VydmVyX2htYWMYAyABKAxSCnNlcnZlckhtYWMiNAoTR2V0Q2hhbGxlbmdlUmVxdWVzdBIdCgpwdWJsaWNfa2V5GAEgASgMUglwdWJsaWNLZXkiaAoUR2V0Q2hhbGxlbmdlUmVzcG9uc2USUAoTcHJvdGVjdGVkX2NoYWxsZW5nZRgBIAEoCzIfLnNwYXJrX2F1dGhuLlByb3RlY3RlZENoYWxsZW5nZVIScHJvdGVjdGVkQ2hhbGxlbmdlIqcBChZWZXJpZnlDaGFsbGVuZ2VSZXF1ZXN0ElAKE3Byb3RlY3RlZF9jaGFsbGVuZ2UYASABKAsyHy5zcGFya19hdXRobi5Qcm90ZWN0ZWRDaGFsbGVuZ2VSEnByb3RlY3RlZENoYWxsZW5nZRIcCglzaWduYXR1cmUYAiABKAxSCXNpZ25hdHVyZRIdCgpwdWJsaWNfa2V5GAMgASgMUglwdWJsaWNLZXkicQoXVmVyaWZ5Q2hhbGxlbmdlUmVzcG9uc2USIwoNc2Vzc2lvbl90b2tlbhgBIAEoCVIMc2Vzc2lvblRva2VuEjEKFGV4cGlyYXRpb25fdGltZXN0YW1wGAIgASgDUhNleHBpcmF0aW9uVGltZXN0YW1wMswBChFTcGFya0F1dGhuU2VydmljZRJWCg1nZXRfY2hhbGxlbmdlEiAuc3BhcmtfYXV0aG4uR2V0Q2hhbGxlbmdlUmVxdWVzdBohLnNwYXJrX2F1dGhuLkdldENoYWxsZW5nZVJlc3BvbnNlIgASXwoQdmVyaWZ5X2NoYWxsZW5nZRIjLnNwYXJrX2F1dGhuLlZlcmlmeUNoYWxsZW5nZVJlcXVlc3QaJC5zcGFya19hdXRobi5WZXJpZnlDaGFsbGVuZ2VSZXNwb25zZSIAQjJaMGdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9zcGFya19hdXRobmIGcHJvdG8z";
8876
8879
  function getSparkDescriptorBytes() {
8877
8880
  const binaryString = atob(SPARK_DESCRIPTORS_BASE64);
8878
8881
  const bytes = new Uint8Array(binaryString.length);
@@ -8898,7 +8901,6 @@ function getRegistry() {
8898
8901
  return _registry;
8899
8902
  }
8900
8903
  try {
8901
- console.log("Loading embedded protobuf descriptors...");
8902
8904
  const descriptorBytes = getSparkDescriptorBytes();
8903
8905
  const descriptorSet = FileDescriptorSet.decode(descriptorBytes);
8904
8906
  _registry = {
@@ -8907,7 +8909,6 @@ function getRegistry() {
8907
8909
  messageMap: /* @__PURE__ */ new Map()
8908
8910
  };
8909
8911
  for (const fileDescriptor of descriptorSet.file) {
8910
- console.log(`Processing proto file: ${fileDescriptor.name}`);
8911
8912
  _registry.fileMap.set(fileDescriptor.name, fileDescriptor);
8912
8913
  if (fileDescriptor.messageType) {
8913
8914
  for (const messageDescriptor of fileDescriptor.messageType) {
@@ -10501,52 +10502,11 @@ function sortInvoiceAttachments(attachments) {
10501
10502
  if (!attachments || attachments.length === 0) {
10502
10503
  return attachments;
10503
10504
  }
10504
- const keyed = [];
10505
- for (let i = 0; i < attachments.length; i++) {
10506
- const attachment = attachments[i];
10507
- if (!attachment) {
10508
- throw new SparkValidationError(
10509
- `invoice attachment at index ${i} cannot be null`,
10510
- {
10511
- field: `invoiceAttachments[${i}]`,
10512
- index: i
10513
- }
10514
- );
10515
- }
10516
- const invoice = attachment.sparkInvoice;
10517
- let idBytes;
10518
- try {
10519
- const decoded = bech32m4.decode(invoice, 500);
10520
- const payload = SparkAddress.decode(bech32m4.fromWords(decoded.words));
10521
- if (!payload.sparkInvoiceFields || !payload.sparkInvoiceFields.id) {
10522
- throw new Error("missing spark invoice fields or id");
10523
- }
10524
- idBytes = payload.sparkInvoiceFields.id;
10525
- } catch (err) {
10526
- throw new SparkValidationError(`invalid invoice at ${i}`, {
10527
- field: `invoiceAttachments[${i}].sparkInvoice`,
10528
- index: i,
10529
- value: invoice,
10530
- error: err
10531
- });
10532
- }
10533
- if (!idBytes || idBytes.length !== 16) {
10534
- throw new SparkValidationError(`invalid invoice id at ${i}`, {
10535
- field: `invoiceAttachments[${i}].sparkInvoice`,
10536
- index: i
10537
- });
10538
- }
10539
- keyed.push({ id: idBytes, attachment });
10540
- }
10541
- keyed.sort((a, b) => {
10542
- for (let j = 0; j < a.id.length && j < b.id.length; j++) {
10543
- const av = a.id[j];
10544
- const bv = b.id[j];
10545
- if (av !== bv) return av - bv;
10546
- }
10547
- return a.id.length - b.id.length;
10505
+ return [...attachments].sort((a, b) => {
10506
+ const invoiceA = a.sparkInvoice;
10507
+ const invoiceB = b.sparkInvoice;
10508
+ return invoiceA < invoiceB ? -1 : invoiceA > invoiceB ? 1 : 0;
10548
10509
  });
10549
- return keyed.map((k) => k.attachment);
10550
10510
  }
10551
10511
  async function hashPartialTokenTransaction(partialTokenTransaction) {
10552
10512
  if (!partialTokenTransaction) {
@@ -12302,6 +12262,31 @@ var UserRequest = `
12302
12262
  `;
12303
12263
 
12304
12264
  // src/graphql/client.ts
12265
+ var RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([
12266
+ 502,
12267
+ // Bad Gateway
12268
+ 503,
12269
+ // Service Unavailable
12270
+ 504
12271
+ // Gateway Timeout
12272
+ ]);
12273
+ function createRetryFetch(baseFetch, maxRetries = 5, baseDelayMs = 1e3) {
12274
+ return async (input, init) => {
12275
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
12276
+ const response = await baseFetch(input, init);
12277
+ if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < maxRetries) {
12278
+ const delay = Math.min(baseDelayMs * Math.pow(2, attempt), 1e4);
12279
+ console.warn(
12280
+ `[SspClient] HTTP ${response.status} (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms`
12281
+ );
12282
+ await new Promise((r) => setTimeout(r, delay));
12283
+ continue;
12284
+ }
12285
+ return response;
12286
+ }
12287
+ throw new Error("Retry loop exited unexpectedly");
12288
+ };
12289
+ }
12305
12290
  var SspClient = class {
12306
12291
  requester;
12307
12292
  signer;
@@ -12312,6 +12297,7 @@ var SspClient = class {
12312
12297
  this.authProvider = new SparkAuthProvider();
12313
12298
  const { fetch } = getFetch();
12314
12299
  const options = config.sspClientOptions;
12300
+ const retryFetch = createRetryFetch(fetch);
12315
12301
  this.requester = new Requester(
12316
12302
  new NodeKeyCache(DefaultCrypto),
12317
12303
  options.schemaEndpoint || `graphql/spark/2025-03-19`,
@@ -12320,7 +12306,7 @@ var SspClient = class {
12320
12306
  options.baseUrl,
12321
12307
  DefaultCrypto,
12322
12308
  void 0,
12323
- fetch
12309
+ retryFetch
12324
12310
  );
12325
12311
  }
12326
12312
  async executeRawQuery(query, needsAuth = true) {
@@ -13375,22 +13361,24 @@ var BaseTransferService = class {
13375
13361
  signingCommitments.signingCommitments.slice(2 * leaves.length)
13376
13362
  );
13377
13363
  const sparkFrost2 = getSparkFrost();
13378
- const encryptedKeyTweaks = {};
13379
- for (const [key, value] of keyTweakInputMap) {
13380
- const protoToEncrypt = {
13381
- leavesToSend: value
13382
- };
13383
- const protoToEncryptBinary = SendLeafKeyTweaks.encode(protoToEncrypt).finish();
13384
- const operator = this.config.getSigningOperators()[key];
13385
- if (!operator) {
13386
- throw new SparkValidationError("Operator not found");
13387
- }
13388
- const encryptedProto = await sparkFrost2.encryptEcies(
13389
- protoToEncryptBinary,
13390
- hexToBytes9(operator.identityPublicKey)
13391
- );
13392
- encryptedKeyTweaks[key] = Uint8Array.from(encryptedProto);
13393
- }
13364
+ const encryptedKeyTweaksEntries = await Promise.all(
13365
+ Array.from(keyTweakInputMap.entries()).map(async ([key, value]) => {
13366
+ const protoToEncrypt = {
13367
+ leavesToSend: value
13368
+ };
13369
+ const protoToEncryptBinary = SendLeafKeyTweaks.encode(protoToEncrypt).finish();
13370
+ const operator = this.config.getSigningOperators()[key];
13371
+ if (!operator) {
13372
+ throw new SparkValidationError("Operator not found");
13373
+ }
13374
+ const encryptedProto = await sparkFrost2.encryptEcies(
13375
+ protoToEncryptBinary,
13376
+ hexToBytes9(operator.identityPublicKey)
13377
+ );
13378
+ return [key, Uint8Array.from(encryptedProto)];
13379
+ })
13380
+ );
13381
+ const encryptedKeyTweaks = Object.fromEntries(encryptedKeyTweaksEntries);
13394
13382
  const transferPackage = {
13395
13383
  leavesToSend: cpfpLeafSigningJobs,
13396
13384
  keyTweakPackage: encryptedKeyTweaks,
@@ -13436,22 +13424,24 @@ var BaseTransferService = class {
13436
13424
  paymentHash
13437
13425
  );
13438
13426
  const sparkFrost2 = getSparkFrost();
13439
- const encryptedKeyTweaks = {};
13440
- for (const [key, value] of keyTweakInputMap) {
13441
- const protoToEncrypt = {
13442
- leavesToSend: value
13443
- };
13444
- const protoToEncryptBinary = SendLeafKeyTweaks.encode(protoToEncrypt).finish();
13445
- const operator = this.config.getSigningOperators()[key];
13446
- if (!operator) {
13447
- throw new SparkValidationError("Operator not found");
13448
- }
13449
- const encryptedProto = await sparkFrost2.encryptEcies(
13450
- protoToEncryptBinary,
13451
- hexToBytes9(operator.identityPublicKey)
13452
- );
13453
- encryptedKeyTweaks[key] = Uint8Array.from(encryptedProto);
13454
- }
13427
+ const encryptedKeyTweaksEntries = await Promise.all(
13428
+ Array.from(keyTweakInputMap.entries()).map(async ([key, value]) => {
13429
+ const protoToEncrypt = {
13430
+ leavesToSend: value
13431
+ };
13432
+ const protoToEncryptBinary = SendLeafKeyTweaks.encode(protoToEncrypt).finish();
13433
+ const operator = this.config.getSigningOperators()[key];
13434
+ if (!operator) {
13435
+ throw new SparkValidationError("Operator not found");
13436
+ }
13437
+ const encryptedProto = await sparkFrost2.encryptEcies(
13438
+ protoToEncryptBinary,
13439
+ hexToBytes9(operator.identityPublicKey)
13440
+ );
13441
+ return [key, Uint8Array.from(encryptedProto)];
13442
+ })
13443
+ );
13444
+ const encryptedKeyTweaks = Object.fromEntries(encryptedKeyTweaksEntries);
13455
13445
  const transferPackage = {
13456
13446
  leavesToSend: cpfpLeafSigningJobs,
13457
13447
  keyTweakPackage: encryptedKeyTweaks,
@@ -13578,19 +13568,25 @@ var BaseTransferService = class {
13578
13568
  }
13579
13569
  async prepareSendTransferKeyTweaks(transferID, receiverIdentityPubkey, leaves, cpfpRefundSignatureMap, directRefundSignatureMap, directFromCpfpRefundSignatureMap) {
13580
13570
  const leavesTweaksMap = /* @__PURE__ */ new Map();
13581
- for (const leaf of leaves) {
13582
- const cpfpRefundSignature = cpfpRefundSignatureMap.get(leaf.leaf.id);
13583
- const directRefundSignature = directRefundSignatureMap.get(leaf.leaf.id);
13584
- const directFromCpfpRefundSignature = directFromCpfpRefundSignatureMap.get(leaf.leaf.id);
13585
- const leafTweaksMap = await this.prepareSingleSendTransferKeyTweak(
13586
- transferID,
13587
- leaf,
13588
- receiverIdentityPubkey,
13589
- cpfpRefundSignature,
13590
- directRefundSignature,
13591
- directFromCpfpRefundSignature
13592
- );
13593
- for (const [identifier, leafTweak] of leafTweaksMap) {
13571
+ const results = await Promise.all(
13572
+ leaves.map(async (leaf) => {
13573
+ const cpfpRefundSignature = cpfpRefundSignatureMap.get(leaf.leaf.id);
13574
+ const directRefundSignature = directRefundSignatureMap.get(
13575
+ leaf.leaf.id
13576
+ );
13577
+ const directFromCpfpRefundSignature = directFromCpfpRefundSignatureMap.get(leaf.leaf.id);
13578
+ return await this.prepareSingleSendTransferKeyTweak(
13579
+ transferID,
13580
+ leaf,
13581
+ receiverIdentityPubkey,
13582
+ cpfpRefundSignature,
13583
+ directRefundSignature,
13584
+ directFromCpfpRefundSignature
13585
+ );
13586
+ })
13587
+ );
13588
+ for (const result of results) {
13589
+ for (const [identifier, leafTweak] of result) {
13594
13590
  leavesTweaksMap.set(identifier, [
13595
13591
  ...leavesTweaksMap.get(identifier) || [],
13596
13592
  leafTweak
@@ -13675,15 +13671,10 @@ var TransferService = class extends BaseTransferService {
13675
13671
  super(config, connectionManager, signingService);
13676
13672
  }
13677
13673
  async claimTransfer(transfer, leaves) {
13678
- let proofMap;
13679
13674
  if (transfer.status === 2 /* TRANSFER_STATUS_SENDER_KEY_TWEAKED */) {
13680
- proofMap = await this.claimTransferTweakKeys(transfer, leaves);
13675
+ await this.claimTransferTweakKeys(transfer, leaves);
13681
13676
  }
13682
- const signatures = await this.claimTransferSignRefunds(
13683
- transfer,
13684
- leaves,
13685
- proofMap
13686
- );
13677
+ const signatures = await this.claimTransferSignRefunds(transfer, leaves);
13687
13678
  return await this.finalizeNodeSignatures(signatures);
13688
13679
  }
13689
13680
  // When transferIds is not provided, all pending transfers for the receiver will be returned.
@@ -13734,31 +13725,33 @@ var TransferService = class extends BaseTransferService {
13734
13725
  }
13735
13726
  async verifyPendingTransfer(transfer) {
13736
13727
  const leafPubKeyMap = /* @__PURE__ */ new Map();
13737
- for (const leaf of transfer.leaves) {
13738
- if (!leaf.leaf) {
13739
- throw new Error("Leaf is undefined");
13740
- }
13741
- const encoder = new TextEncoder();
13742
- const leafIdBytes = encoder.encode(leaf.leaf.id);
13743
- const transferIdBytes = encoder.encode(transfer.id);
13744
- const payload = new Uint8Array([
13745
- ...leafIdBytes,
13746
- ...transferIdBytes,
13747
- ...leaf.secretCipher
13748
- ]);
13749
- const payloadHash = sha25610(payload);
13750
- if (!secp256k110.verify(
13751
- leaf.signature,
13752
- payloadHash,
13753
- transfer.senderIdentityPublicKey
13754
- )) {
13755
- throw new Error("Signature verification failed");
13756
- }
13757
- const leafSecret = await this.config.signer.decryptEcies(
13758
- leaf.secretCipher
13759
- );
13760
- leafPubKeyMap.set(leaf.leaf.id, leafSecret);
13761
- }
13728
+ await Promise.all(
13729
+ transfer.leaves.map(async (leaf) => {
13730
+ if (!leaf.leaf) {
13731
+ throw new Error("Leaf is undefined");
13732
+ }
13733
+ const encoder = new TextEncoder();
13734
+ const leafIdBytes = encoder.encode(leaf.leaf.id);
13735
+ const transferIdBytes = encoder.encode(transfer.id);
13736
+ const payload = new Uint8Array([
13737
+ ...leafIdBytes,
13738
+ ...transferIdBytes,
13739
+ ...leaf.secretCipher
13740
+ ]);
13741
+ const payloadHash = sha25610(payload);
13742
+ if (!secp256k110.verify(
13743
+ leaf.signature,
13744
+ payloadHash,
13745
+ transfer.senderIdentityPublicKey
13746
+ )) {
13747
+ throw new Error("Signature verification failed");
13748
+ }
13749
+ const leafSecret = await this.config.signer.decryptEcies(
13750
+ leaf.secretCipher
13751
+ );
13752
+ leafPubKeyMap.set(leaf.leaf.id, leafSecret);
13753
+ })
13754
+ );
13762
13755
  return leafPubKeyMap;
13763
13756
  }
13764
13757
  async queryTransfer(transferId) {
@@ -13820,29 +13813,31 @@ var TransferService = class extends BaseTransferService {
13820
13813
  async sendTransferSignRefundInternal(leaves, receiverIdentityPubkey, expiryTime, forSwap) {
13821
13814
  const transferId = uuidv7();
13822
13815
  const leafDataMap = /* @__PURE__ */ new Map();
13823
- for (const leaf of leaves) {
13824
- const signingNonceCommitment = await this.config.signer.getRandomSigningCommitment();
13825
- const directSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
13826
- const directFromCpfpRefundSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
13827
- const tx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
13828
- const refundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
13829
- const directTx = leaf.leaf.directTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directTx) : void 0;
13830
- const directRefundTx = leaf.leaf.directRefundTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directRefundTx) : void 0;
13831
- const directFromCpfpRefundTx = leaf.leaf.directFromCpfpRefundTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directFromCpfpRefundTx) : void 0;
13832
- leafDataMap.set(leaf.leaf.id, {
13833
- keyDerivation: leaf.keyDerivation,
13834
- receivingPubkey: receiverIdentityPubkey,
13835
- signingNonceCommitment,
13836
- directSigningNonceCommitment,
13837
- tx,
13838
- directTx,
13839
- refundTx,
13840
- directRefundTx,
13841
- directFromCpfpRefundTx,
13842
- directFromCpfpRefundSigningNonceCommitment,
13843
- vout: leaf.leaf.vout
13844
- });
13845
- }
13816
+ await Promise.all(
13817
+ leaves.map(async (leaf) => {
13818
+ const signingNonceCommitment = await this.config.signer.getRandomSigningCommitment();
13819
+ const directSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
13820
+ const directFromCpfpRefundSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
13821
+ const tx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
13822
+ const refundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
13823
+ const directTx = leaf.leaf.directTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directTx) : void 0;
13824
+ const directRefundTx = leaf.leaf.directRefundTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directRefundTx) : void 0;
13825
+ const directFromCpfpRefundTx = leaf.leaf.directFromCpfpRefundTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directFromCpfpRefundTx) : void 0;
13826
+ leafDataMap.set(leaf.leaf.id, {
13827
+ keyDerivation: leaf.keyDerivation,
13828
+ receivingPubkey: receiverIdentityPubkey,
13829
+ signingNonceCommitment,
13830
+ directSigningNonceCommitment,
13831
+ tx,
13832
+ directTx,
13833
+ refundTx,
13834
+ directRefundTx,
13835
+ directFromCpfpRefundTx,
13836
+ directFromCpfpRefundSigningNonceCommitment,
13837
+ vout: leaf.leaf.vout
13838
+ });
13839
+ })
13840
+ );
13846
13841
  const signingJobs = await this.prepareRefundSoSigningJobs(
13847
13842
  leaves,
13848
13843
  leafDataMap
@@ -13904,65 +13899,71 @@ var TransferService = class extends BaseTransferService {
13904
13899
  }
13905
13900
  async prepareRefundSoSigningJobs(leaves, leafDataMap, isForClaim) {
13906
13901
  const signingJobs = [];
13907
- for (const leaf of leaves) {
13908
- const refundSigningData = leafDataMap.get(leaf.leaf.id);
13909
- if (!refundSigningData) {
13910
- throw new Error(`Leaf data not found for leaf ${leaf.leaf.id}`);
13911
- }
13912
- const nodeTx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
13913
- let directNodeTx;
13914
- if (leaf.leaf.directTx.length > 0) {
13915
- directNodeTx = getTxFromRawTxBytes(leaf.leaf.directTx);
13916
- }
13917
- const currRefundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
13918
- const currentSequence = currRefundTx.getInput(0).sequence;
13919
- if (!currentSequence) {
13920
- throw new SparkValidationError("Invalid refund transaction", {
13921
- field: "sequence",
13922
- value: currRefundTx.getInput(0),
13923
- expected: "Non-null sequence"
13924
- });
13925
- }
13926
- const refundTxsParams = {
13927
- nodeTx,
13928
- directNodeTx,
13929
- sequence: currentSequence,
13930
- receivingPubkey: refundSigningData.receivingPubkey,
13931
- network: this.config.getNetwork()
13932
- };
13933
- const { cpfpRefundTx, directRefundTx, directFromCpfpRefundTx } = isForClaim ? createCurrentTimelockRefundTxs(refundTxsParams) : createDecrementedTimelockRefundTxs(refundTxsParams);
13934
- refundSigningData.refundTx = cpfpRefundTx;
13935
- refundSigningData.directRefundTx = directRefundTx;
13936
- refundSigningData.directFromCpfpRefundTx = directFromCpfpRefundTx;
13937
- const cpfpRefundNonceCommitmentProto = refundSigningData.signingNonceCommitment;
13938
- const directRefundNonceCommitmentProto = refundSigningData.directSigningNonceCommitment;
13939
- const directFromCpfpRefundNonceCommitmentProto = refundSigningData.directFromCpfpRefundSigningNonceCommitment;
13940
- const signingPublicKey = await this.config.signer.getPublicKeyFromDerivation(
13941
- refundSigningData.keyDerivation
13942
- );
13943
- signingJobs.push({
13944
- leafId: leaf.leaf.id,
13945
- refundTxSigningJob: {
13946
- signingPublicKey,
13947
- rawTx: cpfpRefundTx.toBytes(),
13948
- signingNonceCommitment: cpfpRefundNonceCommitmentProto.commitment
13949
- },
13950
- directRefundTxSigningJob: directRefundTx ? {
13951
- signingPublicKey,
13952
- rawTx: directRefundTx.toBytes(),
13953
- signingNonceCommitment: directRefundNonceCommitmentProto.commitment
13954
- } : void 0,
13955
- directFromCpfpRefundTxSigningJob: directFromCpfpRefundTx ? {
13956
- signingPublicKey,
13957
- rawTx: directFromCpfpRefundTx.toBytes(),
13958
- signingNonceCommitment: directFromCpfpRefundNonceCommitmentProto.commitment
13959
- } : void 0
13960
- });
13902
+ const results = await Promise.all(
13903
+ leaves.map(async (leaf) => {
13904
+ const refundSigningData = leafDataMap.get(leaf.leaf.id);
13905
+ if (!refundSigningData) {
13906
+ throw new Error(`Leaf data not found for leaf ${leaf.leaf.id}`);
13907
+ }
13908
+ const nodeTx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
13909
+ let directNodeTx;
13910
+ if (leaf.leaf.directTx.length > 0) {
13911
+ directNodeTx = getTxFromRawTxBytes(leaf.leaf.directTx);
13912
+ }
13913
+ const currRefundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
13914
+ const currentSequence = currRefundTx.getInput(0).sequence;
13915
+ if (!currentSequence) {
13916
+ throw new SparkValidationError("Invalid refund transaction", {
13917
+ field: "sequence",
13918
+ value: currRefundTx.getInput(0),
13919
+ expected: "Non-null sequence"
13920
+ });
13921
+ }
13922
+ const refundTxsParams = {
13923
+ nodeTx,
13924
+ directNodeTx,
13925
+ sequence: currentSequence,
13926
+ receivingPubkey: refundSigningData.receivingPubkey,
13927
+ network: this.config.getNetwork()
13928
+ };
13929
+ const { cpfpRefundTx, directRefundTx, directFromCpfpRefundTx } = isForClaim ? createCurrentTimelockRefundTxs(refundTxsParams) : createDecrementedTimelockRefundTxs(refundTxsParams);
13930
+ const isZeroNode = !getCurrentTimelock(nodeTx.getInput(0).sequence);
13931
+ refundSigningData.refundTx = cpfpRefundTx;
13932
+ refundSigningData.directRefundTx = directRefundTx && !isZeroNode ? directRefundTx : void 0;
13933
+ refundSigningData.directFromCpfpRefundTx = directFromCpfpRefundTx;
13934
+ const cpfpRefundNonceCommitmentProto = refundSigningData.signingNonceCommitment;
13935
+ const directRefundNonceCommitmentProto = refundSigningData.directSigningNonceCommitment;
13936
+ const directFromCpfpRefundNonceCommitmentProto = refundSigningData.directFromCpfpRefundSigningNonceCommitment;
13937
+ const signingPublicKey = await this.config.signer.getPublicKeyFromDerivation(
13938
+ refundSigningData.keyDerivation
13939
+ );
13940
+ return {
13941
+ leafId: leaf.leaf.id,
13942
+ refundTxSigningJob: {
13943
+ signingPublicKey,
13944
+ rawTx: cpfpRefundTx.toBytes(),
13945
+ signingNonceCommitment: cpfpRefundNonceCommitmentProto.commitment
13946
+ },
13947
+ directRefundTxSigningJob: directRefundTx && !isZeroNode ? {
13948
+ signingPublicKey,
13949
+ rawTx: directRefundTx.toBytes(),
13950
+ signingNonceCommitment: directRefundNonceCommitmentProto.commitment
13951
+ } : void 0,
13952
+ directFromCpfpRefundTxSigningJob: directFromCpfpRefundTx ? {
13953
+ signingPublicKey,
13954
+ rawTx: directFromCpfpRefundTx.toBytes(),
13955
+ signingNonceCommitment: directFromCpfpRefundNonceCommitmentProto.commitment
13956
+ } : void 0
13957
+ };
13958
+ })
13959
+ );
13960
+ for (const result of results) {
13961
+ signingJobs.push(result);
13961
13962
  }
13962
13963
  return signingJobs;
13963
13964
  }
13964
13965
  async claimTransferTweakKeys(transfer, leaves) {
13965
- const { leafDataMap: leavesTweaksMap, proofMap } = await this.prepareClaimLeavesKeyTweaks(leaves);
13966
+ const leavesTweaksMap = await this.prepareClaimLeavesKeyTweaks(leaves);
13966
13967
  const errors = [];
13967
13968
  const promises = Object.entries(this.config.getSigningOperators()).map(
13968
13969
  async ([identifier, operator]) => {
@@ -14000,14 +14001,13 @@ var TransferService = class extends BaseTransferService {
14000
14001
  if (errors.length > 0) {
14001
14002
  throw errors[0];
14002
14003
  }
14003
- return proofMap;
14004
14004
  }
14005
14005
  async prepareClaimLeavesKeyTweaks(leaves) {
14006
14006
  const leafDataMap = /* @__PURE__ */ new Map();
14007
- const proofMap = /* @__PURE__ */ new Map();
14008
- for (const leaf of leaves) {
14009
- const { leafKeyTweaks: leafData, proofs } = await this.prepareClaimLeafKeyTweaks(leaf);
14010
- proofMap.set(leaf.leaf.id, proofs);
14007
+ const results = await Promise.all(
14008
+ leaves.map((leaf) => this.prepareClaimLeafKeyTweaks(leaf))
14009
+ );
14010
+ for (const { leafKeyTweaks: leafData } of results) {
14011
14011
  for (const [identifier, leafTweak] of leafData) {
14012
14012
  leafDataMap.set(identifier, [
14013
14013
  ...leafDataMap.get(identifier) || [],
@@ -14015,7 +14015,7 @@ var TransferService = class extends BaseTransferService {
14015
14015
  ]);
14016
14016
  }
14017
14017
  }
14018
- return { leafDataMap, proofMap };
14018
+ return leafDataMap;
14019
14019
  }
14020
14020
  async prepareClaimLeafKeyTweaks(leaf) {
14021
14021
  const signingOperators = this.config.getSigningOperators();
@@ -14062,24 +14062,26 @@ var TransferService = class extends BaseTransferService {
14062
14062
  }
14063
14063
  return { leafKeyTweaks: leafTweaksMap, proofs: shares[0].proofs };
14064
14064
  }
14065
- async claimTransferSignRefunds(transfer, leafKeys, proofMap) {
14065
+ async claimTransferSignRefunds(transfer, leafKeys) {
14066
14066
  const leafDataMap = /* @__PURE__ */ new Map();
14067
- for (const leafKey of leafKeys) {
14068
- const tx = getTxFromRawTxBytes(leafKey.leaf.nodeTx);
14069
- const directTx = leafKey.leaf.directTx.length > 0 ? getTxFromRawTxBytes(leafKey.leaf.directTx) : void 0;
14070
- leafDataMap.set(leafKey.leaf.id, {
14071
- keyDerivation: leafKey.newKeyDerivation,
14072
- receivingPubkey: await this.config.signer.getPublicKeyFromDerivation(
14073
- leafKey.newKeyDerivation
14074
- ),
14075
- signingNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
14076
- directSigningNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
14077
- directFromCpfpRefundSigningNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
14078
- tx,
14079
- directTx,
14080
- vout: leafKey.leaf.vout
14081
- });
14082
- }
14067
+ await Promise.all(
14068
+ leafKeys.map(async (leafKey) => {
14069
+ const tx = getTxFromRawTxBytes(leafKey.leaf.nodeTx);
14070
+ const directTx = leafKey.leaf.directTx.length > 0 ? getTxFromRawTxBytes(leafKey.leaf.directTx) : void 0;
14071
+ leafDataMap.set(leafKey.leaf.id, {
14072
+ keyDerivation: leafKey.newKeyDerivation,
14073
+ receivingPubkey: await this.config.signer.getPublicKeyFromDerivation(
14074
+ leafKey.newKeyDerivation
14075
+ ),
14076
+ signingNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
14077
+ directSigningNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
14078
+ directFromCpfpRefundSigningNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
14079
+ tx,
14080
+ directTx,
14081
+ vout: leafKey.leaf.vout
14082
+ });
14083
+ })
14084
+ );
14083
14085
  const signingJobs = await this.prepareRefundSoSigningJobs(
14084
14086
  leafKeys,
14085
14087
  leafDataMap,
@@ -14089,14 +14091,6 @@ var TransferService = class extends BaseTransferService {
14089
14091
  this.config.getCoordinatorAddress()
14090
14092
  );
14091
14093
  let resp;
14092
- const secretProofMap = {};
14093
- if (proofMap) {
14094
- for (const [leafId, proof] of proofMap.entries()) {
14095
- secretProofMap[leafId] = {
14096
- proofs: proof
14097
- };
14098
- }
14099
- }
14100
14094
  try {
14101
14095
  resp = await sparkClient.claim_transfer_sign_refunds_v2({
14102
14096
  transferId: transfer.id,
@@ -14671,9 +14665,7 @@ var CoopExitService = class extends BaseTransferService {
14671
14665
  const signingJob = {
14672
14666
  leafId: leaf.leaf.id,
14673
14667
  refundTxSigningJob: {
14674
- signingPublicKey: await this.config.signer.getPublicKeyFromDerivation(
14675
- leaf.keyDerivation
14676
- ),
14668
+ signingPublicKey,
14677
14669
  rawTx: cpfpRefundTx.toBytes(),
14678
14670
  signingNonceCommitment: signingNonceCommitment.commitment
14679
14671
  },
@@ -14724,13 +14716,13 @@ var CoopExitService = class extends BaseTransferService {
14724
14716
  });
14725
14717
  } catch (error) {
14726
14718
  throw new SparkRequestError("Failed to initiate cooperative exit", {
14727
- operation: "cooperative_exit",
14719
+ operation: "cooperative_exit_v2",
14728
14720
  error
14729
14721
  });
14730
14722
  }
14731
14723
  if (!response.transfer) {
14732
14724
  throw new SparkRequestError("Failed to initiate cooperative exit", {
14733
- operation: "cooperative_exit",
14725
+ operation: "cooperative_exit_v2",
14734
14726
  error: new Error("No transfer in response")
14735
14727
  });
14736
14728
  }
@@ -15192,7 +15184,7 @@ var DepositService = class {
15192
15184
  });
15193
15185
  } catch (error) {
15194
15186
  throw new SparkRequestError("Failed to finalize node signatures", {
15195
- operation: "finalize_node_signatures",
15187
+ operation: "finalize_node_signatures_v2",
15196
15188
  error
15197
15189
  });
15198
15190
  }
@@ -15492,7 +15484,7 @@ var LightningService = class {
15492
15484
  });
15493
15485
  } catch (error) {
15494
15486
  throw new SparkRequestError("Failed to initiate preimage swap", {
15495
- operation: "initiate_preimage_swap",
15487
+ operation: "initiate_preimage_swap_v3",
15496
15488
  error
15497
15489
  });
15498
15490
  }
@@ -15574,12 +15566,13 @@ var SigningService = class {
15574
15566
  expected: "Non-null signing commitments"
15575
15567
  });
15576
15568
  }
15569
+ const publicKey = await this.config.signer.getPublicKeyFromDerivation(
15570
+ leaf.keyDerivation
15571
+ );
15577
15572
  const signingResult = await this.config.signer.signFrost({
15578
15573
  message: sighash,
15579
15574
  keyDerivation: leaf.keyDerivation,
15580
- publicKey: await this.config.signer.getPublicKeyFromDerivation(
15581
- leaf.keyDerivation
15582
- ),
15575
+ publicKey,
15583
15576
  selfCommitment: signingCommitment,
15584
15577
  statechainCommitments: signingCommitments,
15585
15578
  adaptorPubKey: new Uint8Array(),
@@ -15587,9 +15580,7 @@ var SigningService = class {
15587
15580
  });
15588
15581
  leafSigningJobs.push({
15589
15582
  leafId: leaf.leaf.id,
15590
- signingPublicKey: await this.config.signer.getPublicKeyFromDerivation(
15591
- leaf.keyDerivation
15592
- ),
15583
+ signingPublicKey: publicKey,
15593
15584
  rawTx: refundTx.toBytes(),
15594
15585
  signingNonceCommitment: signingCommitment.commitment,
15595
15586
  userSignature: signingResult,
@@ -20356,7 +20347,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
20356
20347
  * @param tokenIdentifiers - Optional array of token identifiers to filter by
20357
20348
  * @param outputIds - Optional array of output IDs to filter by
20358
20349
  * @param order - Optional order for results ("ASCENDING" or "DESCENDING", defaults to "DESCENDING")
20359
- * @param pageSize - Optional page size (defaults to 100)
20350
+ * @param pageSize - Optional page size (defaults to 50)
20360
20351
  * @param offset - Optional offset for pagination (defaults to 0)
20361
20352
  * @returns Promise resolving to array of token transactions with their current status
20362
20353
  */
@@ -20379,7 +20370,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
20379
20370
  tokenIdentifiers,
20380
20371
  outputIds,
20381
20372
  order,
20382
- pageSize: pageSize ?? 100,
20373
+ pageSize: pageSize ?? 50,
20383
20374
  offset: offset ?? 0
20384
20375
  });
20385
20376
  }
@@ -21871,6 +21862,9 @@ var ConnectionManager = class _ConnectionManager {
21871
21862
  }
21872
21863
  return serverTime;
21873
21864
  }
21865
+ isTimeSynced() {
21866
+ return this.timeSync.isSynced();
21867
+ }
21874
21868
  getMonotonicTime() {
21875
21869
  return getMonotonicTime();
21876
21870
  }
@@ -22048,39 +22042,6 @@ var ConnectionManager = class _ConnectionManager {
22048
22042
  prepareMetadata(metadata) {
22049
22043
  return metadata;
22050
22044
  }
22051
- recordTimeSync(dateHeader, serverProcessingTimeMs, sendTime, receiveTime) {
22052
- this.timeSync.recordSync(
22053
- dateHeader,
22054
- serverProcessingTimeMs,
22055
- sendTime,
22056
- receiveTime
22057
- );
22058
- }
22059
- processResponseForTimeSync(result, firstResponse, sendTime) {
22060
- if (!firstResponse) return false;
22061
- const receiveTime = this.getMonotonicTime();
22062
- if (typeof result.value === "object" && result.value !== null) {
22063
- const responseObj = result.value;
22064
- if (responseObj.header && responseObj.header instanceof Metadata) {
22065
- const dateHeader = responseObj.header.get(
22066
- _ConnectionManager.DATE_HEADER
22067
- )?.[0];
22068
- const processingTimeHeader = responseObj.header.get(
22069
- _ConnectionManager.PROCESSING_TIME_HEADER
22070
- )?.[0];
22071
- if (dateHeader && processingTimeHeader) {
22072
- const serverProcessingTimeMs = parseFloat(processingTimeHeader);
22073
- this.recordTimeSync(
22074
- dateHeader,
22075
- serverProcessingTimeMs,
22076
- sendTime,
22077
- receiveTime
22078
- );
22079
- }
22080
- }
22081
- }
22082
- return true;
22083
- }
22084
22045
  createAuthnMiddleware() {
22085
22046
  return async function* (call, options) {
22086
22047
  const metadata = this.prepareMetadata(Metadata(options.metadata));
@@ -22095,28 +22056,34 @@ var ConnectionManager = class _ConnectionManager {
22095
22056
  const metadata = this.prepareMetadata(Metadata(options.metadata));
22096
22057
  const authToken = await this.authenticate(address);
22097
22058
  const sendTime = this.getMonotonicTime();
22059
+ const receiveTime = { value: 0 };
22098
22060
  try {
22099
22061
  const generator = call.next(call.request, {
22100
22062
  ...options,
22101
- metadata: metadata.set("Authorization", `Bearer ${authToken}`)
22063
+ metadata: metadata.set("Authorization", `Bearer ${authToken}`),
22064
+ onHeader: (header) => {
22065
+ receiveTime.value = this.getMonotonicTime();
22066
+ const dateHeader = header.get(_ConnectionManager.DATE_HEADER);
22067
+ const processingTimeHeader = header.get(
22068
+ _ConnectionManager.PROCESSING_TIME_HEADER
22069
+ );
22070
+ if (dateHeader && processingTimeHeader) {
22071
+ const serverProcessingTimeMs = parseFloat(processingTimeHeader);
22072
+ this.timeSync.recordSync(
22073
+ dateHeader,
22074
+ serverProcessingTimeMs,
22075
+ sendTime,
22076
+ receiveTime.value
22077
+ );
22078
+ }
22079
+ }
22102
22080
  });
22103
- let firstResponse = true;
22104
22081
  let result = await generator.next();
22105
22082
  while (!result.done) {
22106
- if (firstResponse) {
22107
- firstResponse = this.processResponseForTimeSync(
22108
- result,
22109
- firstResponse,
22110
- sendTime
22111
- );
22112
- }
22113
22083
  yield result.value;
22114
22084
  result = await generator.next();
22115
22085
  }
22116
22086
  if (result.value !== void 0) {
22117
- if (firstResponse) {
22118
- this.processResponseForTimeSync(result, firstResponse, sendTime);
22119
- }
22120
22087
  return result.value;
22121
22088
  }
22122
22089
  } catch (error) {
@@ -22451,7 +22418,6 @@ export {
22451
22418
  getNextTransactionSequence,
22452
22419
  getEphemeralAnchorOutput,
22453
22420
  isEphemeralAnchorOutput,
22454
- constructUnilateralExitTxs,
22455
22421
  constructUnilateralExitFeeBumpPackages,
22456
22422
  hash160,
22457
22423
  constructFeeBumpTx,