@rosen-bridge/watcher-data-extractor 5.0.0-ef7d76f → 5.1.0-ca8db39e

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 (40) hide show
  1. package/dist/actions/collateralAction.d.ts +70 -0
  2. package/dist/actions/collateralAction.d.ts.map +1 -0
  3. package/dist/actions/collateralAction.js +168 -0
  4. package/dist/entities/CollateralEntity.d.ts +15 -0
  5. package/dist/entities/CollateralEntity.d.ts.map +1 -0
  6. package/dist/entities/CollateralEntity.js +74 -0
  7. package/dist/extractor/EventTriggerExtractor.d.ts.map +1 -1
  8. package/dist/extractor/EventTriggerExtractor.js +5 -5
  9. package/dist/extractor/collateralExtractor.d.ts +69 -0
  10. package/dist/extractor/collateralExtractor.d.ts.map +1 -0
  11. package/dist/extractor/collateralExtractor.js +215 -0
  12. package/dist/extractor/commitmentExtractor.js +5 -5
  13. package/dist/extractor/permitExtractor.js +5 -5
  14. package/dist/index.d.ts +3 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +4 -2
  17. package/dist/interfaces/extractedCollateral.d.ts +12 -0
  18. package/dist/interfaces/extractedCollateral.d.ts.map +1 -0
  19. package/dist/interfaces/extractedCollateral.js +2 -0
  20. package/dist/migrations/index.d.ts +3 -3
  21. package/dist/migrations/index.d.ts.map +1 -1
  22. package/dist/migrations/index.js +6 -2
  23. package/dist/migrations/postgres/1706610773315-migration.d.ts.map +1 -1
  24. package/dist/migrations/postgres/1706610773315-migration.js +6 -2
  25. package/dist/migrations/postgres/1708189757400-migration.d.ts +7 -0
  26. package/dist/migrations/postgres/1708189757400-migration.d.ts.map +1 -0
  27. package/dist/migrations/postgres/1708189757400-migration.js +28 -0
  28. package/dist/migrations/sqlite/1706610773176-migration.d.ts +7 -0
  29. package/dist/migrations/sqlite/1706610773176-migration.d.ts.map +1 -0
  30. package/dist/migrations/sqlite/1706610773176-migration.js +421 -0
  31. package/dist/migrations/sqlite/1708175020320-migration.d.ts +7 -0
  32. package/dist/migrations/sqlite/1708175020320-migration.d.ts.map +1 -0
  33. package/dist/migrations/sqlite/1708175020320-migration.js +27 -0
  34. package/dist/transformers.d.ts +17 -0
  35. package/dist/transformers.d.ts.map +1 -0
  36. package/dist/transformers.js +21 -0
  37. package/dist/utils.d.ts +7 -0
  38. package/dist/utils.d.ts.map +1 -1
  39. package/dist/utils.js +10 -1
  40. package/package.json +2 -2
