@bitgo-beta/utxo-ord 1.0.1-beta.182 → 1.0.1-beta.1821

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 (64) hide show
  1. package/dist/cjs/src/OrdOutput.d.ts.map +1 -0
  2. package/dist/cjs/src/OrdOutput.js +197 -0
  3. package/dist/{src → cjs/src}/OutputLayout.d.ts +3 -3
  4. package/dist/cjs/src/OutputLayout.d.ts.map +1 -0
  5. package/dist/cjs/src/OutputLayout.js +246 -0
  6. package/dist/{src → cjs/src}/SatPoint.d.ts +8 -1
  7. package/dist/cjs/src/SatPoint.d.ts.map +1 -0
  8. package/dist/cjs/src/SatPoint.js +67 -0
  9. package/dist/cjs/src/SatRange.d.ts.map +1 -0
  10. package/dist/cjs/src/SatRange.js +58 -0
  11. package/dist/cjs/src/combinations.d.ts.map +1 -0
  12. package/dist/cjs/src/combinations.js +13 -0
  13. package/dist/{src → cjs/src}/index.d.ts +2 -0
  14. package/dist/cjs/src/index.d.ts.map +1 -0
  15. package/dist/cjs/src/index.js +49 -0
  16. package/dist/cjs/src/inscriptions.d.ts +58 -0
  17. package/dist/cjs/src/inscriptions.d.ts.map +1 -0
  18. package/dist/cjs/src/inscriptions.js +94 -0
  19. package/dist/{src → cjs/src}/psbt.d.ts +33 -17
  20. package/dist/cjs/src/psbt.d.ts.map +1 -0
  21. package/dist/cjs/src/psbt.js +193 -0
  22. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  23. package/dist/esm/OrdOutput.d.ts +65 -0
  24. package/dist/esm/OrdOutput.js +192 -0
  25. package/dist/esm/OutputLayout.d.ts +47 -0
  26. package/dist/esm/OutputLayout.d.ts.map +1 -0
  27. package/dist/esm/OutputLayout.js +240 -0
  28. package/dist/esm/SatPoint.d.ts +20 -0
  29. package/dist/esm/SatPoint.d.ts.map +1 -0
  30. package/dist/esm/SatPoint.js +61 -0
  31. package/dist/esm/SatRange.d.ts +26 -0
  32. package/dist/esm/SatRange.js +53 -0
  33. package/dist/esm/combinations.d.ts +2 -0
  34. package/dist/esm/combinations.js +10 -0
  35. package/dist/esm/index.d.ts +12 -0
  36. package/dist/{src → esm}/index.d.ts.map +1 -1
  37. package/dist/esm/index.js +10 -0
  38. package/dist/esm/inscriptions.d.ts +58 -0
  39. package/dist/esm/inscriptions.d.ts.map +1 -0
  40. package/dist/esm/inscriptions.js +89 -0
  41. package/dist/esm/psbt.d.ts +84 -0
  42. package/dist/esm/psbt.d.ts.map +1 -0
  43. package/dist/esm/psbt.js +186 -0
  44. package/package.json +27 -9
  45. package/dist/src/OrdOutput.js +0 -197
  46. package/dist/src/OutputLayout.d.ts.map +0 -1
  47. package/dist/src/OutputLayout.js +0 -248
  48. package/dist/src/SatPoint.d.ts.map +0 -1
  49. package/dist/src/SatPoint.js +0 -49
  50. package/dist/src/SatRange.js +0 -58
  51. package/dist/src/combinations.js +0 -14
  52. package/dist/src/index.js +0 -23
  53. package/dist/src/inscriptions.d.ts +0 -32
  54. package/dist/src/inscriptions.d.ts.map +0 -1
  55. package/dist/src/inscriptions.js +0 -169
  56. package/dist/src/psbt.d.ts.map +0 -1
  57. package/dist/src/psbt.js +0 -150
  58. package/dist/tsconfig.tsbuildinfo +0 -1
  59. /package/dist/{src → cjs/src}/OrdOutput.d.ts +0 -0
  60. /package/dist/{src → cjs/src}/SatRange.d.ts +0 -0
  61. /package/dist/{src → cjs/src}/combinations.d.ts +0 -0
  62. /package/dist/{src → esm}/OrdOutput.d.ts.map +0 -0
  63. /package/dist/{src → esm}/SatRange.d.ts.map +0 -0
  64. /package/dist/{src → esm}/combinations.d.ts.map +0 -0