@@ -0,0 +1,70 @@
1
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
+ import { BlockEntity } from '@rosen-bridge/scanner';
3
+ import { DataSource, DeleteResult } from 'typeorm';
4
+ import CollateralEntity from '../entities/CollateralEntity';
5
+ import { ExtractedCollateral } from '../interfaces/extractedCollateral';
6
+ declare class CollateralAction {
7
+ private readonly dataSource;
8
+ readonly logger: AbstractLogger;
9
+ private readonly collateralRepository;
10
+ constructor(dataSource: DataSource, logger?: AbstractLogger);
11
+ /**
12
+ * saves (upserts) a collateral into the database
13
+ *
14
+ * @param {ExtractedCollateral} collateral
15
+ * @param {string} extractor
16
+ * @memberof CollateralAction
17
+ */
18
+ saveCollateral: (collateral: Partial<ExtractedCollateral> & Pick<ExtractedCollateral, 'boxId'>, extractor: string) => Promise<{
19
+ extractor: string;
20
+ boxId: string;
21
+ boxSerialized: string | undefined;
22
+ wId: string | undefined;
23
+ rwtCount: bigint | undefined;
24
+ txId: string | undefined;
25
+ block: string | undefined;
26
+ height: number | undefined;
27
+ spendBlock: string | undefined;
28
+ spendHeight: number | undefined;
29
+ id?: number | undefined;
30
+ } & CollateralEntity>;
31
+ /**
32
+ * stores list of collaterals
33
+ *
34
+ * @param {Array<ExtractedCollateral>} collaterals
35
+ * @param {BlockEntity} block
36
+ * @param {string} extractor
37
+ * @return {Promise<boolean>}
38
+ * @memberof CollateralAction
39
+ */
40
+ storeCollaterals: (collaterals: Array<ExtractedCollateral>, block: BlockEntity, extractor: string) => Promise<boolean>;
41
+ /**
42
+ * Update spendBlock and spendHeight of collaterals spent in the block
43
+ *
44
+ * @param {Array<string>} spentBoxIds
45
+ * @param {BlockEntity} block
46
+ * @param {string} extractor
47
+ * @return {Promise<void>}
48
+ * @memberof CollateralAction
49
+ */
50
+ spendCollaterals: (spentBoxIds: Array<string>, block: BlockEntity, extractor: string) => Promise<void>;
51
+ /**
52
+ * Returns all stored unspent collateral box IDs
53
+ *
54
+ * @param {string} extractor
55
+ * @return {Promise<Array<string>>}
56
+ * @memberof CollateralAction
57
+ */
58
+ getUnspentCollateralBoxIds: (extractor: string) => Promise<Array<string>>;
59
+ /**
60
+ * deletes the specified collateral box from database
61
+ *
62
+ * @param {string} boxId
63
+ * @param {string} extractor
64
+ * @return {Promise<DeleteResult>}
65
+ * @memberof CollateralAction
66
+ */
67
+ deleteCollateral: (boxId: string, extractor: string) => Promise<DeleteResult>;
68
+ }
69
+ export default CollateralAction;
70
+ //# sourceMappingURL=collateralAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collateralAction.d.ts","sourceRoot":"","sources":["../../lib/actions/collateralAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,YAAY,EAA0B,MAAM,SAAS,CAAC;AAE3E,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAGxE,cAAM,gBAAgB;IAIlB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,QAAQ,CAAC,MAAM,EAAE,cAAc;IAJjC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA+B;gBAGjD,UAAU,EAAE,UAAU,EAC9B,MAAM,GAAE,cAAkC;IAKrD;;;;;;OAMG;IACH,cAAc,eACA,QAAQ,mBAAmB,CAAC,GACtC,KAAK,mBAAmB,EAAE,OAAO,CAAC,aACzB,MAAM;;;;;;;;;;;;0BA6BjB;IAEF;;;;;;;;OAQG;IACH,gBAAgB,gBACD,MAAM,mBAAmB,CAAC,SAChC,WAAW,aACP,MAAM,KAChB,QAAQ,OAAO,CAAC,CAmEjB;IAEF;;;;;;;;OAQG;IACH,gBAAgB,gBACD,MAAM,MAAM,CAAC,SACnB,WAAW,aACP,MAAM,KAChB,QAAQ,IAAI,CAAC,CAoBd;IAEF;;;;;;OAMG;IACH,0BAA0B,cACb,MAAM,KAChB,QAAQ,MAAM,MAAM,CAAC,CAAC,CAWvB;IAEF;;;;;;;OAOG;IACH,gBAAgB,UACP,MAAM,aACF,MAAM,KAChB,QAAQ,YAAY,CAAC,CAKtB;CACH;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,168 @@
1
+ import { DummyLogger } from '@rosen-bridge/abstract-logger';
2
+ import { chunk } from 'lodash-es';
3
+ import { In, IsNull } from 'typeorm';
4
+ import { dbIdChunkSize } from '../constants';
5
+ import CollateralEntity from '../entities/CollateralEntity';
6
+ class CollateralAction {
7
+ dataSource;
8
+ logger;
9
+ collateralRepository;
10
+ constructor(dataSource, logger = new DummyLogger()) {
11
+ this.dataSource = dataSource;
12
+ this.logger = logger;
13
+ this.collateralRepository = this.dataSource.getRepository(CollateralEntity);
14
+ }
15
+ /**
16
+ * saves (upserts) a collateral into the database
17
+ *
18
+ * @param {ExtractedCollateral} collateral
19
+ * @param {string} extractor
20
+ * @memberof CollateralAction
21
+ */
22
+ saveCollateral = async (collateral, extractor) => {
23
+ const id = (await this.collateralRepository.findOne({
24
+ where: {
25
+ boxId: collateral.boxId,
26
+ extractor,
27
+ },
28
+ select: {
29
+ id: true,
30
+ },
31
+ }))?.id;
32
+ const collateralEntity = {
33
+ ...(id != undefined && { id }),
34
+ extractor,
35
+ boxId: collateral.boxId,
36
+ boxSerialized: collateral.boxSerialized,
37
+ wId: collateral.wId,
38
+ rwtCount: collateral.rwtCount,
39
+ txId: collateral.txId,
40
+ block: collateral.block,
41
+ height: collateral.height,
42
+ spendBlock: collateral.spendBlock,
43
+ spendHeight: collateral.spendHeight,
44
+ };
45
+ return await this.collateralRepository.save(collateralEntity);
46
+ };
47
+ /**
48
+ * stores list of collaterals
49
+ *
50
+ * @param {Array<ExtractedCollateral>} collaterals
51
+ * @param {BlockEntity} block
52
+ * @param {string} extractor
53
+ * @return {Promise<boolean>}
54
+ * @memberof CollateralAction
55
+ */
56
+ storeCollaterals = async (collaterals, block, extractor) => {
57
+ const collateralEntities = collaterals.map((col) => ({
58
+ extractor: extractor,
59
+ boxId: col.boxId,
60
+ boxSerialized: col.boxSerialized,
61
+ wId: col.wId,
62
+ rwtCount: col.rwtCount,
63
+ txId: col.txId,
64
+ block: block.hash,
65
+ height: col.height != undefined ? col.height : block.height,
66
+ }));
67
+ const queryRunner = this.dataSource.createQueryRunner();
68
+ await queryRunner.connect();
69
+ await queryRunner.startTransaction();
70
+ try {
71
+ const repository = await queryRunner.manager.getRepository(CollateralEntity);
72
+ const boxIdToId = new Map();
73
+ (await repository.find({
74
+ where: {
75
+ boxId: In(collateralEntities.map((box) => box.boxId)),
76
+ extractor: extractor,
77
+ },
78
+ select: {
79
+ id: true,
80
+ boxId: true,
81
+ },
82
+ })).forEach((col) => boxIdToId.set(col.boxId, col.id));
83
+ const collateralsToUpdate = collateralEntities
84
+ .filter((col) => boxIdToId.has(col.boxId))
85
+ .map((col) => ({ ...col, id: boxIdToId.get(col.boxId) }));
86
+ const collateralsToInsert = collateralEntities.filter((col) => !boxIdToId.has(col.boxId));
87
+ this.logger.info(`Saving boxes with following IDs into the database: [${collateralEntities
88
+ .map((col) => col.boxId)
89
+ .join(', ')}]`);
90
+ const savedCollaterals = await repository.save([
91
+ ...collateralsToInsert,
92
+ ...collateralsToUpdate,
93
+ ]);
94
+ await queryRunner.commitTransaction();
95
+ this.logger.debug(`Saved boxes with following IDs into the database: [${savedCollaterals
96
+ .map((col) => col.boxId)
97
+ .join(', ')}]`);
98
+ }
99
+ catch (e) {
100
+ await queryRunner.rollbackTransaction();
101
+ this.logger.error(`An error occurred during storeCollaterals action: ${e}`);
102
+ return false;
103
+ }
104
+ finally {
105
+ await queryRunner.release();
106
+ }
107
+ return true;
108
+ };
109
+ /**
110
+ * Update spendBlock and spendHeight of collaterals spent in the block
111
+ *
112
+ * @param {Array<string>} spentBoxIds
113
+ * @param {BlockEntity} block
114
+ * @param {string} extractor
115
+ * @return {Promise<void>}
116
+ * @memberof CollateralAction
117
+ */
118
+ spendCollaterals = async (spentBoxIds, block, extractor) => {
119
+ const spentBoxIdChunks = chunk(spentBoxIds, dbIdChunkSize);
120
+ for (const spendIdChunk of spentBoxIdChunks) {
121
+ const updateResult = await this.collateralRepository.update({ boxId: In(spendIdChunk), extractor: extractor }, { spendBlock: block.hash, spendHeight: block.height });
122
+ if (updateResult.affected && updateResult.affected > 0) {
123
+ const updatedRows = await this.collateralRepository.findBy({
124
+ boxId: In(spendIdChunk),
125
+ spendBlock: block.hash,
126
+ });
127
+ for (const row of updatedRows) {
128
+ this.logger.debug(`Spent collateral with boxId [${row.boxId}] belonging to watcher with WID [${row.wId}] at height ${block.height}`);
129
+ }
130
+ }
131
+ }
132
+ };
133
+ /**
134
+ * Returns all stored unspent collateral box IDs
135
+ *
136
+ * @param {string} extractor
137
+ * @return {Promise<Array<string>>}
138
+ * @memberof CollateralAction
139
+ */
140
+ getUnspentCollateralBoxIds = async (extractor) => {
141
+ const boxIds = await this.collateralRepository.find({
142
+ where: {
143
+ extractor: extractor,
144
+ spendBlock: IsNull(),
145
+ },
146
+ select: {
147
+ boxId: true,
148
+ },
149
+ });
150
+ return boxIds.map((box) => box.boxId);
151
+ };
152
+ /**
153
+ * deletes the specified collateral box from database
154
+ *
155
+ * @param {string} boxId
156
+ * @param {string} extractor
157
+ * @return {Promise<DeleteResult>}
158
+ * @memberof CollateralAction
159
+ */
160
+ deleteCollateral = async (boxId, extractor) => {
161
+ return await this.collateralRepository.delete({
162
+ boxId: boxId,
163
+ extractor: extractor,
164
+ });
165
+ };
166
+ }
167
+ export default CollateralAction;
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGF0ZXJhbEFjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hY3Rpb25zL2NvbGxhdGVyYWxBY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBNEIsRUFBRSxFQUFFLE1BQU0sRUFBYyxNQUFNLFNBQVMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sZ0JBQWdCLE1BQU0sOEJBQThCLENBQUM7QUFJNUQsTUFBTSxnQkFBZ0I7SUFJRDtJQUNSO0lBSk0sb0JBQW9CLENBQStCO0lBRXBFLFlBQ21CLFVBQXNCLEVBQzlCLFNBQXlCLElBQUksV0FBVyxFQUFFO1FBRGxDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBb0M7UUFFbkQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGNBQWMsR0FBRyxLQUFLLEVBQ3BCLFVBQ29DLEVBQ3BDLFNBQWlCLEVBQ2pCLEVBQUU7UUFDRixNQUFNLEVBQUUsR0FBRyxDQUNULE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQztZQUN0QyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO2dCQUN2QixTQUFTO2FBQ1Y7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLElBQUk7YUFDVDtTQUNGLENBQUMsQ0FDSCxFQUFFLEVBQUUsQ0FBQztRQUVOLE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsR0FBRyxDQUFDLEVBQUUsSUFBSSxTQUFTLElBQUks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LENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7T0FPRztJQUNILGdCQUFnQixHQUFHLEtBQUssRUFDdEIsS0FBYSxFQUNiLFNBQWlCLEVBQ00sRUFBRTtRQUN6QixPQUFPLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztZQUM1QyxLQUFLLEVBQUUsS0FBSztZQUNaLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztDQUNIO0FBRUQsZUFBZSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IEJsb2NrRW50aXR5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyJztcbmltcG9ydCB7IGNodW5rIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IERhdGFTb3VyY2UsIERlbGV0ZVJlc3VsdCwgSW4sIElzTnVsbCwgUmVwb3NpdG9yeSB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgZGJJZENodW5rU2l6ZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgQ29sbGF0ZXJhbEVudGl0eSBmcm9tICcuLi9lbnRpdGllcy9Db2xsYXRlcmFsRW50aXR5JztcbmltcG9ydCB7IEV4dHJhY3RlZENvbGxhdGVyYWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4dHJhY3RlZENvbGxhdGVyYWwnO1xuaW1wb3J0IHsgSnNvbkJJIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jbGFzcyBDb2xsYXRlcmFsQWN0aW9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXRlcmFsUmVwb3NpdG9yeTogUmVwb3NpdG9yeTxDb2xsYXRlcmFsRW50aXR5PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlciA9IG5ldyBEdW1teUxvZ2dlcigpXG4gICkge1xuICAgIHRoaXMuY29sbGF0ZXJhbFJlcG9zaXRvcnkgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShDb2xsYXRlcmFsRW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzYXZlcyAodXBzZXJ0cykgYSBjb2xsYXRlcmFsIGludG8gdGhlIGRhdGFiYXNlXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0cmFjdGVkQ29sbGF0ZXJhbH0gY29sbGF0ZXJhbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0cmFjdG9yXG4gICAqIEBtZW1iZXJvZiBDb2xsYXRlcmFsQWN0aW9uXG4gICAqL1xuICBzYXZlQ29sbGF0ZXJhbCA9IGFzeW5jIChcbiAgICBjb2xsYXRlcmFsOiBQYXJ0aWFsPEV4dHJhY3RlZENvbGxhdGVyYWw+ICZcbiAgICAgIFBpY2s8RXh0cmFjdGVkQ29sbGF0ZXJhbCwgJ2JveElkJz4sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmdcbiAgKSA9PiB7XG4gICAgY29uc3QgaWQgPSAoXG4gICAgICBhd2FpdCB0aGlzLmNvbGxhdGVyYWxSZXBvc2l0b3J5LmZpbmRPbmUoe1xuICAgICAgICB3aGVyZToge1xuICAgICAgICAgIGJveElkOiBjb2xsYXRlcmFsLmJveElkLFxuICAgICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0OiB7XG4gICAgICAgICAgaWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk/LmlkO1xuXG4gICAgY29uc3QgY29sbGF0ZXJhbEVudGl0eSA9IHtcbiAgICAgIC4uLihpZCAhPSB1bmRlZmluZWQgJiYgeyBpZCB9KSxcbiAgICAgIGV4dHJhY3RvcixcbiAgICAgIGJveElkOiBjb2xsYXRlcmFsLmJveElkLFxuICAgICAgYm94U2VyaWFsaXplZDogY29sbGF0ZXJhbC5ib3hTZXJpYWxpemVkLFxuICAgICAgd0lkOiBjb2xsYXRlcmFsLndJZCxcbiAgICAgIHJ3dENvdW50OiBjb2xsYXRlcmFsLnJ3dENvdW50LFxuICAgICAgdHhJZDogY29sbGF0ZXJhbC50eElkLFxuICAgICAgYmxvY2s6IGNvbGxhdGVyYWwuYmxvY2ssXG4gICAgICBoZWlnaHQ6IGNvbGxhdGVyYWwuaGVpZ2h0LFxuICAgICAgc3BlbmRCbG9jazogY29sbGF0ZXJhbC5zcGVuZEJsb2NrLFxuICAgICAgc3BlbmRIZWlnaHQ6IGNvbGxhdGVyYWwuc3BlbmRIZWlnaHQsXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbGxhdGVyYWxSZXBvc2l0b3J5LnNhdmUoY29sbGF0ZXJhbEVudGl0eSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHN0b3JlcyBsaXN0IG9mIGNvbGxhdGVyYWxzXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8RXh0cmFjdGVkQ29sbGF0ZXJhbD59IGNvbGxhdGVyYWxzXG4gICAqIEBwYXJhbSB7QmxvY2tFbnRpdHl9IGJsb2NrXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHRyYWN0b3JcbiAgICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn1cbiAgICogQG1lbWJlcm9mIENvbGxhdGVyYWxBY3Rpb25cbiAgICovXG4gIHN0b3JlQ29sbGF0ZXJhbHMgPSBhc3luYyAoXG4gICAgY29sbGF0ZXJhbHM6IEFycmF5PEV4dHJhY3RlZENvbGxhdGVyYWw+LFxuICAgIGJsb2NrOiBCbG9ja0VudGl0eSxcbiAgICBleHRyYWN0b3I6IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBjb2xsYXRlcmFsRW50aXRpZXMgPSBjb2xsYXRlcmFscy5tYXAoKGNvbCkgPT4gKHtcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgYm94SWQ6IGNvbC5ib3hJZCxcbiAgICAgIGJveFNlcmlhbGl6ZWQ6IGNvbC5ib3hTZXJpYWxpemVkLFxuICAgICAgd0lkOiBjb2wud0lkLFxuICAgICAgcnd0Q291bnQ6IGNvbC5yd3RDb3VudCxcbiAgICAgIHR4SWQ6IGNvbC50eElkLFxuICAgICAgYmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICBoZWlnaHQ6IGNvbC5oZWlnaHQgIT0gdW5kZWZpbmVkID8gY29sLmhlaWdodCA6IGJsb2NrLmhlaWdodCxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMuZGF0YVNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLmdldFJlcG9zaXRvcnkoXG4gICAgICAgIENvbGxhdGVyYWxFbnRpdHlcbiAgICAgICk7XG4gICAgICBjb25zdCBib3hJZFRvSWQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgKFxuICAgICAgICBhd2FpdCByZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgICBib3hJZDogSW4oY29sbGF0ZXJhbEVudGl0aWVzLm1hcCgoYm94KSA9PiBib3guYm94SWQpKSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VsZWN0OiB7XG4gICAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICAgIGJveElkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLmZvckVhY2goKGNvbCkgPT4gYm94SWRUb0lkLnNldChjb2wuYm94SWQsIGNvbC5pZCkpO1xuXG4gICAgICBjb25zdCBjb2xsYXRlcmFsc1RvVXBkYXRlID0gY29sbGF0ZXJhbEVudGl0aWVzXG4gICAgICAgIC5maWx0ZXIoKGNvbCkgPT4gYm94SWRUb0lkLmhhcyhjb2wuYm94SWQpKVxuICAgICAgICAubWFwKChjb2wpID0+ICh7IC4uLmNvbCwgaWQ6IGJveElkVG9JZC5nZXQoY29sLmJveElkKSB9KSk7XG5cbiAgICAgIGNvbnN0IGNvbGxhdGVyYWxzVG9JbnNlcnQgPSBjb2xsYXRlcmFsRW50aXRpZXMuZmlsdGVyKFxuICAgICAgICAoY29sKSA9PiAhYm94SWRUb0lkLmhhcyhjb2wuYm94SWQpXG4gICAgICApO1xuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgU2F2aW5nIGJveGVzIHdpdGggZm9sbG93aW5nIElEcyBpbnRvIHRoZSBkYXRhYmFzZTogWyR7Y29sbGF0ZXJhbEVudGl0aWVzXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiBjb2wuYm94SWQpXG4gICAgICAgICAgLmpvaW4oJywgJyl9XWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzYXZlZENvbGxhdGVyYWxzID0gYXdhaXQgcmVwb3NpdG9yeS5zYXZlKFtcbiAgICAgICAgLi4uY29sbGF0ZXJhbHNUb0luc2VydCxcbiAgICAgICAgLi4uY29sbGF0ZXJhbHNUb1VwZGF0ZSxcbiAgICAgIF0pO1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgU2F2ZWQgYm94ZXMgd2l0aCBmb2xsb3dpbmcgSURzIGludG8gdGhlIGRhdGFiYXNlOiBbJHtzYXZlZENvbGxhdGVyYWxzXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiBjb2wuYm94SWQpXG4gICAgICAgICAgLmpvaW4oJywgJyl9XWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgc3RvcmVDb2xsYXRlcmFscyBhY3Rpb246ICR7ZX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzcGVuZEJsb2NrIGFuZCBzcGVuZEhlaWdodCBvZiBjb2xsYXRlcmFscyBzcGVudCBpbiB0aGUgYmxvY2tcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzcGVudEJveElkc1xuICAgKiBAcGFyYW0ge0Jsb2NrRW50aXR5fSBibG9ja1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0cmFjdG9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJvZiBDb2xsYXRlcmFsQWN0aW9uXG4gICAqL1xuICBzcGVuZENvbGxhdGVyYWxzID0gYXN5bmMgKFxuICAgIHNwZW50Qm94SWRzOiBBcnJheTxzdHJpbmc+LFxuICAgIGJsb2NrOiBCbG9ja0VudGl0eSxcbiAgICBleHRyYWN0b3I6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBzcGVudEJveElkQ2h1bmtzID0gY2h1bmsoc3BlbnRCb3hJZHMsIGRiSWRDaHVua1NpemUpO1xuICAgIGZvciAoY29uc3Qgc3BlbmRJZENodW5rIG9mIHNwZW50Qm94SWRDaHVua3MpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZVJlc3VsdCA9IGF3YWl0IHRoaXMuY29sbGF0ZXJhbFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgICB7IGJveElkOiBJbihzcGVuZElkQ2h1bmspLCBleHRyYWN0b3I6IGV4dHJhY3RvciB9LFxuICAgICAgICB7IHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsIHNwZW5kSGVpZ2h0OiBibG9jay5oZWlnaHQgfVxuICAgICAgKTtcblxuICAgICAgaWYgKHVwZGF0ZVJlc3VsdC5hZmZlY3RlZCAmJiB1cGRhdGVSZXN1bHQuYWZmZWN0ZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRSb3dzID0gYXdhaXQgdGhpcy5jb2xsYXRlcmFsUmVwb3NpdG9yeS5maW5kQnkoe1xuICAgICAgICAgIGJveElkOiBJbihzcGVuZElkQ2h1bmspLFxuICAgICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB1cGRhdGVkUm93cykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNwZW50IGNvbGxhdGVyYWwgd2l0aCBib3hJZCBbJHtyb3cuYm94SWR9XSBiZWxvbmdpbmcgdG8gd2F0Y2hlciB3aXRoIFdJRCBbJHtyb3cud0lkfV0gYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBzdG9yZWQgdW5zcGVudCBjb2xsYXRlcmFsIGJveCBJRHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dHJhY3RvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PHN0cmluZz4+fVxuICAgKiBAbWVtYmVyb2YgQ29sbGF0ZXJhbEFjdGlvblxuICAgKi9cbiAgZ2V0VW5zcGVudENvbGxhdGVyYWxCb3hJZHMgPSBhc3luYyAoXG4gICAgZXh0cmFjdG9yOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiA9PiB7XG4gICAgY29uc3QgYm94SWRzID0gYXdhaXQgdGhpcy5jb2xsYXRlcmFsUmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICBzcGVuZEJsb2NrOiBJc051bGwoKSxcbiAgICAgIH0sXG4gICAgICBzZWxlY3Q6IHtcbiAgICAgICAgYm94SWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBib3hJZHMubWFwKChib3gpID0+IGJveC5ib3hJZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGRlbGV0ZXMgdGhlIHNwZWNpZmllZCBjb2xsYXRlcmFsIGJveCBmcm9tIGRhdGFiYXNlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBib3hJZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0cmFjdG9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RGVsZXRlUmVzdWx0Pn1cbiAgICogQG1lbWJlcm9mIENvbGxhdGVyYWxBY3Rpb25cbiAgICovXG4gIGRlbGV0ZUNvbGxhdGVyYWwgPSBhc3luYyAoXG4gICAgYm94SWQ6IHN0cmluZyxcbiAgICBleHRyYWN0b3I6IHN0cmluZ1xuICApOiBQcm9taXNlPERlbGV0ZVJlc3VsdD4gPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbGxhdGVyYWxSZXBvc2l0b3J5LmRlbGV0ZSh7XG4gICAgICBib3hJZDogYm94SWQsXG4gICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sbGF0ZXJhbEFjdGlvbjtcbiJdfQ==
@@ -0,0 +1,15 @@
1
+ declare class CollateralEntity {
2
+ id: number;
3
+ extractor: string;
4
+ boxId: string;
5
+ boxSerialized: string;
6
+ wId: string;
7
+ rwtCount: bigint;
8
+ txId: string;
9
+ block?: string;
10
+ height?: number;
11
+ spendBlock?: string;
12
+ spendHeight?: number;
13
+ }
14
+ export default CollateralEntity;
15
+ //# sourceMappingURL=CollateralEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollateralEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/CollateralEntity.ts"],"names":[],"mappings":"AAGA,cAEM,gBAAgB;IAEpB,EAAE,EAAE,MAAM,CAAC;IAGX,SAAS,EAAE,MAAM,CAAC;IAGlB,KAAK,EAAE,MAAM,CAAC;IAGd,aAAa,EAAE,MAAM,CAAC;IAGtB,GAAG,EAAE,MAAM,CAAC;IAGZ,QAAQ,EAAE,MAAM,CAAC;IAGjB,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,74 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Column, Entity, PrimaryGeneratedColumn, Unique } from 'typeorm';
11
+ import { bigintTransformer } from '../transformers';
12
+ let CollateralEntity = class CollateralEntity {
13
+ id;
14
+ extractor;
15
+ boxId;
16
+ boxSerialized;
17
+ wId;
18
+ rwtCount;
19
+ txId;
20
+ block;
21
+ height;
22
+ spendBlock;
23
+ spendHeight;
24
+ };
25
+ __decorate([
26
+ PrimaryGeneratedColumn(),
27
+ __metadata("design:type", Number)
28
+ ], CollateralEntity.prototype, "id", void 0);
29
+ __decorate([
30
+ Column(),
31
+ __metadata("design:type", String)
32
+ ], CollateralEntity.prototype, "extractor", void 0);
33
+ __decorate([
34
+ Column(),
35
+ __metadata("design:type", String)
36
+ ], CollateralEntity.prototype, "boxId", void 0);
37
+ __decorate([
38
+ Column(),
39
+ __metadata("design:type", String)
40
+ ], CollateralEntity.prototype, "boxSerialized", void 0);
41
+ __decorate([
42
+ Column(),
43
+ __metadata("design:type", String)
44
+ ], CollateralEntity.prototype, "wId", void 0);
45
+ __decorate([
46
+ Column({ type: 'bigint', transformer: bigintTransformer }),
47
+ __metadata("design:type", BigInt)
48
+ ], CollateralEntity.prototype, "rwtCount", void 0);
49
+ __decorate([
50
+ Column(),
51
+ __metadata("design:type", String)
52
+ ], CollateralEntity.prototype, "txId", void 0);
53
+ __decorate([
54
+ Column({ nullable: true }),
55
+ __metadata("design:type", String)
56
+ ], CollateralEntity.prototype, "block", void 0);
57
+ __decorate([
58
+ Column({ nullable: true }),
59
+ __metadata("design:type", Number)
60
+ ], CollateralEntity.prototype, "height", void 0);
61
+ __decorate([
62
+ Column({ nullable: true, type: 'text' }),
63
+ __metadata("design:type", String)
64
+ ], CollateralEntity.prototype, "spendBlock", void 0);
65
+ __decorate([
66
+ Column({ nullable: true }),
67
+ __metadata("design:type", Number)
68
+ ], CollateralEntity.prototype, "spendHeight", void 0);
69
+ CollateralEntity = __decorate([
70
+ Entity('collateral_entity'),
71
+ Unique(['boxId', 'extractor'])
72
+ ], CollateralEntity);
73
+ export default CollateralEntity;
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGF0ZXJhbEVudGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9lbnRpdGllcy9Db2xsYXRlcmFsRW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUlwRCxJQUFNLGdCQUFnQixHQUF0QixNQUFNLGdCQUFnQjtJQUVwQixFQUFFLENBQVM7SUFHWCxTQUFTLENBQVM7SUFHbEIsS0FBSyxDQUFTO0lBR2QsYUFBYSxDQUFTO0lBR3RCLEdBQUcsQ0FBUztJQUdaLFFBQVEsQ0FBUztJQUdqQixJQUFJLENBQVM7SUFHYixLQUFLLENBQVU7SUFHZixNQUFNLENBQVU7SUFHaEIsVUFBVSxDQUFVO0lBR3BCLFdBQVcsQ0FBVTtDQUN0QixDQUFBO0FBaENDO0lBQUMsc0JBQXNCLEVBQUU7OzRDQUNkO0FBRVg7SUFBQyxNQUFNLEVBQUU7O21EQUNTO0FBRWxCO0lBQUMsTUFBTSxFQUFFOzsrQ0FDSztBQUVkO0lBQUMsTUFBTSxFQUFFOzt1REFDYTtBQUV0QjtJQUFDLE1BQU0sRUFBRTs7NkNBQ0c7QUFFWjtJQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLENBQUM7O2tEQUMxQztBQUVqQjtJQUFDLE1BQU0sRUFBRTs7OENBQ0k7QUFFYjtJQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7K0NBQ1o7QUFFZjtJQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Z0RBQ1g7QUFFaEI7SUFBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7b0RBQ3JCO0FBRXBCO0lBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztxREFDTjtBQWhDakIsZ0JBQWdCO0lBRnJCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztJQUMzQixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7R0FDekIsZ0JBQWdCLENBaUNyQjtBQUVELGVBQWUsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2x1bW4sIEVudGl0eSwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbiwgVW5pcXVlIH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBiaWdpbnRUcmFuc2Zvcm1lciB9IGZyb20gJy4uL3RyYW5zZm9ybWVycyc7XG5cbkBFbnRpdHkoJ2NvbGxhdGVyYWxfZW50aXR5JylcbkBVbmlxdWUoWydib3hJZCcsICdleHRyYWN0b3InXSlcbmNsYXNzIENvbGxhdGVyYWxFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkOiBudW1iZXI7XG5cbiAgQENvbHVtbigpXG4gIGV4dHJhY3Rvcjogc3RyaW5nO1xuXG4gIEBDb2x1bW4oKVxuICBib3hJZDogc3RyaW5nO1xuXG4gIEBDb2x1bW4oKVxuICBib3hTZXJpYWxpemVkOiBzdHJpbmc7XG5cbiAgQENvbHVtbigpXG4gIHdJZDogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAnYmlnaW50JywgdHJhbnNmb3JtZXI6IGJpZ2ludFRyYW5zZm9ybWVyIH0pXG4gIHJ3dENvdW50OiBiaWdpbnQ7XG5cbiAgQENvbHVtbigpXG4gIHR4SWQ6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbnVsbGFibGU6IHRydWUgfSlcbiAgYmxvY2s/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG51bGxhYmxlOiB0cnVlIH0pXG4gIGhlaWdodD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbnVsbGFibGU6IHRydWUsIHR5cGU6ICd0ZXh0JyB9KVxuICBzcGVuZEJsb2NrPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBudWxsYWJsZTogdHJ1ZSB9KVxuICBzcGVuZEhlaWdodD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sbGF0ZXJhbEVudGl0eTtcbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"EventTriggerExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractor/EventTriggerExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAK5E,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,cAAM,qBAAsB,SAAQ,iBAAiB,CAAC,WAAW,CAAC;IAChE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAG3B,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,cAAc;IAmBzB,KAAK,eAAiB;IAEtB;;;;;OAKG;IACH,mBAAmB,QACZ,MAAM,WAAW,CAAC,SAChB,WAAW,KACjB,QAAQ,OAAO,CAAC,CAuIjB;IAEF,SAAS,SAAgB,MAAM,mBAE7B;IAEF;;;OAGG;IACH,eAAe,sBAEb;IAEF;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,gBAAiB,WAAW;;;MAsCtD;CACH;AAED,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"EventTriggerExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractor/EventTriggerExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAK5E,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,cAAM,qBAAsB,SAAQ,iBAAiB,CAAC,WAAW,CAAC;IAChE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAG3B,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,cAAc;IAmBzB,KAAK,eAAiB;IAEtB;;;;;OAKG;IACH,mBAAmB,QACZ,MAAM,WAAW,CAAC,SAChB,WAAW,KACjB,QAAQ,OAAO,CAAC,CAsIjB;IAEF,SAAS,SAAgB,MAAM,mBAE7B;IAEF;;;OAGG;IACH,eAAe,sBAEb;IAEF;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,gBAAiB,WAAW;;;MAsCtD;CACH;AAED,eAAe,qBAAqB,CAAC"}
@@ -62,11 +62,11 @@ class EventTriggerExtractor extends AbstractExtractor {
62
62
  const R5Const = outputParsed.register_value(wasm.NonMandatoryRegisterId.R5);
63
63
  const R7Const = outputParsed.register_value(wasm.NonMandatoryRegisterId.R7);
64
64
  if (R4Const && R5Const && R7Const) {
65
- const R4Serialized = R4Const.to_coll_coll_byte();
65
+ const R4Serialized = R4Const.to_byte_array();
66
66
  const R5Serialized = R5Const.to_coll_coll_byte();
67
67
  if (R4Serialized.length >= 1 && R5Serialized.length >= 12) {
68
68
  const WIDsCount = R7Const.to_i32();
69
- const WIDsHash = Buffer.from(R4Serialized[0]).toString('hex');
69
+ const WIDsHash = Buffer.from(R4Serialized).toString('hex');
70
70
  const sourceTxId = Buffer.from(R5Serialized[0]).toString();
71
71
  const eventId = Buffer.from(blake2b(sourceTxId, undefined, 32)).toString('hex');
72
72
  boxes.push({
@@ -160,9 +160,9 @@ class EventTriggerExtractor extends AbstractExtractor {
160
160
  try {
161
161
  const R4Serialized = outputParsed
162
162
  .register_value(wasm.NonMandatoryRegisterId.R4)
163
- ?.to_coll_coll_byte();
163
+ ?.to_byte_array();
164
164
  if (R4Serialized !== undefined && R4Serialized.length > 0) {
165
- const txId = Buffer.from(R4Serialized[0]).toString('hex');
165
+ const txId = Buffer.from(R4Serialized).toString('hex');
166
166
  paymentTxId = txId;
167
167
  if (txId !== '')
168
168
  paymentTxId = txId;
@@ -186,4 +186,4 @@ class EventTriggerExtractor extends AbstractExtractor {
186
186
  };
187
187
  }
188
188
  export default EventTriggerExtractor;
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRUcmlnZ2VyRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2V4dHJhY3Rvci9FdmVudFRyaWdnZXJFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFDTCxpQkFBaUIsR0FHbEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQWtCLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTVFLE9BQU8sa0JBQWtCLE1BQU0sK0JBQStCLENBQUM7QUFFL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXZDLE1BQU0scUJBQXNCLFNBQVEsaUJBQThCO0lBQ3ZELE1BQU0sQ0FBaUI7SUFDaEMsRUFBRSxDQUFTO0lBQ00sVUFBVSxDQUFhO0lBQ3ZCLE9BQU8sQ0FBcUI7SUFDNUIsb0JBQW9CLENBQVM7SUFDN0IsY0FBYyxDQUFTO0lBQ3ZCLGFBQWEsQ0FBUztJQUN0QixHQUFHLENBQVM7SUFFN0IsWUFDRSxFQUFVLEVBQ1YsVUFBc0IsRUFDdEIsT0FBZSxFQUNmLEdBQVcsRUFDWCxhQUFxQixFQUNyQixZQUFvQixFQUNwQixNQUF1QjtRQUV2QixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQzthQUMxRCxZQUFZLEVBQUU7YUFDZCxlQUFlLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQzthQUMxRCxZQUFZLEVBQUU7YUFDZCxlQUFlLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQzthQUN4RCxZQUFZLEVBQUU7YUFDZCxlQUFlLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBRXRCOzs7OztPQUtHO0lBQ0gsbUJBQW1CLEdBQUcsQ0FDcEIsR0FBdUIsRUFDdkIsS0FBa0IsRUFDQSxFQUFFO1FBQ3BCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSTtnQkFDRixNQUFNLEtBQUssR0FBaUMsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLFVBQVUsR0FLWCxFQUFFLENBQUM7Z0JBQ1IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO29CQUMxQix1QkFBdUI7b0JBQ3ZCLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNyRSxLQUFLLE1BQU0sTUFBTSxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUU7d0JBQ3hDLElBQUk7NEJBQ0YsSUFDRSxNQUFNLENBQUMsbUJBQW1CO2dDQUMxQixNQUFNLENBQUMsTUFBTTtnQ0FDYixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dDQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsR0FBRztnQ0FDckMsTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsb0JBQW9CLEVBQzdDO2dDQUNBLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7Z0NBQ3pDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7Z0NBQ3pDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7Z0NBQ3pDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0NBQ2xCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN6QyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUN6QixDQUFDO29DQUNGLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQ3pDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQy9CLENBQUM7b0NBQ0YsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FDekMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FDL0IsQ0FBQztvQ0FDRixNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsY0FBYyxDQUN6QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUMvQixDQUFDO29DQUNGLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPLEVBQUU7d0NBQ2pDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dDQUNqRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3Q0FDakQsSUFBSSxZQUFZLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRTs0Q0FDekQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDOzRDQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FDcEQsS0FBSyxDQUNOLENBQUM7NENBQ0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDNUIsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUNoQixDQUFDLFFBQVEsRUFBRSxDQUFDOzRDQUNiLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUNuQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzs0Q0FDbEIsS0FBSyxDQUFDLElBQUksQ0FBQztnREFDVCxPQUFPLEVBQUUsT0FBTztnREFDaEIsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2dEQUNwQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0RBQ25CLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUN4QixZQUFZLENBQUMscUJBQXFCLEVBQUUsQ0FDckMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO2dEQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Z0RBQ2hELFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtnREFDbEQsVUFBVSxFQUFFLE1BQU0sQ0FDaEIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUNwRCxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0RBQ2QsU0FBUyxFQUFFLE1BQU0sQ0FDZixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ3BELENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnREFDZCxNQUFNLEVBQUUsTUFBTSxDQUNaLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDcEQsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dEQUNkLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQzdCLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FDaEIsQ0FBQyxRQUFRLEVBQUU7Z0RBQ1osa0JBQWtCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FDN0IsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUNoQixDQUFDLFFBQVEsRUFBRTtnREFDWixVQUFVLEVBQUUsVUFBVTtnREFDdEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO2dEQUNsRCxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Z0RBQ3BELGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtnREFDdkQsU0FBUyxFQUFFLFNBQVM7Z0RBQ3BCLFFBQVEsRUFBRSxRQUFRO2dEQUNsQixpQkFBaUIsRUFBRSxNQUFNLENBQ3ZCLE1BQU0sQ0FDSixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ3JELENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUNmOzZDQUNGLENBQUMsQ0FBQzt5Q0FDSjtxQ0FDRjtpQ0FDRjs2QkFDRjt5QkFDRjt3QkFBQyxNQUFNOzRCQUNOLFNBQVM7eUJBQ1Y7cUJBQ0Y7b0JBQ0QsaUJBQWlCO29CQUNqQixVQUFVLENBQUMsSUFBSSxDQUFDO3dCQUNkLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRTt3QkFDcEIsVUFBVSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO3dCQUN0RCxNQUFNLEVBQUUsTUFBTTt3QkFDZCxXQUFXLEVBQUUsV0FBVztxQkFDekIsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxPQUFPO3FCQUNULGtCQUFrQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3FCQUM5QyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNULFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTt3QkFDOUIsSUFBSSxDQUFDLE9BQU87NkJBQ1Qsa0JBQWtCLENBQ2pCLFFBQVEsQ0FBQyxVQUFVLEVBQ25CLEtBQUssRUFDTCxJQUFJLENBQUMsRUFBRSxFQUNQLFFBQVEsQ0FBQyxJQUFJLEVBQ2IsUUFBUSxDQUFDLE1BQU0sRUFDZixRQUFRLENBQUMsV0FBVyxDQUNyQjs2QkFDQSxJQUFJLENBQUMsR0FBRyxFQUFFOzRCQUNULE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDaEIsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDO3FCQUNELEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLHlDQUF5QyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQ3ZELENBQUM7b0JBQ0YsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNaLENBQUMsQ0FBQyxDQUFDO2FBQ047WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixTQUFTLEtBQUssNkNBQTZDLENBQUMsRUFBRSxDQUMvRCxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNYO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixTQUFTLEdBQUcsS0FBSyxFQUFFLElBQVksRUFBRSxFQUFFO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILGVBQWUsR0FBRyxLQUFLLElBQUksRUFBRTtRQUMzQixPQUFPO0lBQ1QsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDTyxrQkFBa0IsR0FBRyxDQUFDLFdBQXdCLEVBQUUsRUFBRTtRQUMxRCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQ2pDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxhQUFhO1lBQ3hELE1BQU0sR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO2FBQ3hCLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNoRSxNQUFNLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztZQUNoQywyQ0FBMkM7WUFDM0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFO2dCQUNyQywrQkFBK0I7Z0JBQy9CLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsY0FBYztvQkFBRSxTQUFTO2dCQUNuRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLElBQUk7b0JBQ0YsTUFBTSxZQUFZLEdBQUcsWUFBWTt5QkFDOUIsY0FBYyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7d0JBQy9DLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN6RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDMUQsV0FBVyxHQUFHLElBQUksQ0FBQzt3QkFDbkIsSUFBSSxJQUFJLEtBQUssRUFBRTs0QkFBRSxXQUFXLEdBQUcsSUFBSSxDQUFDOzZCQUMvQjs0QkFDSCxXQUFXLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQzs0QkFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2Ysa0NBQWtDLFdBQVcsQ0FBQyxFQUFFLDhDQUE4QyxDQUMvRixDQUFDO3lCQUNIO3dCQUNELDBEQUEwRDt3QkFDMUQsTUFBTTtxQkFDUDtpQkFDRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDVixTQUFTO2lCQUNWO2FBQ0Y7U0FDRjtRQUNELE9BQU87WUFDTCxNQUFNO1lBQ04sV0FBVztTQUNaLENBQUM7SUFDSixDQUFDLENBQUM7Q0FDSDtBQUVELGVBQWUscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgKiBhcyB3YXNtIGZyb20gJ2VyZ28tbGliLXdhc20tbm9kZWpzJztcbmltcG9ydCB7IGJsYWtlMmIgfSBmcm9tICdibGFrZWpzJztcbmltcG9ydCB7XG4gIEFic3RyYWN0RXh0cmFjdG9yLFxuICBCbG9ja0VudGl0eSxcbiAgVHJhbnNhY3Rpb24sXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lcic7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciwgRHVtbXlMb2dnZXIgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWxvZ2dlcic7XG5cbmltcG9ydCBFdmVudFRyaWdnZXJBY3Rpb24gZnJvbSAnLi4vYWN0aW9ucy9FdmVudFRyaWdnZXJBY3Rpb24nO1xuaW1wb3J0IHsgRXh0cmFjdGVkRXZlbnRUcmlnZ2VyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRyYWN0ZWRFdmVudFRyaWdnZXInO1xuaW1wb3J0IHsgSnNvbkJJIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRSZXN1bHQgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNsYXNzIEV2ZW50VHJpZ2dlckV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0RXh0cmFjdG9yPFRyYW5zYWN0aW9uPiB7XG4gIHJlYWRvbmx5IGxvZ2dlcjogQWJzdHJhY3RMb2dnZXI7XG4gIGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25zOiBFdmVudFRyaWdnZXJBY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRUcmlnZ2VyRXJnb1RyZWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXRFcmdvVHJlZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGZyYXVkRXJnb1RyZWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBSV1Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpZDogc3RyaW5nLFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIFJXVDogc3RyaW5nLFxuICAgIHBlcm1pdEFkZHJlc3M6IHN0cmluZyxcbiAgICBmcmF1ZEFkZHJlc3M6IHN0cmluZyxcbiAgICBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlclxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xuICAgIHRoaXMuZXZlbnRUcmlnZ2VyRXJnb1RyZWUgPSB3YXNtLkFkZHJlc3MuZnJvbV9iYXNlNTgoYWRkcmVzcylcbiAgICAgIC50b19lcmdvX3RyZWUoKVxuICAgICAgLnRvX2Jhc2UxNl9ieXRlcygpO1xuICAgIHRoaXMucGVybWl0RXJnb1RyZWUgPSB3YXNtLkFkZHJlc3MuZnJvbV9iYXNlNTgocGVybWl0QWRkcmVzcylcbiAgICAgIC50b19lcmdvX3RyZWUoKVxuICAgICAgLnRvX2Jhc2UxNl9ieXRlcygpO1xuICAgIHRoaXMuZnJhdWRFcmdvVHJlZSA9IHdhc20uQWRkcmVzcy5mcm9tX2Jhc2U1OChmcmF1ZEFkZHJlc3MpXG4gICAgICAudG9fZXJnb190cmVlKClcbiAgICAgIC50b19iYXNlMTZfYnl0ZXMoKTtcbiAgICB0aGlzLlJXVCA9IFJXVDtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlciA/IGxvZ2dlciA6IG5ldyBEdW1teUxvZ2dlcigpO1xuICAgIHRoaXMuYWN0aW9ucyA9IG5ldyBFdmVudFRyaWdnZXJBY3Rpb24oZGF0YVNvdXJjZSwgdGhpcy5sb2dnZXIpO1xuICB9XG5cbiAgZ2V0SWQgPSAoKSA9PiB0aGlzLmlkO1xuXG4gIC8qKlxuICAgKiBnZXRzIGJsb2NrIGlkIGFuZCB0cmFuc2FjdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2sgYW5kIHNhdmVzIGlmIHRoZXkgYXJlIHZhbGlkIHJvc2VuXG4gICAqICB0cmFuc2FjdGlvbnMgYW5kIGluIGNhc2Ugb2Ygc3VjY2VzcyByZXR1cm4gdHJ1ZSBhbmQgaW4gY2FzZSBvZiBmYWlsdXJlIHJldHVybnMgZmFsc2VcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSB0eHNcbiAgICovXG4gIHByb2Nlc3NUcmFuc2FjdGlvbnMgPSAoXG4gICAgdHhzOiBBcnJheTxUcmFuc2FjdGlvbj4sXG4gICAgYmxvY2s6IEJsb2NrRW50aXR5XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib3hlczogQXJyYXk8RXh0cmFjdGVkRXZlbnRUcmlnZ2VyPiA9IFtdO1xuICAgICAgICBjb25zdCB0eFNwZW5kSWRzOiBBcnJheTx7XG4gICAgICAgICAgdHhJZDogc3RyaW5nO1xuICAgICAgICAgIHNwZW5kQm94ZXM6IEFycmF5PHN0cmluZz47XG4gICAgICAgICAgcmVzdWx0OiBzdHJpbmc7XG4gICAgICAgICAgcGF5bWVudFR4SWQ6IHN0cmluZztcbiAgICAgICAgfT4gPSBbXTtcbiAgICAgICAgdHhzLmZvckVhY2goKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICAgICAgLy8gZXh0cmFjdCBldmVudCByZXN1bHRcbiAgICAgICAgICBjb25zdCB7IHJlc3VsdCwgcGF5bWVudFR4SWQgfSA9IHRoaXMuZXh0cmFjdEV2ZW50UmVzdWx0KHRyYW5zYWN0aW9uKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0cmFuc2FjdGlvbi5vdXRwdXRzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgb3V0cHV0LmFkZGl0aW9uYWxSZWdpc3RlcnMgJiZcbiAgICAgICAgICAgICAgICBvdXRwdXQuYXNzZXRzICYmXG4gICAgICAgICAgICAgICAgb3V0cHV0LmFzc2V0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgb3V0cHV0LmFzc2V0c1swXS50b2tlbklkID09PSB0aGlzLlJXVCAmJlxuICAgICAgICAgICAgICAgIG91dHB1dC5lcmdvVHJlZSA9PT0gdGhpcy5ldmVudFRyaWdnZXJFcmdvVHJlZVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBSNCA9IG91dHB1dC5hZGRpdGlvbmFsUmVnaXN0ZXJzLlI0O1xuICAgICAgICAgICAgICAgIGNvbnN0IFI1ID0gb3V0cHV0LmFkZGl0aW9uYWxSZWdpc3RlcnMuUjU7XG4gICAgICAgICAgICAgICAgY29uc3QgUjcgPSBvdXRwdXQuYWRkaXRpb25hbFJlZ2lzdGVycy5SNztcbiAgICAgICAgICAgICAgICBpZiAoUjQgJiYgUjUgJiYgUjcpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dFBhcnNlZCA9IHdhc20uRXJnb0JveC5mcm9tX2pzb24oXG4gICAgICAgICAgICAgICAgICAgIEpzb25CSS5zdHJpbmdpZnkob3V0cHV0KVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IFI0Q29uc3QgPSBvdXRwdXRQYXJzZWQucmVnaXN0ZXJfdmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHdhc20uTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SNFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IFI1Q29uc3QgPSBvdXRwdXRQYXJzZWQucmVnaXN0ZXJfdmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHdhc20uTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SNVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IFI3Q29uc3QgPSBvdXRwdXRQYXJzZWQucmVnaXN0ZXJfdmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHdhc20uTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SN1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChSNENvbnN0ICYmIFI1Q29uc3QgJiYgUjdDb25zdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBSNFNlcmlhbGl6ZWQgPSBSNENvbnN0LnRvX2NvbGxfY29sbF9ieXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFI1U2VyaWFsaXplZCA9IFI1Q29uc3QudG9fY29sbF9jb2xsX2J5dGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFI0U2VyaWFsaXplZC5sZW5ndGggPj0gMSAmJiBSNVNlcmlhbGl6ZWQubGVuZ3RoID49IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgV0lEc0NvdW50ID0gUjdDb25zdC50b19pMzIoKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXSURzSGFzaCA9IEJ1ZmZlci5mcm9tKFI0U2VyaWFsaXplZFswXSkudG9TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAnaGV4J1xuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlVHhJZCA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgUjVTZXJpYWxpemVkWzBdXG4gICAgICAgICAgICAgICAgICAgICAgKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50SWQgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsYWtlMmIoc291cmNlVHhJZCwgdW5kZWZpbmVkLCAzMilcbiAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAgICAgICAgICAgICBib3hlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eElkOiB0cmFuc2FjdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJveElkOiBvdXRwdXQuYm94SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3hTZXJpYWxpemVkOiBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyc2VkLnNpZ21hX3NlcmlhbGl6ZV9ieXRlcygpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvQ2hhaW46IEJ1ZmZlci5mcm9tKFI1U2VyaWFsaXplZFsyXSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvQWRkcmVzczogQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzRdKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ZlZTogQmlnSW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnMHgnICsgQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzddKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAgICAgICAgICAgICAgICkudG9TdHJpbmcoMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJpZGdlRmVlOiBCaWdJbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcweCcgKyBCdWZmZXIuZnJvbShSNVNlcmlhbGl6ZWRbNl0pLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50b1N0cmluZygxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IEJpZ0ludChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJzB4JyArIEJ1ZmZlci5mcm9tKFI1U2VyaWFsaXplZFs1XSkudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNoYWluVG9rZW5JZDogQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFI1U2VyaWFsaXplZFs4XVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2hhaW5Ub2tlbklkOiBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUjVTZXJpYWxpemVkWzldXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VUeElkOiBzb3VyY2VUeElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUNoYWluOiBCdWZmZXIuZnJvbShSNVNlcmlhbGl6ZWRbMV0pLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tQWRkcmVzczogQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzNdKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQmxvY2tJZDogQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzEwXSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFdJRHNDb3VudDogV0lEc0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgV0lEc0hhc2g6IFdJRHNIYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2hhaW5IZWlnaHQ6IE51bWJlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcweCcgKyBCdWZmZXIuZnJvbShSNVNlcmlhbGl6ZWRbMTFdKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKS50b1N0cmluZygxMClcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcHJvY2VzcyBpbnB1dHNcbiAgICAgICAgICB0eFNwZW5kSWRzLnB1c2goe1xuICAgICAgICAgICAgdHhJZDogdHJhbnNhY3Rpb24uaWQsXG4gICAgICAgICAgICBzcGVuZEJveGVzOiB0cmFuc2FjdGlvbi5pbnB1dHMubWFwKChib3gpID0+IGJveC5ib3hJZCksXG4gICAgICAgICAgICByZXN1bHQ6IHJlc3VsdCxcbiAgICAgICAgICAgIHBheW1lbnRUeElkOiBwYXltZW50VHhJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aW9uc1xuICAgICAgICAgIC5zdG9yZUV2ZW50VHJpZ2dlcnMoYm94ZXMsIGJsb2NrLCB0aGlzLmdldElkKCkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdHhTcGVuZElkcy5mb3JFYWNoKCh0eFNwZW5kcykgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbnNcbiAgICAgICAgICAgICAgICAuc3BlbmRFdmVudFRyaWdnZXJzKFxuICAgICAgICAgICAgICAgICAgdHhTcGVuZHMuc3BlbmRCb3hlcyxcbiAgICAgICAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgICAgICAgICAgdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgIHR4U3BlbmRzLnR4SWQsXG4gICAgICAgICAgICAgICAgICB0eFNwZW5kcy5yZXN1bHQsXG4gICAgICAgICAgICAgICAgICB0eFNwZW5kcy5wYXltZW50VHhJZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRXJyb3IgaW4gc3RvcmluZyBwZXJtaXRzIG9mIHRoZSBibG9jayAke2Jsb2NrfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBibG9jayAke2Jsb2NrfSBkb2Vzbid0IHNhdmUgaW4gdGhlIGRhdGFiYXNlIHdpdGggZXJyb3I6ICR7ZX1gXG4gICAgICAgICk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3JrQmxvY2sgPSBhc3luYyAoaGFzaDogc3RyaW5nKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25zLmRlbGV0ZUJsb2NrKGhhc2gsIHRoaXMuZ2V0SWQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RvciBib3ggaW5pdGlhbGl6YXRpb25cbiAgICogTm8gYWN0aW9uIG5lZWRlZCBpbiBldmVudCB0cmlnZ2VyIGV4dHJhY3RvcnNcbiAgICovXG4gIGluaXRpYWxpemVCb3hlcyA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm47XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIHJlc3VsdCBhbmQgcGF5bWVudFR4SWQgZnJvbSBhIHRyYW5zYWN0aW9uXG4gICAqIHJldHVybnMgJ3Vua25vd24nIGFzIHJlc3VsdCB3aGVuIHR4IGlzIG5laXRoZXIgZnJhdWQgb3Igc3VjY2Vzc2Z1bFxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnNcbiAgICovXG4gIHByb3RlY3RlZCBleHRyYWN0RXZlbnRSZXN1bHQgPSAodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IEV2ZW50UmVzdWx0LnVua25vd247XG4gICAgbGV0IHBheW1lbnRUeElkID0gJyc7XG4gICAgaWYgKHRyYW5zYWN0aW9uLm91dHB1dHNbMF0uZXJnb1RyZWUgPT09IHRoaXMuZnJhdWRFcmdvVHJlZSlcbiAgICAgIHJlc3VsdCA9IEV2ZW50UmVzdWx0LmZyYXVkO1xuICAgIGVsc2UgaWYgKHRyYW5zYWN0aW9uLm91dHB1dHNbMF0uZXJnb1RyZWUgPT09IHRoaXMucGVybWl0RXJnb1RyZWUpIHtcbiAgICAgIHJlc3VsdCA9IEV2ZW50UmVzdWx0LnN1Y2Nlc3NmdWw7XG4gICAgICAvLyBmaW5kIGZpcnN0IG5vbi13YXRjaGVyIGJveCB3aXRoIFI0IHZhbHVlXG4gICAgICBmb3IgKGNvbnN0IGJveCBvZiB0cmFuc2FjdGlvbi5vdXRwdXRzKSB7XG4gICAgICAgIC8vIGlmIGl0J3Mgd2F0Y2hlciBib3gsIHNraXAgaXRcbiAgICAgICAgaWYgKGJveC5lcmdvVHJlZSA9PT0gdGhpcy5wZXJtaXRFcmdvVHJlZSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG91dHB1dFBhcnNlZCA9IHdhc20uRXJnb0JveC5mcm9tX2pzb24oSnNvbkJJLnN0cmluZ2lmeShib3gpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBSNFNlcmlhbGl6ZWQgPSBvdXRwdXRQYXJzZWRcbiAgICAgICAgICAgIC5yZWdpc3Rlcl92YWx1ZSh3YXNtLk5vbk1hbmRhdG9yeVJlZ2lzdGVySWQuUjQpXG4gICAgICAgICAgICA/LnRvX2NvbGxfY29sbF9ieXRlKCk7XG4gICAgICAgICAgaWYgKFI0U2VyaWFsaXplZCAhPT0gdW5kZWZpbmVkICYmIFI0U2VyaWFsaXplZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0eElkID0gQnVmZmVyLmZyb20oUjRTZXJpYWxpemVkWzBdKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgICAgICBwYXltZW50VHhJZCA9IHR4SWQ7XG4gICAgICAgICAgICBpZiAodHhJZCAhPT0gJycpIHBheW1lbnRUeElkID0gdHhJZDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBwYXltZW50VHhJZCA9IHRyYW5zYWN0aW9uLmlkO1xuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgc3VjY2Vzc2Z1bCBldmVudCBpcyBzcGVudC4gdHggWyR7dHJhbnNhY3Rpb24uaWR9XSBpcyBib3RoIHBheW1lbnQgYW5kIHJld2FyZCBkaXN0cmlidXRpb24gdHhgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwYXltZW50VHhJZCBpcyBleHRyYWN0ZWQuIG5vIG5lZWQgdG8gcHJvY2VzcyBuZXh0IGJveGVzXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0LFxuICAgICAgcGF5bWVudFR4SWQsXG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRUcmlnZ2VyRXh0cmFjdG9yO1xuIl19
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRUcmlnZ2VyRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2V4dHJhY3Rvci9FdmVudFRyaWdnZXJFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFDTCxpQkFBaUIsR0FHbEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQWtCLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTVFLE9BQU8sa0JBQWtCLE1BQU0sK0JBQStCLENBQUM7QUFFL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXZDLE1BQU0scUJBQXNCLFNBQVEsaUJBQThCO0lBQ3ZELE1BQU0sQ0FBaUI7SUFDaEMsRUFBRSxDQUFTO0lBQ00sVUFBVSxDQUFhO0lBQ3ZCLE9BQU8sQ0FBcUI7SUFDNUIsb0JBQW9CLENBQVM7SUFDN0IsY0FBYyxDQUFTO0lBQ3ZCLGFBQWEsQ0FBUztJQUN0QixHQUFHLENBQVM7SUFFN0IsWUFDRSxFQUFVLEVBQ1YsVUFBc0IsRUFDdEIsT0FBZSxFQUNmLEdBQVcsRUFDWCxhQUFxQixFQUNyQixZQUFvQixFQUNwQixNQUF1QjtRQUV2QixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQzthQUMxRCxZQUFZLEVBQUU7YUFDZCxlQUFlLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUks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QWMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO3dCQUMvQyxFQUFFLGFBQWEsRUFBRSxDQUFDO29CQUNwQixJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3pELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN2RCxXQUFXLEdBQUcsSUFBSSxDQUFDO3dCQUNuQixJQUFJLElBQUksS0FBSyxFQUFFOzRCQUFFLFdBQVcsR0FBRyxJQUFJLENBQUM7NkJBQy9COzRCQUNILFdBQVcsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDOzRCQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixrQ0FBa0MsV0FBVyxDQUFDLEVBQUUsOENBQThDLENBQy9GLENBQUM7eUJBQ0g7d0JBQ0QsMERBQTBEO3dCQUMxRCxNQUFNO3FCQUNQO2lCQUNGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNWLFNBQVM7aUJBQ1Y7YUFDRjtTQUNGO1FBQ0QsT0FBTztZQUNMLE1BQU07WUFDTixXQUFXO1NBQ1osQ0FBQztJQUNKLENBQUMsQ0FBQztDQUNIO0FBRUQsZUFBZSxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCAqIGFzIHdhc20gZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuaW1wb3J0IHsgYmxha2UyYiB9IGZyb20gJ2JsYWtlanMnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RFeHRyYWN0b3IsXG4gIEJsb2NrRW50aXR5LFxuICBUcmFuc2FjdGlvbixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcblxuaW1wb3J0IEV2ZW50VHJpZ2dlckFjdGlvbiBmcm9tICcuLi9hY3Rpb25zL0V2ZW50VHJpZ2dlckFjdGlvbic7XG5pbXBvcnQgeyBFeHRyYWN0ZWRFdmVudFRyaWdnZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4dHJhY3RlZEV2ZW50VHJpZ2dlcic7XG5pbXBvcnQgeyBKc29uQkkgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBFdmVudFJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJztcblxuY2xhc3MgRXZlbnRUcmlnZ2VyRXh0cmFjdG9yIGV4dGVuZHMgQWJzdHJhY3RFeHRyYWN0b3I8VHJhbnNhY3Rpb24+IHtcbiAgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcjtcbiAgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlOiBEYXRhU291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGlvbnM6IEV2ZW50VHJpZ2dlckFjdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudFRyaWdnZXJFcmdvVHJlZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pdEVyZ29UcmVlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZnJhdWRFcmdvVHJlZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IFJXVDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgUldUOiBzdHJpbmcsXG4gICAgcGVybWl0QWRkcmVzczogc3RyaW5nLFxuICAgIGZyYXVkQWRkcmVzczogc3RyaW5nLFxuICAgIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gICAgdGhpcy5ldmVudFRyaWdnZXJFcmdvVHJlZSA9IHdhc20uQWRkcmVzcy5mcm9tX2Jhc2U1OChhZGRyZXNzKVxuICAgICAgLnRvX2VyZ29fdHJlZSgpXG4gICAgICAudG9fYmFzZTE2X2J5dGVzKCk7XG4gICAgdGhpcy5wZXJtaXRFcmdvVHJlZSA9IHdhc20uQWRkcmVzcy5mcm9tX2Jhc2U1OChwZXJtaXRBZGRyZXNzKVxuICAgICAgLnRvX2VyZ29fdHJlZSgpXG4gICAgICAudG9fYmFzZTE2X2J5dGVzKCk7XG4gICAgdGhpcy5mcmF1ZEVyZ29UcmVlID0gd2FzbS5BZGRyZXNzLmZyb21fYmFzZTU4KGZyYXVkQWRkcmVzcylcbiAgICAgIC50b19lcmdvX3RyZWUoKVxuICAgICAgLnRvX2Jhc2UxNl9ieXRlcygpO1xuICAgIHRoaXMuUldUID0gUldUO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8gbG9nZ2VyIDogbmV3IER1bW15TG9nZ2VyKCk7XG4gICAgdGhpcy5hY3Rpb25zID0gbmV3IEV2ZW50VHJpZ2dlckFjdGlvbihkYXRhU291cmNlLCB0aGlzLmxvZ2dlcik7XG4gIH1cblxuICBnZXRJZCA9ICgpID0+IHRoaXMuaWQ7XG5cbiAgLyoqXG4gICAqIGdldHMgYmxvY2sgaWQgYW5kIHRyYW5zYWN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBibG9jayBhbmQgc2F2ZXMgaWYgdGhleSBhcmUgdmFsaWQgcm9zZW5cbiAgICogIHRyYW5zYWN0aW9ucyBhbmQgaW4gY2FzZSBvZiBzdWNjZXNzIHJldHVybiB0cnVlIGFuZCBpbiBjYXNlIG9mIGZhaWx1cmUgcmV0dXJucyBmYWxzZVxuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIHR4c1xuICAgKi9cbiAgcHJvY2Vzc1RyYW5zYWN0aW9ucyA9IChcbiAgICB0eHM6IEFycmF5PFRyYW5zYWN0aW9uPixcbiAgICBibG9jazogQmxvY2tFbnRpdHlcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJveGVzOiBBcnJheTxFeHRyYWN0ZWRFdmVudFRyaWdnZXI+ID0gW107XG4gICAgICAgIGNvbnN0IHR4U3BlbmRJZHM6IEFycmF5PHtcbiAgICAgICAgICB0eElkOiBzdHJpbmc7XG4gICAgICAgICAgc3BlbmRCb3hlczogQXJyYXk8c3RyaW5nPjtcbiAgICAgICAgICByZXN1bHQ6IHN0cmluZztcbiAgICAgICAgICBwYXltZW50VHhJZDogc3RyaW5nO1xuICAgICAgICB9PiA9IFtdO1xuICAgICAgICB0eHMuZm9yRWFjaCgodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgICAvLyBleHRyYWN0IGV2ZW50IHJlc3VsdFxuICAgICAgICAgIGNvbnN0IHsgcmVzdWx0LCBwYXltZW50VHhJZCB9ID0gdGhpcy5leHRyYWN0RXZlbnRSZXN1bHQodHJhbnNhY3Rpb24pO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIHRyYW5zYWN0aW9uLm91dHB1dHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBvdXRwdXQuYWRkaXRpb25hbFJlZ2lzdGVycyAmJlxuICAgICAgICAgICAgICAgIG91dHB1dC5hc3NldHMgJiZcbiAgICAgICAgICAgICAgICBvdXRwdXQuYXNzZXRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICBvdXRwdXQuYXNzZXRzWzBdLnRva2VuSWQgPT09IHRoaXMuUldUICYmXG4gICAgICAgICAgICAgICAgb3V0cHV0LmVyZ29UcmVlID09PSB0aGlzLmV2ZW50VHJpZ2dlckVyZ29UcmVlXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFI0ID0gb3V0cHV0LmFkZGl0aW9uYWxSZWdpc3RlcnMuUjQ7XG4gICAgICAgICAgICAgICAgY29uc3QgUjUgPSBvdXRwdXQuYWRkaXRpb25hbFJlZ2lzdGVycy5SNTtcbiAgICAgICAgICAgICAgICBjb25zdCBSNyA9IG91dHB1dC5hZGRpdGlvbmFsUmVnaXN0ZXJzLlI3O1xuICAgICAgICAgICAgICAgIGlmIChSNCAmJiBSNSAmJiBSNykge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0UGFyc2VkID0gd2FzbS5FcmdvQm94LmZyb21fanNvbihcbiAgICAgICAgICAgICAgICAgICAgSnNvbkJJLnN0cmluZ2lmeShvdXRwdXQpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgUjRDb25zdCA9IG91dHB1dFBhcnNlZC5yZWdpc3Rlcl92YWx1ZShcbiAgICAgICAgICAgICAgICAgICAgd2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI0XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgUjVDb25zdCA9IG91dHB1dFBhcnNlZC5yZWdpc3Rlcl92YWx1ZShcbiAgICAgICAgICAgICAgICAgICAgd2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI1XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgUjdDb25zdCA9IG91dHB1dFBhcnNlZC5yZWdpc3Rlcl92YWx1ZShcbiAgICAgICAgICAgICAgICAgICAgd2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI3XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKFI0Q29uc3QgJiYgUjVDb25zdCAmJiBSN0NvbnN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFI0U2VyaWFsaXplZCA9IFI0Q29uc3QudG9fYnl0ZV9hcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBSNVNlcmlhbGl6ZWQgPSBSNUNvbnN0LnRvX2NvbGxfY29sbF9ieXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChSNFNlcmlhbGl6ZWQubGVuZ3RoID49IDEgJiYgUjVTZXJpYWxpemVkLmxlbmd0aCA+PSAxMikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdJRHNDb3VudCA9IFI3Q29uc3QudG9faTMyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgV0lEc0hhc2ggPVxuICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyLmZyb20oUjRTZXJpYWxpemVkKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlVHhJZCA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgUjVTZXJpYWxpemVkWzBdXG4gICAgICAgICAgICAgICAgICAgICAgKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50SWQgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsYWtlMmIoc291cmNlVHhJZCwgdW5kZWZpbmVkLCAzMilcbiAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAgICAgICAgICAgICBib3hlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eElkOiB0cmFuc2FjdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJveElkOiBvdXRwdXQuYm94SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3hTZXJpYWxpemVkOiBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyc2VkLnNpZ21hX3NlcmlhbGl6ZV9ieXRlcygpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvQ2hhaW46IEJ1ZmZlci5mcm9tKFI1U2VyaWFsaXplZFsyXSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvQWRkcmVzczogQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzRdKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0ZlZTogQmlnSW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnMHgnICsgQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzddKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAgICAgICAgICAgICAgICkudG9TdHJpbmcoMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJpZGdlRmVlOiBCaWdJbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcweCcgKyBCdWZmZXIuZnJvbShSNVNlcmlhbGl6ZWRbNl0pLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50b1N0cmluZygxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IEJpZ0ludChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJzB4JyArIEJ1ZmZlci5mcm9tKFI1U2VyaWFsaXplZFs1XSkudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNoYWluVG9rZW5JZDogQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFI1U2VyaWFsaXplZFs4XVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2hhaW5Ub2tlbklkOiBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUjVTZXJpYWxpemVkWzldXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VUeElkOiBzb3VyY2VUeElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUNoYWluOiBCdWZmZXIuZnJvbShSNVNlcmlhbGl6ZWRbMV0pLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tQWRkcmVzczogQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzNdKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQmxvY2tJZDogQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzEwXSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFdJRHNDb3VudDogV0lEc0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgV0lEc0hhc2g6IFdJRHNIYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2hhaW5IZWlnaHQ6IE51bWJlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcweCcgKyBCdWZmZXIuZnJvbShSNVNlcmlhbGl6ZWRbMTFdKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKS50b1N0cmluZygxMClcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcHJvY2VzcyBpbnB1dHNcbiAgICAgICAgICB0eFNwZW5kSWRzLnB1c2goe1xuICAgICAgICAgICAgdHhJZDogdHJhbnNhY3Rpb24uaWQsXG4gICAgICAgICAgICBzcGVuZEJveGVzOiB0cmFuc2FjdGlvbi5pbnB1dHMubWFwKChib3gpID0+IGJveC5ib3hJZCksXG4gICAgICAgICAgICByZXN1bHQ6IHJlc3VsdCxcbiAgICAgICAgICAgIHBheW1lbnRUeElkOiBwYXltZW50VHhJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aW9uc1xuICAgICAgICAgIC5zdG9yZUV2ZW50VHJpZ2dlcnMoYm94ZXMsIGJsb2NrLCB0aGlzLmdldElkKCkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdHhTcGVuZElkcy5mb3JFYWNoKCh0eFNwZW5kcykgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFjdGlvbnNcbiAgICAgICAgICAgICAgICAuc3BlbmRFdmVudFRyaWdnZXJzKFxuICAgICAgICAgICAgICAgICAgdHhTcGVuZHMuc3BlbmRCb3hlcyxcbiAgICAgICAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgICAgICAgICAgdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgIHR4U3BlbmRzLnR4SWQsXG4gICAgICAgICAgICAgICAgICB0eFNwZW5kcy5yZXN1bHQsXG4gICAgICAgICAgICAgICAgICB0eFNwZW5kcy5wYXltZW50VHhJZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRXJyb3IgaW4gc3RvcmluZyBwZXJtaXRzIG9mIHRoZSBibG9jayAke2Jsb2NrfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBibG9jayAke2Jsb2NrfSBkb2Vzbid0IHNhdmUgaW4gdGhlIGRhdGFiYXNlIHdpdGggZXJyb3I6ICR7ZX1gXG4gICAgICAgICk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3JrQmxvY2sgPSBhc3luYyAoaGFzaDogc3RyaW5nKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25zLmRlbGV0ZUJsb2NrKGhhc2gsIHRoaXMuZ2V0SWQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RvciBib3ggaW5pdGlhbGl6YXRpb25cbiAgICogTm8gYWN0aW9uIG5lZWRlZCBpbiBldmVudCB0cmlnZ2VyIGV4dHJhY3RvcnNcbiAgICovXG4gIGluaXRpYWxpemVCb3hlcyA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm47XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIHJlc3VsdCBhbmQgcGF5bWVudFR4SWQgZnJvbSBhIHRyYW5zYWN0aW9uXG4gICAqIHJldHVybnMgJ3Vua25vd24nIGFzIHJlc3VsdCB3aGVuIHR4IGlzIG5laXRoZXIgZnJhdWQgb3Igc3VjY2Vzc2Z1bFxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnNcbiAgICovXG4gIHByb3RlY3RlZCBleHRyYWN0RXZlbnRSZXN1bHQgPSAodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IEV2ZW50UmVzdWx0LnVua25vd247XG4gICAgbGV0IHBheW1lbnRUeElkID0gJyc7XG4gICAgaWYgKHRyYW5zYWN0aW9uLm91dHB1dHNbMF0uZXJnb1RyZWUgPT09IHRoaXMuZnJhdWRFcmdvVHJlZSlcbiAgICAgIHJlc3VsdCA9IEV2ZW50UmVzdWx0LmZyYXVkO1xuICAgIGVsc2UgaWYgKHRyYW5zYWN0aW9uLm91dHB1dHNbMF0uZXJnb1RyZWUgPT09IHRoaXMucGVybWl0RXJnb1RyZWUpIHtcbiAgICAgIHJlc3VsdCA9IEV2ZW50UmVzdWx0LnN1Y2Nlc3NmdWw7XG4gICAgICAvLyBmaW5kIGZpcnN0IG5vbi13YXRjaGVyIGJveCB3aXRoIFI0IHZhbHVlXG4gICAgICBmb3IgKGNvbnN0IGJveCBvZiB0cmFuc2FjdGlvbi5vdXRwdXRzKSB7XG4gICAgICAgIC8vIGlmIGl0J3Mgd2F0Y2hlciBib3gsIHNraXAgaXRcbiAgICAgICAgaWYgKGJveC5lcmdvVHJlZSA9PT0gdGhpcy5wZXJtaXRFcmdvVHJlZSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG91dHB1dFBhcnNlZCA9IHdhc20uRXJnb0JveC5mcm9tX2pzb24oSnNvbkJJLnN0cmluZ2lmeShib3gpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBSNFNlcmlhbGl6ZWQgPSBvdXRwdXRQYXJzZWRcbiAgICAgICAgICAgIC5yZWdpc3Rlcl92YWx1ZSh3YXNtLk5vbk1hbmRhdG9yeVJlZ2lzdGVySWQuUjQpXG4gICAgICAgICAgICA/LnRvX2J5dGVfYXJyYXkoKTtcbiAgICAgICAgICBpZiAoUjRTZXJpYWxpemVkICE9PSB1bmRlZmluZWQgJiYgUjRTZXJpYWxpemVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHR4SWQgPSBCdWZmZXIuZnJvbShSNFNlcmlhbGl6ZWQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAgIHBheW1lbnRUeElkID0gdHhJZDtcbiAgICAgICAgICAgIGlmICh0eElkICE9PSAnJykgcGF5bWVudFR4SWQgPSB0eElkO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHBheW1lbnRUeElkID0gdHJhbnNhY3Rpb24uaWQ7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBzdWNjZXNzZnVsIGV2ZW50IGlzIHNwZW50LiB0eCBbJHt0cmFuc2FjdGlvbi5pZH1dIGlzIGJvdGggcGF5bWVudCBhbmQgcmV3YXJkIGRpc3RyaWJ1dGlvbiB0eGBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHBheW1lbnRUeElkIGlzIGV4dHJhY3RlZC4gbm8gbmVlZCB0byBwcm9jZXNzIG5leHQgYm94ZXNcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZXN1bHQsXG4gICAgICBwYXltZW50VHhJZCxcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudFRyaWdnZXJFeHRyYWN0b3I7XG4iXX0=
@@ -0,0 +1,69 @@
1
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
+ import { AbstractExtractor, BlockEntity, Transaction } from '@rosen-bridge/scanner';
3
+ import { DataSource } from 'typeorm';
4
+ import CollateralAction from '../actions/collateralAction';
5
+ export declare class CollateralExtractor extends AbstractExtractor<Transaction> {
6
+ private readonly id;
7
+ private readonly awcNft;
8
+ private readonly address;
9
+ private readonly dataSource;
10
+ private readonly logger;
11
+ private readonly ergoTree;
12
+ readonly action: CollateralAction;
13
+ private explorerApi;
14
+ constructor(id: string, awcNft: string, address: string, dataSource: DataSource, explorerUrl: string, logger?: AbstractLogger);
15
+ /**
16
+ * get id for extractor. This id must be unique over all extractors.
17
+ *
18
+ * @return {string}
19
+ */
20
+ getId: () => string;
21
+ /**
22
+ * process a list of transactions and store collateral box details
23
+ *
24
+ * @param {Transaction[]} txs list of transaction for block
25
+ * @param {BlockEntity} block block id for transactions as hex encoded
26
+ * @return {Promise<boolean>} Promise<boolean> if no error occurred return
27
+ * true. otherwise, return false
28
+ */
29
+ processTransactions: (txs: Transaction[], block: BlockEntity) => Promise<boolean>;
30
+ private isCollateralBox;
31
+ forkBlock: (hash: string) => Promise<void>;
32
+ /**
33
+ * Initializes the database with older collaterals
34
+ *
35
+ * @param {number} initialHeight
36
+ * @return {Promise<void>}
37
+ * @memberof CollateralExtractor
38
+ */
39
+ initializeBoxes: (initialHeight: number) => Promise<void>;
40
+ /**
41
+ * removes or updates stored collateral boxes before initializing boxes
42
+ *
43
+ * @private
44
+ * @param {number} initialHeight
45
+ * @param {string[]} collateralBoxIds
46
+ * @return {Promise<void>}
47
+ * @memberof CollateralExtractor
48
+ */
49
+ private tidyUpStoredCollaterals;
50
+ /**
51
+ * gets all unspent collaterals from Ergo explorer api
52
+ *
53
+ * @private
54
+ * @param {number} initialHeight
55
+ * @return {Promise<Array<ExtractedCollateral>>}
56
+ * @memberof CollateralExtractor
57
+ */
58
+ private getAllUnspentCollaterals;
59
+ /**
60
+ * converts output box information to an ExtractedCollateral object
61
+ *
62
+ * @private
63
+ * @param {(OutputInfo | OutputBox)} box
64
+ * @return {ExtractedCollateral}
65
+ * @memberof CollateralExtractor
66
+ */
67
+ private toExtractedCollateral;
68
+ }
69
+ //# sourceMappingURL=collateralExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collateralExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractor/collateralExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,iBAAiB,EACjB,WAAW,EAEX,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,gBAAgB,MAAM,6BAA6B,CAAC;AAK3D,qBAAa,mBAAoB,SAAQ,iBAAiB,CAAC,WAAW,CAAC;IAMnE,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,OAAO,CAAC,WAAW,CAAC;gBAGD,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,EACvC,WAAW,EAAE,MAAM,EACF,MAAM,GAAE,cAAkC;IAU7D;;;;OAIG;IACH,KAAK,QAAO,MAAM,CAAY;IAE9B;;;;;;;OAOG;IACH,mBAAmB,QACZ,WAAW,EAAE,SACX,WAAW,KACjB,QAAQ,OAAO,CAAC,CAyBjB;IAEF,OAAO,CAAC,eAAe;IASvB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C;;;;;;OAMG;IACH,eAAe,kBAAyB,MAAM,KAAG,QAAQ,IAAI,CAAC,CA+B5D;IAEF;;;;;;;;OAQG;YACW,uBAAuB;IA6CrC;;;;;;;OAOG;IACH,OAAO,CAAC,wBAAwB,CA8B9B;IAEF;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB,CAwD3B;CACH"}