@@ -0,0 +1,26 @@
1
+ export declare class InvalidSatRange extends Error {
2
+ start: bigint;
3
+ end: bigint;
4
+ constructor(message: string, start: bigint, end: bigint);
5
+ }
6
+ /**
7
+ * Range of satoshi, inclusive.
8
+ * Inscriptions have start === end.
9
+ */
10
+ export declare class SatRange {
11
+ start: bigint;
12
+ end: bigint;
13
+ constructor(start: bigint, end: bigint);
14
+ /**
15
+ * @param offset
16
+ * @return SatRange with start and end shifted by offset
17
+ */
18
+ shiftedBy(offset: bigint): SatRange;
19
+ /** @return true iff this intersects with _other_ */
20
+ intersectsWith(other: bigint | SatRange): boolean;
21
+ /** @return true iff this is superset of _other_. */
22
+ isSupersetOf(other: bigint | SatRange): boolean;
23
+ toString(): string;
24
+ size(): bigint;
25
+ }
26
+ //# sourceMappingURL=SatRange.d.ts.map
@@ -0,0 +1,53 @@
1
+ export class InvalidSatRange extends Error {
2
+ constructor(message, start, end) {
3
+ super(message);
4
+ this.start = start;
5
+ this.end = end;
6
+ }
7
+ }
8
+ function toRange(v) {
9
+ return typeof v === 'bigint' ? new SatRange(v, v) : v;
10
+ }
11
+ /**
12
+ * Range of satoshi, inclusive.
13
+ * Inscriptions have start === end.
14
+ */
15
+ export class SatRange {
16
+ constructor(start, end) {
17
+ this.start = start;
18
+ this.end = end;
19
+ if (start < 0 || end < 0 || end < start) {
20
+ throw new InvalidSatRange(`Invalid SatRange [${start}, ${end}]`, start, end);
21
+ }
22
+ }
23
+ /**
24
+ * @param offset
25
+ * @return SatRange with start and end shifted by offset
26
+ */
27
+ shiftedBy(offset) {
28
+ return new SatRange(this.start + offset, this.end + offset);
29
+ }
30
+ /** @return true iff this intersects with _other_ */
31
+ intersectsWith(other) {
32
+ other = toRange(other);
33
+ if (this.start <= other.start) {
34
+ return other.start <= this.end;
35
+ }
36
+ return other.intersectsWith(this);
37
+ }
38
+ /** @return true iff this is superset of _other_. */
39
+ isSupersetOf(other) {
40
+ other = toRange(other);
41
+ return this.start <= other.start && other.end <= this.end;
42
+ }
43
+ toString() {
44
+ if (this.start === this.end) {
45
+ return `[${this.start}]`;
46
+ }
47
+ return `[${this.start}..${this.end}]`;
48
+ }
49
+ size() {
50
+ return this.end - this.start + BigInt(1);
51
+ }
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2F0UmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2F0UmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGVBQWdCLFNBQVEsS0FBSztJQUN4QyxZQUFZLE9BQWUsRUFBUyxLQUFhLEVBQVMsR0FBVztRQUNuRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFEbUIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFTLFFBQUcsR0FBSCxHQUFHLENBQVE7SUFFckUsQ0FBQztDQUNGO0FBRUQsU0FBUyxPQUFPLENBQUMsQ0FBb0I7SUFDbkMsT0FBTyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUNuQixZQUFtQixLQUFhLEVBQVMsR0FBVztRQUFqQyxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVMsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUNsRCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLGVBQWUsQ0FBQyxxQkFBcUIsS0FBSyxLQUFLLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELGNBQWMsQ0FBQyxLQUF3QjtRQUNyQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDakMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELFlBQVksQ0FBQyxLQUF3QjtRQUNuQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUM1RCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDNUIsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBJbnZhbGlkU2F0UmFuZ2UgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHN0YXJ0OiBiaWdpbnQsIHB1YmxpYyBlbmQ6IGJpZ2ludCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmFuZ2UodjogYmlnaW50IHwgU2F0UmFuZ2UpOiBTYXRSYW5nZSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ2JpZ2ludCcgPyBuZXcgU2F0UmFuZ2UodiwgdikgOiB2O1xufVxuXG4vKipcbiAqIFJhbmdlIG9mIHNhdG9zaGksIGluY2x1c2l2ZS5cbiAqIEluc2NyaXB0aW9ucyBoYXZlIHN0YXJ0ID09PSBlbmQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTYXRSYW5nZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzdGFydDogYmlnaW50LCBwdWJsaWMgZW5kOiBiaWdpbnQpIHtcbiAgICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA8IDAgfHwgZW5kIDwgc3RhcnQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkU2F0UmFuZ2UoYEludmFsaWQgU2F0UmFuZ2UgWyR7c3RhcnR9LCAke2VuZH1dYCwgc3RhcnQsIGVuZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvZmZzZXRcbiAgICogQHJldHVybiBTYXRSYW5nZSB3aXRoIHN0YXJ0IGFuZCBlbmQgc2hpZnRlZCBieSBvZmZzZXRcbiAgICovXG4gIHNoaWZ0ZWRCeShvZmZzZXQ6IGJpZ2ludCk6IFNhdFJhbmdlIHtcbiAgICByZXR1cm4gbmV3IFNhdFJhbmdlKHRoaXMuc3RhcnQgKyBvZmZzZXQsIHRoaXMuZW5kICsgb2Zmc2V0KTtcbiAgfVxuXG4gIC8qKiBAcmV0dXJuIHRydWUgaWZmIHRoaXMgaW50ZXJzZWN0cyB3aXRoIF9vdGhlcl8gKi9cbiAgaW50ZXJzZWN0c1dpdGgob3RoZXI6IGJpZ2ludCB8IFNhdFJhbmdlKTogYm9vbGVhbiB7XG4gICAgb3RoZXIgPSB0b1JhbmdlKG90aGVyKTtcbiAgICBpZiAodGhpcy5zdGFydCA8PSBvdGhlci5zdGFydCkge1xuICAgICAgcmV0dXJuIG90aGVyLnN0YXJ0IDw9IHRoaXMuZW5kO1xuICAgIH1cbiAgICByZXR1cm4gb3RoZXIuaW50ZXJzZWN0c1dpdGgodGhpcyk7XG4gIH1cblxuICAvKiogQHJldHVybiB0cnVlIGlmZiB0aGlzIGlzIHN1cGVyc2V0IG9mIF9vdGhlcl8uICovXG4gIGlzU3VwZXJzZXRPZihvdGhlcjogYmlnaW50IHwgU2F0UmFuZ2UpOiBib29sZWFuIHtcbiAgICBvdGhlciA9IHRvUmFuZ2Uob3RoZXIpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0IDw9IG90aGVyLnN0YXJ0ICYmIG90aGVyLmVuZCA8PSB0aGlzLmVuZDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc3RhcnQgPT09IHRoaXMuZW5kKSB7XG4gICAgICByZXR1cm4gYFske3RoaXMuc3RhcnR9XWA7XG4gICAgfVxuICAgIHJldHVybiBgWyR7dGhpcy5zdGFydH0uLiR7dGhpcy5lbmR9XWA7XG4gIH1cblxuICBzaXplKCk6IGJpZ2ludCB7XG4gICAgcmV0dXJuIHRoaXMuZW5kIC0gdGhpcy5zdGFydCArIEJpZ0ludCgxKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export declare function powerset<T>(arr: T[]): T[][];
2
+ //# sourceMappingURL=combinations.d.ts.map
@@ -0,0 +1,10 @@
1
+ export function powerset(arr) {
2
+ if (arr.length === 0) {
3
+ return [[]];
4
+ }
5
+ else {
6
+ const [a, ...rest] = arr;
7
+ return powerset(rest).flatMap((s) => [[a, ...s], s]);
8
+ }
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYmluYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbWJpbmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsUUFBUSxDQUFJLEdBQVE7SUFDbEMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNkLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN6QixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHBvd2Vyc2V0PFQ+KGFycjogVFtdKTogVFtdW10ge1xuICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbW11dO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFthLCAuLi5yZXN0XSA9IGFycjtcbiAgICByZXR1cm4gcG93ZXJzZXQocmVzdCkuZmxhdE1hcCgocykgPT4gW1thLCAuLi5zXSwgc10pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,12 @@
1
+ /**
2
+ * https://github.com/casey/ord/blob/0.5.1/bip.mediawiki
3
+ */
4
+ export * from './SatRange';
5
+ export * from './OrdOutput';
6
+ export * from './OutputLayout';
7
+ export * from './SatPoint';
8
+ export * from './psbt';
9
+ export * as inscriptions from './inscriptions';
10
+ export type { TapLeafScript, PreparedInscriptionRevealData } from './inscriptions';
11
+ export type { WalletUnspent } from './psbt';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AACnF,YAAY,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * https://github.com/casey/ord/blob/0.5.1/bip.mediawiki
3
+ */
4
+ export * from './SatRange';
5
+ export * from './OrdOutput';
6
+ export * from './OutputLayout';
7
+ export * from './SatPoint';
8
+ export * from './psbt';
9
+ export * as inscriptions from './inscriptions';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxZQUFZLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXNleS9vcmQvYmxvYi8wLjUuMS9iaXAubWVkaWF3aWtpXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9TYXRSYW5nZSc7XG5leHBvcnQgKiBmcm9tICcuL09yZE91dHB1dCc7XG5leHBvcnQgKiBmcm9tICcuL091dHB1dExheW91dCc7XG5leHBvcnQgKiBmcm9tICcuL1NhdFBvaW50JztcbmV4cG9ydCAqIGZyb20gJy4vcHNidCc7XG5leHBvcnQgKiBhcyBpbnNjcmlwdGlvbnMgZnJvbSAnLi9pbnNjcmlwdGlvbnMnO1xuZXhwb3J0IHR5cGUgeyBUYXBMZWFmU2NyaXB0LCBQcmVwYXJlZEluc2NyaXB0aW9uUmV2ZWFsRGF0YSB9IGZyb20gJy4vaW5zY3JpcHRpb25zJztcbmV4cG9ydCB0eXBlIHsgV2FsbGV0VW5zcGVudCB9IGZyb20gJy4vcHNidCc7XG4iXX0=
@@ -0,0 +1,58 @@
1
+ import { type TapLeafScript, type CoinName } from '@bitgo/wasm-utxo';
2
+ export type { TapLeafScript };
3
+ /**
4
+ * Prepared data for an inscription reveal transaction.
5
+ * Compatible with sdk-core's PreparedInscriptionRevealData.
6
+ */
7
+ export type PreparedInscriptionRevealData = {
8
+ /** The commit address (derived from outputScript for the given network) */
9
+ address: string;
10
+ /** Estimated virtual size of the reveal transaction */
11
+ revealTransactionVSize: number;
12
+ /** Tap leaf script for spending the commit output */
13
+ tapLeafScript: TapLeafScript;
14
+ };
15
+ /**
16
+ * BIP32-like interface compatible with both utxo-lib and wasm-utxo BIP32 types.
17
+ * The publicKey can be Buffer (utxo-lib) or Uint8Array (wasm-utxo).
18
+ */
19
+ export interface BIP32Like {
20
+ publicKey: Uint8Array;
21
+ }
22
+ /** Input type for inscription functions - either a BIP32-like key or raw public key bytes */
23
+ export type KeyInput = BIP32Like | Uint8Array;
24
+ /**
25
+ * Create the P2TR output script for an inscription.
26
+ *
27
+ * @param key - BIP32 key or public key bytes (32-byte x-only or 33-byte compressed)
28
+ * @param contentType - MIME type of the inscription (e.g., "text/plain", "image/png")
29
+ * @param inscriptionData - The inscription data bytes
30
+ * @returns The P2TR output script for the inscription commit address
31
+ */
32
+ export declare function createOutputScriptForInscription(key: KeyInput, contentType: string, inscriptionData: Uint8Array): Uint8Array;
33
+ /**
34
+ * Create inscription reveal data including the commit address and tap leaf script.
35
+ *
36
+ * @param key - BIP32 key or public key bytes (32-byte x-only or 33-byte compressed)
37
+ * @param contentType - MIME type of the inscription (e.g., "text/plain", "image/png")
38
+ * @param inscriptionData - The inscription data bytes
39
+ * @param coinName - Coin name (e.g., "btc", "tbtc")
40
+ * @returns PreparedInscriptionRevealData with address, vsize estimate, and tap leaf script
41
+ */
42
+ export declare function createInscriptionRevealData(key: KeyInput, contentType: string, inscriptionData: Uint8Array, coinName: CoinName): PreparedInscriptionRevealData;
43
+ /**
44
+ * Sign a reveal transaction.
45
+ *
46
+ * Creates and signs the reveal transaction that spends from the commit output
47
+ * and sends the inscription to the recipient.
48
+ *
49
+ * @param privateKey - 32-byte private key
50
+ * @param tapLeafScript - The tap leaf script from createInscriptionRevealData
51
+ * @param commitAddress - The commit address
52
+ * @param recipientAddress - Where to send the inscription
53
+ * @param unsignedCommitTx - The unsigned commit transaction bytes
54
+ * @param coinName - Coin name (e.g., "btc", "tbtc")
55
+ * @returns The signed PSBT as bytes
56
+ */
57
+ export declare function signRevealTransaction(privateKey: Uint8Array, tapLeafScript: TapLeafScript, commitAddress: string, recipientAddress: string, unsignedCommitTx: Uint8Array, coinName: CoinName): Uint8Array;
58
+ //# sourceMappingURL=inscriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inscriptions.d.ts","sourceRoot":"","sources":["../../src/inscriptions.ts"],"names":[],"mappings":"AAQA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,aAAa,EAAE,CAAC;AAM9B;;;GAGG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qDAAqD;IACrD,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,6FAA6F;AAC7F,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AA0B9C;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,QAAQ,EACb,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,UAAU,GAC1B,UAAU,CAKZ;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,QAAQ,EACb,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,UAAU,EAC3B,QAAQ,EAAE,QAAQ,GACjB,6BAA6B,CAc/B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,EAAE,UAAU,EAC5B,QAAQ,EAAE,QAAQ,GACjB,UAAU,CAcZ"}
@@ -0,0 +1,89 @@
1
+ /*
2
+ Functions for dealing with inscriptions.
3
+
4
+ Wrapper around @bitgo/wasm-utxo inscription functions for utxo-ord consumers.
5
+
6
+ See https://docs.ordinals.com/inscriptions.html
7
+ */
8
+ import { inscriptions as wasmInscriptions, address as wasmAddress, Transaction, ECPair, } from '@bitgo/wasm-utxo';
9
+ // default "postage" amount
10
+ // https://github.com/ordinals/ord/blob/0.24.2/src/lib.rs#L149
11
+ const DEFAULT_POSTAGE_SATS = BigInt(10000);
12
+ function isBIP32Like(key) {
13
+ return typeof key === 'object' && key !== null && 'publicKey' in key && !ArrayBuffer.isView(key);
14
+ }
15
+ /**
16
+ * Extract compressed public key from key input.
17
+ * Handles BIP32-like objects and raw pubkey bytes (32 or 33 bytes).
18
+ */
19
+ function getCompressedPublicKey(key) {
20
+ const pubkey = isBIP32Like(key) ? key.publicKey : key;
21
+ if (pubkey.length === 33) {
22
+ return pubkey;
23
+ }
24
+ if (pubkey.length === 32) {
25
+ // x-only pubkey - prepend 0x02 parity byte to make compressed
26
+ const compressedPubkey = new Uint8Array(33);
27
+ compressedPubkey[0] = 0x02;
28
+ compressedPubkey.set(pubkey, 1);
29
+ return compressedPubkey;
30
+ }
31
+ throw new Error(`Invalid public key length: ${pubkey.length}. Expected 32 or 33 bytes.`);
32
+ }
33
+ /**
34
+ * Create the P2TR output script for an inscription.
35
+ *
36
+ * @param key - BIP32 key or public key bytes (32-byte x-only or 33-byte compressed)
37
+ * @param contentType - MIME type of the inscription (e.g., "text/plain", "image/png")
38
+ * @param inscriptionData - The inscription data bytes
39
+ * @returns The P2TR output script for the inscription commit address
40
+ */
41
+ export function createOutputScriptForInscription(key, contentType, inscriptionData) {
42
+ const compressedPubkey = getCompressedPublicKey(key);
43
+ const ecpair = ECPair.fromPublicKey(compressedPubkey);
44
+ const result = wasmInscriptions.createInscriptionRevealData(ecpair, contentType, inscriptionData);
45
+ return result.outputScript;
46
+ }
47
+ /**
48
+ * Create inscription reveal data including the commit address and tap leaf script.
49
+ *
50
+ * @param key - BIP32 key or public key bytes (32-byte x-only or 33-byte compressed)
51
+ * @param contentType - MIME type of the inscription (e.g., "text/plain", "image/png")
52
+ * @param inscriptionData - The inscription data bytes
53
+ * @param coinName - Coin name (e.g., "btc", "tbtc")
54
+ * @returns PreparedInscriptionRevealData with address, vsize estimate, and tap leaf script
55
+ */
56
+ export function createInscriptionRevealData(key, contentType, inscriptionData, coinName) {
57
+ const compressedPubkey = getCompressedPublicKey(key);
58
+ const ecpair = ECPair.fromPublicKey(compressedPubkey);
59
+ const wasmResult = wasmInscriptions.createInscriptionRevealData(ecpair, contentType, inscriptionData);
60
+ // Convert outputScript to address for the given network
61
+ const address = wasmAddress.fromOutputScriptWithCoin(wasmResult.outputScript, coinName);
62
+ return {
63
+ address,
64
+ revealTransactionVSize: wasmResult.revealTransactionVSize,
65
+ tapLeafScript: wasmResult.tapLeafScript,
66
+ };
67
+ }
68
+ /**
69
+ * Sign a reveal transaction.
70
+ *
71
+ * Creates and signs the reveal transaction that spends from the commit output
72
+ * and sends the inscription to the recipient.
73
+ *
74
+ * @param privateKey - 32-byte private key
75
+ * @param tapLeafScript - The tap leaf script from createInscriptionRevealData
76
+ * @param commitAddress - The commit address
77
+ * @param recipientAddress - Where to send the inscription
78
+ * @param unsignedCommitTx - The unsigned commit transaction bytes
79
+ * @param coinName - Coin name (e.g., "btc", "tbtc")
80
+ * @returns The signed PSBT as bytes
81
+ */
82
+ export function signRevealTransaction(privateKey, tapLeafScript, commitAddress, recipientAddress, unsignedCommitTx, coinName) {
83
+ const ecpair = ECPair.fromPrivateKey(privateKey);
84
+ const commitTx = Transaction.fromBytes(unsignedCommitTx);
85
+ const commitOutputScript = wasmAddress.toOutputScriptWithCoin(commitAddress, coinName);
86
+ const recipientOutputScript = wasmAddress.toOutputScriptWithCoin(recipientAddress, coinName);
87
+ return wasmInscriptions.signRevealTransaction(ecpair, tapLeafScript, commitTx, commitOutputScript, recipientOutputScript, DEFAULT_POSTAGE_SATS);
88
+ }
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zY3JpcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc2NyaXB0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0VBTUU7QUFFRixPQUFPLEVBQ0wsWUFBWSxJQUFJLGdCQUFnQixFQUNoQyxPQUFPLElBQUksV0FBVyxFQUN0QixXQUFXLEVBQ1gsTUFBTSxHQUdQLE1BQU0sa0JBQWtCLENBQUM7QUFJMUIsMkJBQTJCO0FBQzNCLDhEQUE4RDtBQUM5RCxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxLQUFNLENBQUMsQ0FBQztBQTBCNUMsU0FBUyxXQUFXLENBQUMsR0FBYTtJQUNoQyxPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLFdBQVcsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25HLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLEdBQWE7SUFDM0MsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFFdEQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDekIsOERBQThEO1FBQzlELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzNCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLENBQUMsQ0FBQztBQUMzRixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQ0FBZ0MsQ0FDOUMsR0FBYSxFQUNiLFdBQW1CLEVBQ25CLGVBQTJCO0lBRTNCLE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEcsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsR0FBYSxFQUNiLFdBQW1CLEVBQ25CLGVBQTJCLEVBQzNCLFFBQWtCO0lBRWxCLE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXRELE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFdEcsd0RBQXdEO0lBQ3hELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXhGLE9BQU87UUFDTCxPQUFPO1FBQ1Asc0JBQXNCLEVBQUUsVUFBVSxDQUFDLHNCQUFzQjtRQUN6RCxhQUFhLEVBQUUsVUFBVSxDQUFDLGFBQWE7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxVQUFzQixFQUN0QixhQUE0QixFQUM1QixhQUFxQixFQUNyQixnQkFBd0IsRUFDeEIsZ0JBQTRCLEVBQzVCLFFBQWtCO0lBRWxCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN2RixNQUFNLHFCQUFxQixHQUFHLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU3RixPQUFPLGdCQUFnQixDQUFDLHFCQUFxQixDQUMzQyxNQUFNLEVBQ04sYUFBYSxFQUNiLFFBQVEsRUFDUixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLG9CQUFvQixDQUNyQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5GdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBpbnNjcmlwdGlvbnMuXG5cbldyYXBwZXIgYXJvdW5kIEBiaXRnby93YXNtLXV0eG8gaW5zY3JpcHRpb24gZnVuY3Rpb25zIGZvciB1dHhvLW9yZCBjb25zdW1lcnMuXG5cblNlZSBodHRwczovL2RvY3Mub3JkaW5hbHMuY29tL2luc2NyaXB0aW9ucy5odG1sXG4qL1xuXG5pbXBvcnQge1xuICBpbnNjcmlwdGlvbnMgYXMgd2FzbUluc2NyaXB0aW9ucyxcbiAgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcyxcbiAgVHJhbnNhY3Rpb24sXG4gIEVDUGFpcixcbiAgdHlwZSBUYXBMZWFmU2NyaXB0LFxuICB0eXBlIENvaW5OYW1lLFxufSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuZXhwb3J0IHR5cGUgeyBUYXBMZWFmU2NyaXB0IH07XG5cbi8vIGRlZmF1bHQgXCJwb3N0YWdlXCIgYW1vdW50XG4vLyBodHRwczovL2dpdGh1Yi5jb20vb3JkaW5hbHMvb3JkL2Jsb2IvMC4yNC4yL3NyYy9saWIucnMjTDE0OVxuY29uc3QgREVGQVVMVF9QT1NUQUdFX1NBVFMgPSBCaWdJbnQoMTBfMDAwKTtcblxuLyoqXG4gKiBQcmVwYXJlZCBkYXRhIGZvciBhbiBpbnNjcmlwdGlvbiByZXZlYWwgdHJhbnNhY3Rpb24uXG4gKiBDb21wYXRpYmxlIHdpdGggc2RrLWNvcmUncyBQcmVwYXJlZEluc2NyaXB0aW9uUmV2ZWFsRGF0YS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJlcGFyZWRJbnNjcmlwdGlvblJldmVhbERhdGEgPSB7XG4gIC8qKiBUaGUgY29tbWl0IGFkZHJlc3MgKGRlcml2ZWQgZnJvbSBvdXRwdXRTY3JpcHQgZm9yIHRoZSBnaXZlbiBuZXR3b3JrKSAqL1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIC8qKiBFc3RpbWF0ZWQgdmlydHVhbCBzaXplIG9mIHRoZSByZXZlYWwgdHJhbnNhY3Rpb24gKi9cbiAgcmV2ZWFsVHJhbnNhY3Rpb25WU2l6ZTogbnVtYmVyO1xuICAvKiogVGFwIGxlYWYgc2NyaXB0IGZvciBzcGVuZGluZyB0aGUgY29tbWl0IG91dHB1dCAqL1xuICB0YXBMZWFmU2NyaXB0OiBUYXBMZWFmU2NyaXB0O1xufTtcblxuLyoqXG4gKiBCSVAzMi1saWtlIGludGVyZmFjZSBjb21wYXRpYmxlIHdpdGggYm90aCB1dHhvLWxpYiBhbmQgd2FzbS11dHhvIEJJUDMyIHR5cGVzLlxuICogVGhlIHB1YmxpY0tleSBjYW4gYmUgQnVmZmVyICh1dHhvLWxpYikgb3IgVWludDhBcnJheSAod2FzbS11dHhvKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCSVAzMkxpa2Uge1xuICBwdWJsaWNLZXk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKiBJbnB1dCB0eXBlIGZvciBpbnNjcmlwdGlvbiBmdW5jdGlvbnMgLSBlaXRoZXIgYSBCSVAzMi1saWtlIGtleSBvciByYXcgcHVibGljIGtleSBieXRlcyAqL1xuZXhwb3J0IHR5cGUgS2V5SW5wdXQgPSBCSVAzMkxpa2UgfCBVaW50OEFycmF5O1xuXG5mdW5jdGlvbiBpc0JJUDMyTGlrZShrZXk6IEtleUlucHV0KToga2V5IGlzIEJJUDMyTGlrZSB7XG4gIHJldHVybiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJiBrZXkgIT09IG51bGwgJiYgJ3B1YmxpY0tleScgaW4ga2V5ICYmICFBcnJheUJ1ZmZlci5pc1ZpZXcoa2V5KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGNvbXByZXNzZWQgcHVibGljIGtleSBmcm9tIGtleSBpbnB1dC5cbiAqIEhhbmRsZXMgQklQMzItbGlrZSBvYmplY3RzIGFuZCByYXcgcHVia2V5IGJ5dGVzICgzMiBvciAzMyBieXRlcykuXG4gKi9cbmZ1bmN0aW9uIGdldENvbXByZXNzZWRQdWJsaWNLZXkoa2V5OiBLZXlJbnB1dCk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBwdWJrZXkgPSBpc0JJUDMyTGlrZShrZXkpID8ga2V5LnB1YmxpY0tleSA6IGtleTtcblxuICBpZiAocHVia2V5Lmxlbmd0aCA9PT0gMzMpIHtcbiAgICByZXR1cm4gcHVia2V5O1xuICB9XG4gIGlmIChwdWJrZXkubGVuZ3RoID09PSAzMikge1xuICAgIC8vIHgtb25seSBwdWJrZXkgLSBwcmVwZW5kIDB4MDIgcGFyaXR5IGJ5dGUgdG8gbWFrZSBjb21wcmVzc2VkXG4gICAgY29uc3QgY29tcHJlc3NlZFB1YmtleSA9IG5ldyBVaW50OEFycmF5KDMzKTtcbiAgICBjb21wcmVzc2VkUHVia2V5WzBdID0gMHgwMjtcbiAgICBjb21wcmVzc2VkUHVia2V5LnNldChwdWJrZXksIDEpO1xuICAgIHJldHVybiBjb21wcmVzc2VkUHVia2V5O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwdWJsaWMga2V5IGxlbmd0aDogJHtwdWJrZXkubGVuZ3RofS4gRXhwZWN0ZWQgMzIgb3IgMzMgYnl0ZXMuYCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBQMlRSIG91dHB1dCBzY3JpcHQgZm9yIGFuIGluc2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBCSVAzMiBrZXkgb3IgcHVibGljIGtleSBieXRlcyAoMzItYnl0ZSB4LW9ubHkgb3IgMzMtYnl0ZSBjb21wcmVzc2VkKVxuICogQHBhcmFtIGNvbnRlbnRUeXBlIC0gTUlNRSB0eXBlIG9mIHRoZSBpbnNjcmlwdGlvbiAoZS5nLiwgXCJ0ZXh0L3BsYWluXCIsIFwiaW1hZ2UvcG5nXCIpXG4gKiBAcGFyYW0gaW5zY3JpcHRpb25EYXRhIC0gVGhlIGluc2NyaXB0aW9uIGRhdGEgYnl0ZXNcbiAqIEByZXR1cm5zIFRoZSBQMlRSIG91dHB1dCBzY3JpcHQgZm9yIHRoZSBpbnNjcmlwdGlvbiBjb21taXQgYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT3V0cHV0U2NyaXB0Rm9ySW5zY3JpcHRpb24oXG4gIGtleTogS2V5SW5wdXQsXG4gIGNvbnRlbnRUeXBlOiBzdHJpbmcsXG4gIGluc2NyaXB0aW9uRGF0YTogVWludDhBcnJheVxuKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGNvbXByZXNzZWRQdWJrZXkgPSBnZXRDb21wcmVzc2VkUHVibGljS2V5KGtleSk7XG4gIGNvbnN0IGVjcGFpciA9IEVDUGFpci5mcm9tUHVibGljS2V5KGNvbXByZXNzZWRQdWJrZXkpO1xuICBjb25zdCByZXN1bHQgPSB3YXNtSW5zY3JpcHRpb25zLmNyZWF0ZUluc2NyaXB0aW9uUmV2ZWFsRGF0YShlY3BhaXIsIGNvbnRlbnRUeXBlLCBpbnNjcmlwdGlvbkRhdGEpO1xuICByZXR1cm4gcmVzdWx0Lm91dHB1dFNjcmlwdDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgaW5zY3JpcHRpb24gcmV2ZWFsIGRhdGEgaW5jbHVkaW5nIHRoZSBjb21taXQgYWRkcmVzcyBhbmQgdGFwIGxlYWYgc2NyaXB0LlxuICpcbiAqIEBwYXJhbSBrZXkgLSBCSVAzMiBrZXkgb3IgcHVibGljIGtleSBieXRlcyAoMzItYnl0ZSB4LW9ubHkgb3IgMzMtYnl0ZSBjb21wcmVzc2VkKVxuICogQHBhcmFtIGNvbnRlbnRUeXBlIC0gTUlNRSB0eXBlIG9mIHRoZSBpbnNjcmlwdGlvbiAoZS5nLiwgXCJ0ZXh0L3BsYWluXCIsIFwiaW1hZ2UvcG5nXCIpXG4gKiBAcGFyYW0gaW5zY3JpcHRpb25EYXRhIC0gVGhlIGluc2NyaXB0aW9uIGRhdGEgYnl0ZXNcbiAqIEBwYXJhbSBjb2luTmFtZSAtIENvaW4gbmFtZSAoZS5nLiwgXCJidGNcIiwgXCJ0YnRjXCIpXG4gKiBAcmV0dXJucyBQcmVwYXJlZEluc2NyaXB0aW9uUmV2ZWFsRGF0YSB3aXRoIGFkZHJlc3MsIHZzaXplIGVzdGltYXRlLCBhbmQgdGFwIGxlYWYgc2NyaXB0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnNjcmlwdGlvblJldmVhbERhdGEoXG4gIGtleTogS2V5SW5wdXQsXG4gIGNvbnRlbnRUeXBlOiBzdHJpbmcsXG4gIGluc2NyaXB0aW9uRGF0YTogVWludDhBcnJheSxcbiAgY29pbk5hbWU6IENvaW5OYW1lXG4pOiBQcmVwYXJlZEluc2NyaXB0aW9uUmV2ZWFsRGF0YSB7XG4gIGNvbnN0IGNvbXByZXNzZWRQdWJrZXkgPSBnZXRDb21wcmVzc2VkUHVibGljS2V5KGtleSk7XG4gIGNvbnN0IGVjcGFpciA9IEVDUGFpci5mcm9tUHVibGljS2V5KGNvbXByZXNzZWRQdWJrZXkpO1xuXG4gIGNvbnN0IHdhc21SZXN1bHQgPSB3YXNtSW5zY3JpcHRpb25zLmNyZWF0ZUluc2NyaXB0aW9uUmV2ZWFsRGF0YShlY3BhaXIsIGNvbnRlbnRUeXBlLCBpbnNjcmlwdGlvbkRhdGEpO1xuXG4gIC8vIENvbnZlcnQgb3V0cHV0U2NyaXB0IHRvIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBuZXR3b3JrXG4gIGNvbnN0IGFkZHJlc3MgPSB3YXNtQWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0V2l0aENvaW4od2FzbVJlc3VsdC5vdXRwdXRTY3JpcHQsIGNvaW5OYW1lKTtcblxuICByZXR1cm4ge1xuICAgIGFkZHJlc3MsXG4gICAgcmV2ZWFsVHJhbnNhY3Rpb25WU2l6ZTogd2FzbVJlc3VsdC5yZXZlYWxUcmFuc2FjdGlvblZTaXplLFxuICAgIHRhcExlYWZTY3JpcHQ6IHdhc21SZXN1bHQudGFwTGVhZlNjcmlwdCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaWduIGEgcmV2ZWFsIHRyYW5zYWN0aW9uLlxuICpcbiAqIENyZWF0ZXMgYW5kIHNpZ25zIHRoZSByZXZlYWwgdHJhbnNhY3Rpb24gdGhhdCBzcGVuZHMgZnJvbSB0aGUgY29tbWl0IG91dHB1dFxuICogYW5kIHNlbmRzIHRoZSBpbnNjcmlwdGlvbiB0byB0aGUgcmVjaXBpZW50LlxuICpcbiAqIEBwYXJhbSBwcml2YXRlS2V5IC0gMzItYnl0ZSBwcml2YXRlIGtleVxuICogQHBhcmFtIHRhcExlYWZTY3JpcHQgLSBUaGUgdGFwIGxlYWYgc2NyaXB0IGZyb20gY3JlYXRlSW5zY3JpcHRpb25SZXZlYWxEYXRhXG4gKiBAcGFyYW0gY29tbWl0QWRkcmVzcyAtIFRoZSBjb21taXQgYWRkcmVzc1xuICogQHBhcmFtIHJlY2lwaWVudEFkZHJlc3MgLSBXaGVyZSB0byBzZW5kIHRoZSBpbnNjcmlwdGlvblxuICogQHBhcmFtIHVuc2lnbmVkQ29tbWl0VHggLSBUaGUgdW5zaWduZWQgY29tbWl0IHRyYW5zYWN0aW9uIGJ5dGVzXG4gKiBAcGFyYW0gY29pbk5hbWUgLSBDb2luIG5hbWUgKGUuZy4sIFwiYnRjXCIsIFwidGJ0Y1wiKVxuICogQHJldHVybnMgVGhlIHNpZ25lZCBQU0JUIGFzIGJ5dGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduUmV2ZWFsVHJhbnNhY3Rpb24oXG4gIHByaXZhdGVLZXk6IFVpbnQ4QXJyYXksXG4gIHRhcExlYWZTY3JpcHQ6IFRhcExlYWZTY3JpcHQsXG4gIGNvbW1pdEFkZHJlc3M6IHN0cmluZyxcbiAgcmVjaXBpZW50QWRkcmVzczogc3RyaW5nLFxuICB1bnNpZ25lZENvbW1pdFR4OiBVaW50OEFycmF5LFxuICBjb2luTmFtZTogQ29pbk5hbWVcbik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBlY3BhaXIgPSBFQ1BhaXIuZnJvbVByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gIGNvbnN0IGNvbW1pdFR4ID0gVHJhbnNhY3Rpb24uZnJvbUJ5dGVzKHVuc2lnbmVkQ29tbWl0VHgpO1xuICBjb25zdCBjb21taXRPdXRwdXRTY3JpcHQgPSB3YXNtQWRkcmVzcy50b091dHB1dFNjcmlwdFdpdGhDb2luKGNvbW1pdEFkZHJlc3MsIGNvaW5OYW1lKTtcbiAgY29uc3QgcmVjaXBpZW50T3V0cHV0U2NyaXB0ID0gd2FzbUFkZHJlc3MudG9PdXRwdXRTY3JpcHRXaXRoQ29pbihyZWNpcGllbnRBZGRyZXNzLCBjb2luTmFtZSk7XG5cbiAgcmV0dXJuIHdhc21JbnNjcmlwdGlvbnMuc2lnblJldmVhbFRyYW5zYWN0aW9uKFxuICAgIGVjcGFpcixcbiAgICB0YXBMZWFmU2NyaXB0LFxuICAgIGNvbW1pdFR4LFxuICAgIGNvbW1pdE91dHB1dFNjcmlwdCxcbiAgICByZWNpcGllbnRPdXRwdXRTY3JpcHQsXG4gICAgREVGQVVMVF9QT1NUQUdFX1NBVFNcbiAgKTtcbn1cbiJdfQ==
@@ -0,0 +1,84 @@
1
+ import { fixedScriptWallet, type CoinName } from '@bitgo/wasm-utxo';
2
+ import { SatPoint } from './SatPoint';
3
+ import { OutputLayout } from './OutputLayout';
4
+ type WalletKeysArg = fixedScriptWallet.WalletKeysArg;
5
+ type SignPath = fixedScriptWallet.SignPath;
6
+ /**
7
+ * Network type from utxo-lib for backward compatibility.
8
+ */
9
+ type UtxolibNetwork = {
10
+ messagePrefix?: string;
11
+ bech32?: string;
12
+ pubKeyHash: number;
13
+ scriptHash: number;
14
+ wif: number;
15
+ };
16
+ export type WalletUnspent = {
17
+ id: string;
18
+ value: bigint;
19
+ chain: number;
20
+ index: number;
21
+ };
22
+ export type WalletOutputPath = {
23
+ chain: fixedScriptWallet.ChainCode;
24
+ index: number;
25
+ };
26
+ export type WalletInputBuilder = {
27
+ walletKeys: WalletKeysArg;
28
+ signer: SignPath['signer'];
29
+ cosigner: SignPath['cosigner'];
30
+ };
31
+ /**
32
+ * Describes all outputs of an inscription transaction
33
+ */
34
+ export type InscriptionTransactionOutputs = {
35
+ inscriptionRecipient: string | Uint8Array;
36
+ changeOutputs: [WalletOutputPath, WalletOutputPath];
37
+ };
38
+ /** @deprecated */
39
+ export type InscriptionOutputs = InscriptionTransactionOutputs;
40
+ export type InscriptionTransactionConstraints = {
41
+ feeRateSatKB: number;
42
+ minChangeOutput?: bigint;
43
+ minInscriptionOutput?: bigint;
44
+ maxInscriptionOutput?: bigint;
45
+ };
46
+ export declare const DefaultInscriptionConstraints: {
47
+ minChangeOutput: bigint;
48
+ minInscriptionOutput: bigint;
49
+ maxInscriptionOutput: bigint;
50
+ };
51
+ export declare function createPsbtFromOutputLayout(networkOrCoinName: CoinName | UtxolibNetwork, inputBuilder: WalletInputBuilder, unspents: WalletUnspent[], outputs: InscriptionTransactionOutputs, outputLayout: OutputLayout): fixedScriptWallet.BitGoPsbt;
52
+ /**
53
+ * @param inputs - inscription input must come first
54
+ * @param satPoint - location of the inscription
55
+ * @param outputs
56
+ * @param constraints
57
+ * @param minimizeInputs
58
+ */
59
+ export declare function findOutputLayoutForWalletUnspents(inputs: WalletUnspent[], satPoint: SatPoint, outputs: InscriptionTransactionOutputs, constraints: InscriptionTransactionConstraints, { minimizeInputs }?: {
60
+ minimizeInputs?: boolean | undefined;
61
+ }): {
62
+ inputs: WalletUnspent[];
63
+ layout: OutputLayout;
64
+ } | undefined;
65
+ export declare const MAX_UNSPENTS_FOR_OUTPUT_LAYOUT = 5;
66
+ export declare class ErrorNoLayout extends Error {
67
+ constructor();
68
+ }
69
+ /**
70
+ * @param networkOrCoinName - Coin name (e.g., "btc", "tbtc") or utxo-lib Network object
71
+ * @param inputBuilder
72
+ * @param unspent
73
+ * @param satPoint
74
+ * @param outputs
75
+ * @param constraints
76
+ * @param supplementaryUnspents - additional inputs to cover fee.
77
+ * @param [minimizeInputs=true] - try to find input combination with minimal fees. Limits supplementaryUnspents to 4.
78
+ */
79
+ export declare function createPsbtForSingleInscriptionPassingTransaction(networkOrCoinName: CoinName | UtxolibNetwork, inputBuilder: WalletInputBuilder, unspent: WalletUnspent | WalletUnspent[], satPoint: SatPoint, outputs: InscriptionTransactionOutputs, constraints: InscriptionTransactionConstraints, { supplementaryUnspents, minimizeInputs, }?: {
80
+ supplementaryUnspents?: WalletUnspent[];
81
+ minimizeInputs?: boolean;
82
+ }): fixedScriptWallet.BitGoPsbt;
83
+ export {};
84
+ //# sourceMappingURL=psbt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../src/psbt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ import { fixedScriptWallet, Dimensions } from '@bitgo/wasm-utxo';
2
+ import { OrdOutput } from './OrdOutput';
3
+ import { parseSatPoint, parseOutputId } from './SatPoint';
4
+ import { SatRange } from './SatRange';
5
+ import { getOrdOutputsForLayout, toArray, findOutputLayout } from './OutputLayout';
6
+ import { powerset } from './combinations';
7
+ const { BitGoPsbt, ChainCode } = fixedScriptWallet;
8
+ /**
9
+ * Map utxo-lib network objects to CoinName strings.
10
+ */
11
+ function networkToCoinName(network) {
12
+ // Bitcoin mainnet
13
+ if (network.bech32 === 'bc' && network.pubKeyHash === 0) {
14
+ return 'btc';
15
+ }
16
+ // Bitcoin testnet
17
+ if (network.bech32 === 'tb' && network.pubKeyHash === 111) {
18
+ return 'tbtc';
19
+ }
20
+ throw new Error(`Unknown network: ${JSON.stringify(network)}`);
21
+ }
22
+ /**
23
+ * Normalize network parameter - accepts either CoinName string or utxo-lib Network object.
24
+ */
25
+ function normalizeCoinName(networkOrCoinName) {
26
+ if (typeof networkOrCoinName === 'string') {
27
+ return networkOrCoinName;
28
+ }
29
+ return networkToCoinName(networkOrCoinName);
30
+ }
31
+ /** Segwit transaction overhead in virtual bytes */
32
+ const TX_SEGWIT_OVERHEAD_VSIZE = 10;
33
+ export const DefaultInscriptionConstraints = {
34
+ minChangeOutput: BigInt(10000),
35
+ minInscriptionOutput: BigInt(10000),
36
+ maxInscriptionOutput: BigInt(20000),
37
+ };
38
+ export function createPsbtFromOutputLayout(networkOrCoinName, inputBuilder, unspents, outputs, outputLayout) {
39
+ if (unspents.length === 0) {
40
+ throw new Error(`must provide at least one unspent`);
41
+ }
42
+ const coinName = normalizeCoinName(networkOrCoinName);
43
+ const psbt = BitGoPsbt.createEmpty(coinName, inputBuilder.walletKeys);
44
+ // Add inputs
45
+ unspents.forEach((u) => {
46
+ const { txid, vout } = parseOutputId(u.id);
47
+ psbt.addWalletInput({ txid, vout, value: u.value }, inputBuilder.walletKeys, {
48
+ scriptId: { chain: u.chain, index: u.index },
49
+ signPath: { signer: inputBuilder.signer, cosigner: inputBuilder.cosigner },
50
+ });
51
+ });
52
+ // Build ord outputs from layout
53
+ const ordInput = OrdOutput.joinAll(unspents.map((u) => new OrdOutput(u.value)));
54
+ const ordOutputs = getOrdOutputsForLayout(ordInput, outputLayout);
55
+ toArray(ordOutputs).forEach((ordOutput) => {
56
+ if (ordOutput === null) {
57
+ return;
58
+ }
59
+ switch (ordOutput) {
60
+ // skip fee output (virtual)
61
+ case ordOutputs.feeOutput:
62
+ return;
63
+ // add padding/change outputs
64
+ case ordOutputs.firstChangeOutput:
65
+ case ordOutputs.secondChangeOutput:
66
+ const { chain, index } = ordOutput === ordOutputs.firstChangeOutput ? outputs.changeOutputs[0] : outputs.changeOutputs[1];
67
+ psbt.addWalletOutput(inputBuilder.walletKeys, { chain, index, value: ordOutput.value });
68
+ break;
69
+ // add actual inscription output
70
+ case ordOutputs.inscriptionOutput:
71
+ const recipient = outputs.inscriptionRecipient;
72
+ if (typeof recipient === 'string') {
73
+ psbt.addOutput(recipient, ordOutput.value);
74
+ }
75
+ else if (recipient instanceof Uint8Array) {
76
+ psbt.addOutput(recipient, ordOutput.value);
77
+ }
78
+ else {
79
+ throw new Error('inscriptionRecipient must be a string or Uint8Array');
80
+ }
81
+ break;
82
+ }
83
+ });
84
+ return psbt;
85
+ }
86
+ function toSatRange(p) {
87
+ const { offset } = parseSatPoint(p);
88
+ return new SatRange(offset, offset);
89
+ }
90
+ function getFee(vsize, rateSatPerKB) {
91
+ return BigInt(Math.ceil((vsize * rateSatPerKB) / 1000));
92
+ }
93
+ /**
94
+ * @param inputs - inscription input must come first
95
+ * @param satPoint - location of the inscription
96
+ * @param outputs
97
+ * @param constraints
98
+ * @param minimizeInputs
99
+ */
100
+ export function findOutputLayoutForWalletUnspents(inputs, satPoint, outputs, constraints, { minimizeInputs = false } = {}) {
101
+ if (minimizeInputs) {
102
+ return findSmallestOutputLayoutForWalletUnspents(inputs, satPoint, outputs, constraints);
103
+ }
104
+ if (inputs.length === 0) {
105
+ throw new Error(`must provide at least one input`);
106
+ }
107
+ if (outputs.changeOutputs[0].chain !== outputs.changeOutputs[1].chain) {
108
+ // otherwise our fee calc is too complicated
109
+ throw new Error(`wallet outputs must be on same chain`);
110
+ }
111
+ const { minChangeOutput = DefaultInscriptionConstraints.minChangeOutput, minInscriptionOutput = DefaultInscriptionConstraints.minInscriptionOutput, maxInscriptionOutput = DefaultInscriptionConstraints.maxInscriptionOutput, } = constraints;
112
+ // Calculate input vsize using wasm-utxo Dimensions
113
+ const inputDimensions = inputs.reduce((dims, input) => dims.plus(Dimensions.fromInput({ chain: input.chain })), Dimensions.empty());
114
+ const inputsVSize = inputDimensions.getInputVSize();
115
+ // Calculate output vsize using wasm-utxo Dimensions
116
+ const outputDimensions = Dimensions.fromOutput({
117
+ scriptType: ChainCode.scriptType(outputs.changeOutputs[0].chain),
118
+ });
119
+ const outputVSize = outputDimensions.getOutputVSize();
120
+ // Join all the inputs into a single inscriptionOutput.
121
+ // For the purposes of finding a layout there is no difference.
122
+ const inscriptionOutput = OrdOutput.joinAll(inputs.map((i) => new OrdOutput(i.value, i === inputs[0] ? [toSatRange(satPoint)] : [])));
123
+ const layout = findOutputLayout(inscriptionOutput, {
124
+ minChangeOutput,
125
+ minInscriptionOutput,
126
+ maxInscriptionOutput,
127
+ feeFixed: getFee(TX_SEGWIT_OVERHEAD_VSIZE + inputsVSize, constraints.feeRateSatKB),
128
+ feePerOutput: getFee(outputVSize, constraints.feeRateSatKB),
129
+ });
130
+ return layout ? { inputs, layout } : undefined;
131
+ }
132
+ export const MAX_UNSPENTS_FOR_OUTPUT_LAYOUT = 5;
133
+ /**
134
+ * @param inputs - inscription input must come first
135
+ * @param satPoint - location of the inscription
136
+ * @param outputs
137
+ * @param constraints
138
+ */
139
+ function findSmallestOutputLayoutForWalletUnspents(inputs, satPoint, outputs, constraints) {
140
+ if (MAX_UNSPENTS_FOR_OUTPUT_LAYOUT < inputs.length) {
141
+ throw new Error(`input array is too large`);
142
+ }
143
+ // create powerset of all supplementary inputs and find the cheapest result
144
+ const inputsArr = [inputs, ...powerset(inputs.slice(1)).map((s) => [inputs[0], ...s])];
145
+ return inputsArr
146
+ .map((inputs) => findOutputLayoutForWalletUnspents(inputs, satPoint, outputs, constraints))
147
+ .reduce((best, next) => {
148
+ if (best === undefined) {
149
+ return next;
150
+ }
151
+ if (next === undefined) {
152
+ return best;
153
+ }
154
+ return best.layout.feeOutput < next.layout.feeOutput ? best : next;
155
+ });
156
+ }
157
+ export class ErrorNoLayout extends Error {
158
+ constructor() {
159
+ super('Could not find output layout for inscription passing transaction');
160
+ }
161
+ }
162
+ /**
163
+ * @param networkOrCoinName - Coin name (e.g., "btc", "tbtc") or utxo-lib Network object
164
+ * @param inputBuilder
165
+ * @param unspent
166
+ * @param satPoint
167
+ * @param outputs
168
+ * @param constraints
169
+ * @param supplementaryUnspents - additional inputs to cover fee.
170
+ * @param [minimizeInputs=true] - try to find input combination with minimal fees. Limits supplementaryUnspents to 4.
171
+ */
172
+ export function createPsbtForSingleInscriptionPassingTransaction(networkOrCoinName, inputBuilder, unspent, satPoint, outputs, constraints, { supplementaryUnspents = [], minimizeInputs = true, } = {}) {
173
+ // support for legacy call style
174
+ if (Array.isArray(unspent)) {
175
+ if (unspent.length !== 1) {
176
+ throw new Error(`can only pass single unspent`);
177
+ }
178
+ unspent = unspent[0];
179
+ }
180
+ const result = findOutputLayoutForWalletUnspents([unspent, ...supplementaryUnspents], satPoint, outputs, constraints, { minimizeInputs });
181
+ if (!result) {
182
+ throw new ErrorNoLayout();
183
+ }
184
+ return createPsbtFromOutputLayout(networkOrCoinName, inputBuilder, result.inputs, outputs, result.layout);
185
+ }
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQWlCLE1BQU0sa0JBQWtCLENBQUM7QUFFaEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBWSxNQUFNLFlBQVksQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxzQkFBc0IsRUFBZ0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsaUJBQWlCLENBQUM7QUFhbkQ7O0dBRUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE9BQXVCO0lBQ2hELGtCQUFrQjtJQUNsQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0Qsa0JBQWtCO0lBQ2xCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUMxRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxpQkFBNEM7SUFDckUsSUFBSSxPQUFPLGlCQUFpQixLQUFLLFFBQVEsRUFBRSxD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QUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxpQ0FBaUMsQ0FDOUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyxFQUNuQyxRQUFRLEVBQ1IsT0FBTyxFQUNQLFdBQVcsRUFDWCxFQUFFLGNBQWMsRUFBRSxDQUNuQixDQUFDO0lBRUYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxPQUFPLDBCQUEwQixDQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpeGVkU2NyaXB0V2FsbGV0LCBEaW1lbnNpb25zLCB0eXBlIENvaW5OYW1lIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IE9yZE91dHB1dCB9IGZyb20gJy4vT3JkT3V0cHV0JztcbmltcG9ydCB7IHBhcnNlU2F0UG9pbnQsIHBhcnNlT3V0cHV0SWQsIFNhdFBvaW50IH0gZnJvbSAnLi9TYXRQb2ludCc7XG5pbXBvcnQgeyBTYXRSYW5nZSB9IGZyb20gJy4vU2F0UmFuZ2UnO1xuaW1wb3J0IHsgZ2V0T3JkT3V0cHV0c0ZvckxheW91dCwgT3V0cHV0TGF5b3V0LCB0b0FycmF5LCBmaW5kT3V0cHV0TGF5b3V0IH0gZnJvbSAnLi9PdXRwdXRMYXlvdXQnO1xuaW1wb3J0IHsgcG93ZXJzZXQgfSBmcm9tICcuL2NvbWJpbmF0aW9ucyc7XG5cbnR5cGUgV2FsbGV0S2V5c0FyZyA9IGZpeGVkU2NyaXB0V2FsbGV0LldhbGxldEtleXNBcmc7XG50eXBlIFNpZ25QYXRoID0gZml4ZWRTY3JpcHRXYWxsZXQuU2lnblBhdGg7XG5jb25zdCB7IEJpdEdvUHNidCwgQ2hhaW5Db2RlIH0gPSBmaXhlZFNjcmlwdFdhbGxldDtcblxuLyoqXG4gKiBOZXR3b3JrIHR5cGUgZnJvbSB1dHhvLWxpYiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xudHlwZSBVdHhvbGliTmV0d29yayA9IHtcbiAgbWVzc2FnZVByZWZpeD86IHN0cmluZztcbiAgYmVjaDMyPzogc3RyaW5nO1xuICBwdWJLZXlIYXNoOiBudW1iZXI7XG4gIHNjcmlwdEhhc2g6IG51bWJlcjtcbiAgd2lmOiBudW1iZXI7XG59O1xuXG4vKipcbiAqIE1hcCB1dHhvLWxpYiBuZXR3b3JrIG9iamVjdHMgdG8gQ29pbk5hbWUgc3RyaW5ncy5cbiAqL1xuZnVuY3Rpb24gbmV0d29ya1RvQ29pbk5hbWUobmV0d29yazogVXR4b2xpYk5ldHdvcmspOiBDb2luTmFtZSB7XG4gIC8vIEJpdGNvaW4gbWFpbm5ldFxuICBpZiAobmV0d29yay5iZWNoMzIgPT09ICdiYycgJiYgbmV0d29yay5wdWJLZXlIYXNoID09PSAwKSB7XG4gICAgcmV0dXJuICdidGMnO1xuICB9XG4gIC8vIEJpdGNvaW4gdGVzdG5ldFxuICBpZiAobmV0d29yay5iZWNoMzIgPT09ICd0YicgJiYgbmV0d29yay5wdWJLZXlIYXNoID09PSAxMTEpIHtcbiAgICByZXR1cm4gJ3RidGMnO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBuZXR3b3JrOiAke0pTT04uc3RyaW5naWZ5KG5ldHdvcmspfWApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBuZXR3b3JrIHBhcmFtZXRlciAtIGFjY2VwdHMgZWl0aGVyIENvaW5OYW1lIHN0cmluZyBvciB1dHhvLWxpYiBOZXR3b3JrIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQ29pbk5hbWUobmV0d29ya09yQ29pbk5hbWU6IENvaW5OYW1lIHwgVXR4b2xpYk5ldHdvcmspOiBDb2luTmFtZSB7XG4gIGlmICh0eXBlb2YgbmV0d29ya09yQ29pbk5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5ldHdvcmtPckNvaW5OYW1lO1xuICB9XG4gIHJldHVybiBuZXR3b3JrVG9Db2luTmFtZShuZXR3b3JrT3JDb2luTmFtZSk7XG59XG5cbi8qKiBTZWd3aXQgdHJhbnNhY3Rpb24gb3ZlcmhlYWQgaW4gdmlydHVhbCBieXRlcyAqL1xuY29uc3QgVFhfU0VHV0lUX09WRVJIRUFEX1ZTSVpFID0gMTA7XG5cbmV4cG9ydCB0eXBlIFdhbGxldFVuc3BlbnQgPSB7XG4gIGlkOiBzdHJpbmc7IC8vIFwidHhpZDp2b3V0XCJcbiAgdmFsdWU6IGJpZ2ludDtcbiAgY2hhaW46IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdhbGxldE91dHB1dFBhdGggPSB7XG4gIGNoYWluOiBmaXhlZFNjcmlwdFdhbGxldC5DaGFpbkNvZGU7XG4gIGluZGV4OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXYWxsZXRJbnB1dEJ1aWxkZXIgPSB7XG4gIHdhbGxldEtleXM6IFdhbGxldEtleXNBcmc7XG4gIHNpZ25lcjogU2lnblBhdGhbJ3NpZ25lciddO1xuICBjb3NpZ25lcjogU2lnblBhdGhbJ2Nvc2lnbmVyJ107XG59O1xuXG4vKipcbiAqIERlc2NyaWJlcyBhbGwgb3V0cHV0cyBvZiBhbiBpbnNjcmlwdGlvbiB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgdHlwZSBJbnNjcmlwdGlvblRyYW5zYWN0aW9uT3V0cHV0cyA9IHtcbiAgaW5zY3JpcHRpb25SZWNpcGllbnQ6IHN0cmluZyB8IFVpbnQ4QXJyYXk7XG4gIGNoYW5nZU91dHB1dHM6IFtXYWxsZXRPdXRwdXRQYXRoLCBXYWxsZXRPdXRwdXRQYXRoXTtcbn07XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IHR5cGUgSW5zY3JpcHRpb25PdXRwdXRzID0gSW5zY3JpcHRpb25UcmFuc2FjdGlvbk91dHB1dHM7XG5cbmV4cG9ydCB0eXBlIEluc2NyaXB0aW9uVHJhbnNhY3Rpb25Db25zdHJhaW50cyA9IHtcbiAgZmVlUmF0ZVNhdEtCOiBudW1iZXI7XG4gIG1pbkNoYW5nZU91dHB1dD86IGJpZ2ludDtcbiAgbWluSW5zY3JpcHRpb25PdXRwdXQ/OiBiaWdpbnQ7XG4gIG1heEluc2NyaXB0aW9uT3V0cHV0PzogYmlnaW50O1xufTtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRJbnNjcmlwdGlvbkNvbnN0cmFpbnRzID0ge1xuICBtaW5DaGFuZ2VPdXRwdXQ6IEJpZ0ludCgxMF8wMDApLFxuICBtaW5JbnNjcmlwdGlvbk91dHB1dDogQmlnSW50KDEwXzAwMCksXG4gIG1heEluc2NyaXB0aW9uT3V0cHV0OiBCaWdJbnQoMjBfMDAwKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQc2J0RnJvbU91dHB1dExheW91dChcbiAgbmV0d29ya09yQ29pbk5hbWU6IENvaW5OYW1lIHwgVXR4b2xpYk5ldHdvcmssXG4gIGlucHV0QnVpbGRlcjogV2FsbGV0SW5wdXRCdWlsZGVyLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudFtdLFxuICBvdXRwdXRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uT3V0cHV0cyxcbiAgb3V0cHV0TGF5b3V0OiBPdXRwdXRMYXlvdXRcbik6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB7XG4gIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgdW5zcGVudGApO1xuICB9XG5cbiAgY29uc3QgY29pbk5hbWUgPSBub3JtYWxpemVDb2luTmFtZShuZXR3b3JrT3JDb2luTmFtZSk7XG4gIGNvbnN0IHBzYnQgPSBCaXRHb1BzYnQuY3JlYXRlRW1wdHkoY29pbk5hbWUsIGlucHV0QnVpbGRlci53YWxsZXRLZXlzKTtcblxuICAvLyBBZGQgaW5wdXRzXG4gIHVuc3BlbnRzLmZvckVhY2goKHUpID0+IHtcbiAgICBjb25zdCB7IHR4aWQsIHZvdXQgfSA9IHBhcnNlT3V0cHV0SWQodS5pZCk7XG4gICAgcHNidC5hZGRXYWxsZXRJbnB1dCh7IHR4aWQsIHZvdXQsIHZhbHVlOiB1LnZhbHVlIH0sIGlucHV0QnVpbGRlci53YWxsZXRLZXlzLCB7XG4gICAgICBzY3JpcHRJZDogeyBjaGFpbjogdS5jaGFpbiwgaW5kZXg6IHUuaW5kZXggfSxcbiAgICAgIHNpZ25QYXRoOiB7IHNpZ25lcjogaW5wdXRCdWlsZGVyLnNpZ25lciwgY29zaWduZXI6IGlucHV0QnVpbGRlci5jb3NpZ25lciB9LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBCdWlsZCBvcmQgb3V0cHV0cyBmcm9tIGxheW91dFxuICBjb25zdCBvcmRJbnB1dCA9IE9yZE91dHB1dC5qb2luQWxsKHVuc3BlbnRzLm1hcCgodSkgPT4gbmV3IE9yZE91dHB1dCh1LnZhbHVlKSkpO1xuICBjb25zdCBvcmRPdXRwdXRzID0gZ2V0T3JkT3V0cHV0c0ZvckxheW91dChvcmRJbnB1dCwgb3V0cHV0TGF5b3V0KTtcblxuICB0b0FycmF5KG9yZE91dHB1dHMpLmZvckVhY2goKG9yZE91dHB1dCkgPT4ge1xuICAgIGlmIChvcmRPdXRwdXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChvcmRPdXRwdXQpIHtcbiAgICAgIC8vIHNraXAgZmVlIG91dHB1dCAodmlydHVhbClcbiAgICAgIGNhc2Ugb3JkT3V0cHV0cy5mZWVPdXRwdXQ6XG4gICAgICAgIHJldHVybjtcbiAgICAgIC8vIGFkZCBwYWRkaW5nL2NoYW5nZSBvdXRwdXRzXG4gICAgICBjYXNlIG9yZE91dHB1dHMuZmlyc3RDaGFuZ2VPdXRwdXQ6XG4gICAgICBjYXNlIG9yZE91dHB1dHMuc2Vjb25kQ2hhbmdlT3V0cHV0OlxuICAgICAgICBjb25zdCB7IGNoYWluLCBpbmRleCB9ID1cbiAgICAgICAgICBvcmRPdXRwdXQgPT09IG9yZE91dHB1dHMuZmlyc3RDaGFuZ2VPdXRwdXQgPyBvdXRwdXRzLmNoYW5nZU91dHB1dHNbMF0gOiBvdXRwdXRzLmNoYW5nZU91dHB1dHNbMV07XG4gICAgICAgIHBzYnQuYWRkV2FsbGV0T3V0cHV0KGlucHV0QnVpbGRlci53YWxsZXRLZXlzLCB7IGNoYWluLCBpbmRleCwgdmFsdWU6IG9yZE91dHB1dC52YWx1ZSB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBhZGQgYWN0dWFsIGluc2NyaXB0aW9uIG91dHB1dFxuICAgICAgY2FzZSBvcmRPdXRwdXRzLmluc2NyaXB0aW9uT3V0cHV0OlxuICAgICAgICBjb25zdCByZWNpcGllbnQgPSBvdXRwdXRzLmluc2NyaXB0aW9uUmVjaXBpZW50O1xuICAgICAgICBpZiAodHlwZW9mIHJlY2lwaWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBwc2J0LmFkZE91dHB1dChyZWNpcGllbnQsIG9yZE91dHB1dC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVjaXBpZW50IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgIHBzYnQuYWRkT3V0cHV0KHJlY2lwaWVudCwgb3JkT3V0cHV0LnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luc2NyaXB0aW9uUmVjaXBpZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgVWludDhBcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHBzYnQ7XG59XG5cbmZ1bmN0aW9uIHRvU2F0UmFuZ2UocDogU2F0UG9pbnQpIHtcbiAgY29uc3QgeyBvZmZzZXQgfSA9IHBhcnNlU2F0UG9pbnQocCk7XG4gIHJldHVybiBuZXcgU2F0UmFuZ2Uob2Zmc2V0LCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiBnZXRGZWUodnNpemU6IG51bWJlciwgcmF0ZVNhdFBlcktCOiBudW1iZXIpOiBiaWdpbnQge1xuICByZXR1cm4gQmlnSW50KE1hdGguY2VpbCgodnNpemUgKiByYXRlU2F0UGVyS0IpIC8gMTAwMCkpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBpbnB1dHMgLSBpbnNjcmlwdGlvbiBpbnB1dCBtdXN0IGNvbWUgZmlyc3RcbiAqIEBwYXJhbSBzYXRQb2ludCAtIGxvY2F0aW9uIG9mIHRoZSBpbnNjcmlwdGlvblxuICogQHBhcmFtIG91dHB1dHNcbiAqIEBwYXJhbSBjb25zdHJhaW50c1xuICogQHBhcmFtIG1pbmltaXplSW5wdXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3V0cHV0TGF5b3V0Rm9yV2FsbGV0VW5zcGVudHMoXG4gIGlucHV0czogV2FsbGV0VW5zcGVudFtdLFxuICBzYXRQb2ludDogU2F0UG9pbnQsXG4gIG91dHB1dHM6IEluc2NyaXB0aW9uVHJhbnNhY3Rpb25PdXRwdXRzLFxuICBjb25zdHJhaW50czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbkNvbnN0cmFpbnRzLFxuICB7IG1pbmltaXplSW5wdXRzID0gZmFsc2UgfSA9IHt9XG4pOiB7IGlucHV0czogV2FsbGV0VW5zcGVudFtdOyBsYXlvdXQ6IE91dHB1dExheW91dCB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG1pbmltaXplSW5wdXRzKSB7XG4gICAgcmV0dXJuIGZpbmRTbWFsbGVzdE91dHB1dExheW91dEZvcldhbGxldFVuc3BlbnRzKGlucHV0cywgc2F0UG9pbnQsIG91dHB1dHMsIGNvbnN0cmFpbnRzKTtcbiAgfVxuXG4gIGlmIChpbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIGlucHV0YCk7XG4gIH1cblxuICBpZiAob3V0cHV0cy5jaGFuZ2VPdXRwdXRzWzBdLmNoYWluICE9PSBvdXRwdXRzLmNoYW5nZU91dHB1dHNbMV0uY2hhaW4pIHtcbiAgICAvLyBvdGhlcndpc2Ugb3VyIGZlZSBjYWxjIGlzIHRvbyBjb21wbGljYXRlZFxuICAgIHRocm93IG5ldyBFcnJvcihgd2FsbGV0IG91dHB1dHMgbXVzdCBiZSBvbiBzYW1lIGNoYWluYCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbWluQ2hhbmdlT3V0cHV0ID0gRGVmYXVsdEluc2NyaXB0aW9uQ29uc3RyYWludHMubWluQ2hhbmdlT3V0cHV0LFxuICAgIG1pbkluc2NyaXB0aW9uT3V0cHV0ID0gRGVmYXVsdEluc2NyaXB0aW9uQ29uc3RyYWludHMubWluSW5zY3JpcHRpb25PdXRwdXQsXG4gICAgbWF4SW5zY3JpcHRpb25PdXRwdXQgPSBEZWZhdWx0SW5zY3JpcHRpb25Db25zdHJhaW50cy5tYXhJbnNjcmlwdGlvbk91dHB1dCxcbiAgfSA9IGNvbnN0cmFpbnRzO1xuXG4gIC8vIENhbGN1bGF0ZSBpbnB1dCB2c2l6ZSB1c2luZyB3YXNtLXV0eG8gRGltZW5zaW9uc1xuICBjb25zdCBpbnB1dERpbWVuc2lvbnMgPSBpbnB1dHMucmVkdWNlKFxuICAgIChkaW1zLCBpbnB1dCkgPT4gZGltcy5wbHVzKERpbWVuc2lvbnMuZnJvbUlucHV0KHsgY2hhaW46IGlucHV0LmNoYWluIH0pKSxcbiAgICBEaW1lbnNpb25zLmVtcHR5KClcbiAgKTtcbiAgY29uc3QgaW5wdXRzVlNpemUgPSBpbnB1dERpbWVuc2lvbnMuZ2V0SW5wdXRWU2l6ZSgpO1xuXG4gIC8vIENhbGN1bGF0ZSBvdXRwdXQgdnNpemUgdXNpbmcgd2FzbS11dHhvIERpbWVuc2lvbnNcbiAgY29uc3Qgb3V0cHV0RGltZW5zaW9ucyA9IERpbWVuc2lvbnMuZnJvbU91dHB1dCh7XG4gICAgc2NyaXB0VHlwZTogQ2hhaW5Db2RlLnNjcmlwdFR5cGUob3V0cHV0cy5jaGFuZ2VPdXRwdXRzWzBdLmNoYWluKSxcbiAgfSk7XG4gIGNvbnN0IG91dHB1dFZTaXplID0gb3V0cHV0RGltZW5zaW9ucy5nZXRPdXRwdXRWU2l6ZSgpO1xuXG4gIC8vIEpvaW4gYWxsIHRoZSBpbnB1dHMgaW50byBhIHNpbmdsZSBpbnNjcmlwdGlvbk91dHB1dC5cbiAgLy8gRm9yIHRoZSBwdXJwb3NlcyBvZiBmaW5kaW5nIGEgbGF5b3V0IHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UuXG4gIGNvbnN0IGluc2NyaXB0aW9uT3V0cHV0ID0gT3JkT3V0cHV0LmpvaW5BbGwoXG4gICAgaW5wdXRzLm1hcCgoaSkgPT4gbmV3IE9yZE91dHB1dChpLnZhbHVlLCBpID09PSBpbnB1dHNbMF0gPyBbdG9TYXRSYW5nZShzYXRQb2ludCldIDogW10pKVxuICApO1xuICBjb25zdCBsYXlvdXQgPSBmaW5kT3V0cHV0TGF5b3V0KGluc2NyaXB0aW9uT3V0cHV0LCB7XG4gICAgbWluQ2hhbmdlT3V0cHV0LFxuICAgIG1pbkluc2NyaXB0aW9uT3V0cHV0LFxuICAgIG1heEluc2NyaXB0aW9uT3V0cHV0LFxuICAgIGZlZUZpeGVkOiBnZXRGZWUoVFhfU0VHV0lUX09WRVJIRUFEX1ZTSVpFICsgaW5wdXRzVlNpemUsIGNvbnN0cmFpbnRzLmZlZVJhdGVTYXRLQiksXG4gICAgZmVlUGVyT3V0cHV0OiBnZXRGZWUob3V0cHV0VlNpemUsIGNvbnN0cmFpbnRzLmZlZVJhdGVTYXRLQiksXG4gIH0pO1xuXG4gIHJldHVybiBsYXlvdXQgPyB7IGlucHV0cywgbGF5b3V0IH0gOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBNQVhfVU5TUEVOVFNfRk9SX09VVFBVVF9MQVlPVVQgPSA1O1xuXG4vKipcbiAqIEBwYXJhbSBpbnB1dHMgLSBpbnNjcmlwdGlvbiBpbnB1dCBtdXN0IGNvbWUgZmlyc3RcbiAqIEBwYXJhbSBzYXRQb2ludCAtIGxvY2F0aW9uIG9mIHRoZSBpbnNjcmlwdGlvblxuICogQHBhcmFtIG91dHB1dHNcbiAqIEBwYXJhbSBjb25zdHJhaW50c1xuICovXG5mdW5jdGlvbiBmaW5kU21hbGxlc3RPdXRwdXRMYXlvdXRGb3JXYWxsZXRVbnNwZW50cyhcbiAgaW5wdXRzOiBXYWxsZXRVbnNwZW50W10sXG4gIHNhdFBvaW50OiBTYXRQb2ludCxcbiAgb3V0cHV0czogSW5zY3JpcHRpb25UcmFuc2FjdGlvbk91dHB1dHMsXG4gIGNvbnN0cmFpbnRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uQ29uc3RyYWludHNcbik6IHsgaW5wdXRzOiBXYWxsZXRVbnNwZW50W107IGxheW91dDogT3V0cHV0TGF5b3V0IH0gfCB1bmRlZmluZWQge1xuICBpZiAoTUFYX1VOU1BFTlRTX0ZPUl9PVVRQVVRfTEFZT1VUIDwgaW5wdXRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgaW5wdXQgYXJyYXkgaXMgdG9vIGxhcmdlYCk7XG4gIH1cbiAgLy8gY3JlYXRlIHBvd2Vyc2V0IG9mIGFsbCBzdXBwbGVtZW50YXJ5IGlucHV0cyBhbmQgZmluZCB0aGUgY2hlYXBlc3QgcmVzdWx0XG4gIGNvbnN0IGlucHV0c0FyciA9IFtpbnB1dHMsIC4uLnBvd2Vyc2V0KGlucHV0cy5zbGljZSgxKSkubWFwKChzKSA9PiBbaW5wdXRzWzBdLCAuLi5zXSldO1xuICByZXR1cm4gaW5wdXRzQXJyXG4gICAgLm1hcCgoaW5wdXRzKSA9PiBmaW5kT3V0cHV0TGF5b3V0Rm9yV2FsbGV0VW5zcGVudHMoaW5wdXRzLCBzYXRQb2ludCwgb3V0cHV0cywgY29uc3RyYWludHMpKVxuICAgIC5yZWR1Y2UoKGJlc3QsIG5leHQpID0+IHtcbiAgICAgIGlmIChiZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICB9XG4gICAgICBpZiAobmV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBiZXN0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJlc3QubGF5b3V0LmZlZU91dHB1dCA8IG5leHQubGF5b3V0LmZlZU91dHB1dCA/IGJlc3QgOiBuZXh0O1xuICAgIH0pO1xufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JOb0xheW91dCBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ0NvdWxkIG5vdCBmaW5kIG91dHB1dCBsYXlvdXQgZm9yIGluc2NyaXB0aW9uIHBhc3NpbmcgdHJhbnNhY3Rpb24nKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBuZXR3b3JrT3JDb2luTmFtZSAtIENvaW4gbmFtZSAoZS5nLiwgXCJidGNcIiwgXCJ0YnRjXCIpIG9yIHV0eG8tbGliIE5ldHdvcmsgb2JqZWN0XG4gKiBAcGFyYW0gaW5wdXRCdWlsZGVyXG4gKiBAcGFyYW0gdW5zcGVudFxuICogQHBhcmFtIHNhdFBvaW50XG4gKiBAcGFyYW0gb3V0cHV0c1xuICogQHBhcmFtIGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0gc3VwcGxlbWVudGFyeVVuc3BlbnRzIC0gYWRkaXRpb25hbCBpbnB1dHMgdG8gY292ZXIgZmVlLlxuICogQHBhcmFtIFttaW5pbWl6ZUlucHV0cz10cnVlXSAtIHRyeSB0byBmaW5kIGlucHV0IGNvbWJpbmF0aW9uIHdpdGggbWluaW1hbCBmZWVzLiBMaW1pdHMgc3VwcGxlbWVudGFyeVVuc3BlbnRzIHRvIDQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQc2J0Rm9yU2luZ2xlSW5zY3JpcHRpb25QYXNzaW5nVHJhbnNhY3Rpb24oXG4gIG5ldHdvcmtPckNvaW5OYW1lOiBDb2luTmFtZSB8IFV0eG9saWJOZXR3b3JrLFxuICBpbnB1dEJ1aWxkZXI6IFdhbGxldElucHV0QnVpbGRlcixcbiAgdW5zcGVudDogV2FsbGV0VW5zcGVudCB8IFdhbGxldFVuc3BlbnRbXSxcbiAgc2F0UG9pbnQ6IFNhdFBvaW50LFxuICBvdXRwdXRzOiBJbnNjcmlwdGlvblRyYW5zYWN0aW9uT3V0cHV0cyxcbiAgY29uc3RyYWludHM6IEluc2NyaXB0aW9uVHJhbnNhY3Rpb25Db25zdHJhaW50cyxcbiAge1xuICAgIHN1cHBsZW1lbnRhcnlVbnNwZW50cyA9IFtdLFxuICAgIG1pbmltaXplSW5wdXRzID0gdHJ1ZSxcbiAgfToge1xuICAgIHN1cHBsZW1lbnRhcnlVbnNwZW50cz86IFdhbGxldFVuc3BlbnRbXTtcbiAgICBtaW5pbWl6ZUlucHV0cz86IGJvb2xlYW47XG4gIH0gPSB7fVxuKTogZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0IHtcbiAgLy8gc3VwcG9ydCBmb3IgbGVnYWN5IGNhbGwgc3R5bGVcbiAgaWYgKEFycmF5LmlzQXJyYXkodW5zcGVudCkpIHtcbiAgICBpZiAodW5zcGVudC5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuIG9ubHkgcGFzcyBzaW5nbGUgdW5zcGVudGApO1xuICAgIH1cbiAgICB1bnNwZW50ID0gdW5zcGVudFswXTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGZpbmRPdXRwdXRMYXlvdXRGb3JXYWxsZXRVbnNwZW50cyhcbiAgICBbdW5zcGVudCwgLi4uc3VwcGxlbWVudGFyeVVuc3BlbnRzXSxcbiAgICBzYXRQb2ludCxcbiAgICBvdXRwdXRzLFxuICAgIGNvbnN0cmFpbnRzLFxuICAgIHsgbWluaW1pemVJbnB1dHMgfVxuICApO1xuXG4gIGlmICghcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yTm9MYXlvdXQoKTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQc2J0RnJvbU91dHB1dExheW91dChuZXR3b3JrT3JDb2luTmFtZSwgaW5wdXRCdWlsZGVyLCByZXN1bHQuaW5wdXRzLCBvdXRwdXRzLCByZXN1bHQubGF5b3V0KTtcbn1cbiJdfQ==