@rosen-bridge/watcher-data-extractor 13.0.8 → 14.0.0-d7a97532
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -4
- package/dist/actions/permitAction.d.ts +10 -58
- package/dist/actions/permitAction.d.ts.map +1 -1
- package/dist/actions/permitAction.js +22 -174
- package/dist/entities/permitEntity.d.ts +2 -9
- package/dist/entities/permitEntity.d.ts.map +1 -1
- package/dist/entities/permitEntity.js +5 -45
- package/dist/extractor/permitExtractor.d.ts +13 -128
- package/dist/extractor/permitExtractor.d.ts.map +1 -1
- package/dist/extractor/permitExtractor.js +31 -201
- package/dist/interfaces/extractedPermit.d.ts +4 -7
- package/dist/interfaces/extractedPermit.d.ts.map +1 -1
- package/dist/interfaces/extractedPermit.js +1 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +5 -1
- package/dist/migrations/postgres/1782948062354-migration.d.ts +7 -0
- package/dist/migrations/postgres/1782948062354-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1782948062354-migration.js +50 -0
- package/dist/migrations/sqlite/1782948174639-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1782948174639-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1782948174639-migration.js +103 -0
- package/package.json +3 -4
- package/dist/tsconfig.tsbuildinfo +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# @rosen-bridge/watcher-data-extractor
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 14.0.0-d7a97532
|
|
4
4
|
|
|
5
|
-
###
|
|
5
|
+
### Major Changes
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
7
|
+
- Refactor Permit Extractor:
|
|
8
|
+
- Refactor the PermitExtractor to inherit from `AbstractBoxExtractor` and implement an initialize option to support flexible setup
|
|
9
9
|
|
|
10
10
|
## 13.0.7
|
|
11
11
|
|
|
@@ -1,73 +1,25 @@
|
|
|
1
|
+
import { AbstractErgoBoxAction } from '@rosen-bridge/abstract-extractor';
|
|
1
2
|
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
-
import { DataSource
|
|
3
|
+
import { DataSource } from '@rosen-bridge/extended-typeorm';
|
|
3
4
|
import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
|
|
4
5
|
import PermitEntity from '../entities/permitEntity';
|
|
5
6
|
import { ExtractedPermit } from '../interfaces/extractedPermit';
|
|
6
|
-
declare class PermitAction {
|
|
7
|
-
readonly logger: AbstractLogger;
|
|
8
|
-
private readonly datasource;
|
|
9
|
-
private readonly permitRepository;
|
|
7
|
+
declare class PermitAction extends AbstractErgoBoxAction<ExtractedPermit, PermitEntity> {
|
|
10
8
|
constructor(dataSource: DataSource, logger?: AbstractLogger);
|
|
11
9
|
/**
|
|
12
|
-
*
|
|
10
|
+
* Creates the permit entity from extracted data and block information
|
|
13
11
|
* @param permits
|
|
14
|
-
* @param initialHeight
|
|
15
|
-
* @param extractor
|
|
16
|
-
*/
|
|
17
|
-
insertPermit: (permit: ExtractedPermit, extractor: string) => Promise<import("@rosen-bridge/extended-typeorm").InsertResult>;
|
|
18
|
-
/**
|
|
19
|
-
* update an unspent permit in the database
|
|
20
|
-
* @param permit
|
|
21
|
-
* @param extractor
|
|
22
|
-
*/
|
|
23
|
-
updatePermit: (permit: ExtractedPermit, extractor: string) => Promise<void>;
|
|
24
|
-
/**
|
|
25
|
-
* It stores list of permits in the dataSource with block id
|
|
26
|
-
* @param permits
|
|
27
|
-
* @param block
|
|
28
|
-
* @param extractor
|
|
29
|
-
*/
|
|
30
|
-
storePermits: (permits: Array<ExtractedPermit>, block: BlockInfo, extractor: string) => Promise<boolean>;
|
|
31
|
-
/**
|
|
32
|
-
* Update spendBlock and spendHeight of permits spent on the block
|
|
33
|
-
* @param spendId
|
|
34
12
|
* @param block
|
|
35
13
|
* @param extractor
|
|
14
|
+
* @returns the permit entities (without the id)
|
|
36
15
|
*/
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Delete all permits corresponding to the block(id) and extractor(id)
|
|
40
|
-
* and update all permits spent on the specified block
|
|
41
|
-
* @param block
|
|
42
|
-
* @param extractor
|
|
43
|
-
*/
|
|
44
|
-
deleteBlock: (block: string, extractor: string) => Promise<void>;
|
|
45
|
-
/**
|
|
46
|
-
* Returns all stored permit box ids
|
|
47
|
-
*/
|
|
48
|
-
getAllPermitBoxIds: (extractor: string) => Promise<Array<string>>;
|
|
49
|
-
/**
|
|
50
|
-
* Removes specified permit
|
|
51
|
-
* @param boxId
|
|
52
|
-
* @param extractor
|
|
53
|
-
*/
|
|
54
|
-
removePermit: (boxId: string, extractor: string) => Promise<import("@rosen-bridge/extended-typeorm").DeleteResult>;
|
|
55
|
-
/**
|
|
56
|
-
* Update the permit spending information
|
|
57
|
-
* @param boxId
|
|
58
|
-
* @param extractor
|
|
59
|
-
* @param blockId
|
|
60
|
-
* @param blockHeight
|
|
61
|
-
*/
|
|
62
|
-
updateSpendBlock: (boxId: string, extractor: string, blockId: string, blockHeight: number) => Promise<import("@rosen-bridge/extended-typeorm").UpdateResult>;
|
|
16
|
+
protected createEntity: (permits: ExtractedPermit[], block: BlockInfo, extractor: string) => Array<Omit<PermitEntity, "id">>;
|
|
63
17
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* @param extractorId - Identifier of the extractor
|
|
68
|
-
* @returns A query builder selecting used blocks
|
|
18
|
+
* convert the database entity back to raw data
|
|
19
|
+
* @param entities
|
|
20
|
+
* @returns the extracted collateral data
|
|
69
21
|
*/
|
|
70
|
-
|
|
22
|
+
protected convertEntityToData: (entities: PermitEntity[]) => ExtractedPermit[];
|
|
71
23
|
}
|
|
72
24
|
export default PermitAction;
|
|
73
25
|
//# sourceMappingURL=permitAction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permitAction.d.ts","sourceRoot":"","sources":["../../lib/actions/permitAction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"permitAction.d.ts","sourceRoot":"","sources":["../../lib/actions/permitAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,cAAM,YAAa,SAAQ,qBAAqB,CAC9C,eAAe,EACf,YAAY,CACb;gBACa,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc;IAI3D;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,GACpB,SAAS,eAAe,EAAE,EAC1B,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAUhC;IAEF;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,GAC3B,UAAU,YAAY,EAAE,KACvB,eAAe,EAAE,CAElB;CACH;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -1,187 +1,35 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
-
import { In, } from '@rosen-bridge/extended-typeorm';
|
|
4
|
-
import { dbIdChunkSize } from '../constants';
|
|
1
|
+
import { AbstractErgoBoxAction } from '@rosen-bridge/abstract-extractor';
|
|
5
2
|
import PermitEntity from '../entities/permitEntity';
|
|
6
|
-
class PermitAction {
|
|
7
|
-
logger;
|
|
8
|
-
datasource;
|
|
9
|
-
permitRepository;
|
|
3
|
+
class PermitAction extends AbstractErgoBoxAction {
|
|
10
4
|
constructor(dataSource, logger) {
|
|
11
|
-
|
|
12
|
-
this.logger = logger ? logger : new DummyLogger();
|
|
13
|
-
this.permitRepository = dataSource.getRepository(PermitEntity);
|
|
5
|
+
super(dataSource, PermitEntity, logger);
|
|
14
6
|
}
|
|
15
7
|
/**
|
|
16
|
-
*
|
|
8
|
+
* Creates the permit entity from extracted data and block information
|
|
17
9
|
* @param permits
|
|
18
|
-
* @param initialHeight
|
|
19
|
-
* @param extractor
|
|
20
|
-
*/
|
|
21
|
-
insertPermit = async (permit, extractor) => {
|
|
22
|
-
return this.permitRepository.insert({
|
|
23
|
-
boxId: permit.boxId,
|
|
24
|
-
boxSerialized: permit.boxSerialized,
|
|
25
|
-
block: permit.block,
|
|
26
|
-
height: permit.height,
|
|
27
|
-
extractor: extractor,
|
|
28
|
-
WID: permit.WID,
|
|
29
|
-
txId: permit.txId,
|
|
30
|
-
spendBlock: permit.spendBlock,
|
|
31
|
-
spendHeight: permit.spendHeight,
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
/**
|
|
35
|
-
* update an unspent permit in the database
|
|
36
|
-
* @param permit
|
|
37
|
-
* @param extractor
|
|
38
|
-
*/
|
|
39
|
-
updatePermit = async (permit, extractor) => {
|
|
40
|
-
await this.permitRepository.update({ boxId: permit.boxId, extractor: extractor }, {
|
|
41
|
-
boxSerialized: permit.boxSerialized,
|
|
42
|
-
block: permit.block,
|
|
43
|
-
height: permit.height,
|
|
44
|
-
WID: permit.WID,
|
|
45
|
-
txId: permit.txId,
|
|
46
|
-
spendBlock: null,
|
|
47
|
-
spendHeight: null,
|
|
48
|
-
});
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* It stores list of permits in the dataSource with block id
|
|
52
|
-
* @param permits
|
|
53
|
-
* @param block
|
|
54
|
-
* @param extractor
|
|
55
|
-
*/
|
|
56
|
-
storePermits = async (permits, block, extractor) => {
|
|
57
|
-
if (permits.length === 0)
|
|
58
|
-
return true;
|
|
59
|
-
const boxIds = permits.map((permit) => permit.boxId);
|
|
60
|
-
const savedPermits = await this.permitRepository.findBy({
|
|
61
|
-
boxId: In(boxIds),
|
|
62
|
-
extractor: extractor,
|
|
63
|
-
});
|
|
64
|
-
let success = true;
|
|
65
|
-
const queryRunner = this.datasource.createQueryRunner();
|
|
66
|
-
await queryRunner.connect();
|
|
67
|
-
await queryRunner.startTransaction();
|
|
68
|
-
const repository = await queryRunner.manager.getRepository(PermitEntity);
|
|
69
|
-
try {
|
|
70
|
-
for (const permit of permits) {
|
|
71
|
-
const saved = savedPermits.some((entity) => {
|
|
72
|
-
return entity.boxId === permit.boxId;
|
|
73
|
-
});
|
|
74
|
-
const entity = {
|
|
75
|
-
boxId: permit.boxId,
|
|
76
|
-
boxSerialized: permit.boxSerialized,
|
|
77
|
-
block: block.hash,
|
|
78
|
-
height: block.height,
|
|
79
|
-
extractor: extractor,
|
|
80
|
-
WID: permit.WID,
|
|
81
|
-
txId: permit.txId,
|
|
82
|
-
};
|
|
83
|
-
if (!saved) {
|
|
84
|
-
this.logger.debug(`Saving permit [${permit.boxId}] belonging to watcher [${permit.WID}] at height ${block.height} and extractor ${extractor}`);
|
|
85
|
-
await repository.insert(entity);
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
this.logger.debug(`Updating permit [${permit.boxId}] belonging to watcher [${permit.WID}] at height ${block.height} and extractor ${extractor}`);
|
|
89
|
-
await repository.update({ boxId: permit.boxId }, entity);
|
|
90
|
-
}
|
|
91
|
-
this.logger.debug(`Entity: ${JSON.stringify(entity)}`);
|
|
92
|
-
}
|
|
93
|
-
await queryRunner.commitTransaction();
|
|
94
|
-
}
|
|
95
|
-
catch (e) {
|
|
96
|
-
this.logger.error(`An error occurred during store permit action: ${e}`);
|
|
97
|
-
await queryRunner.rollbackTransaction();
|
|
98
|
-
success = false;
|
|
99
|
-
}
|
|
100
|
-
finally {
|
|
101
|
-
await queryRunner.release();
|
|
102
|
-
}
|
|
103
|
-
return success;
|
|
104
|
-
};
|
|
105
|
-
/**
|
|
106
|
-
* Update spendBlock and spendHeight of permits spent on the block
|
|
107
|
-
* @param spendId
|
|
108
|
-
* @param block
|
|
109
|
-
* @param extractor
|
|
110
|
-
*/
|
|
111
|
-
spendPermits = async (spendId, block, extractor) => {
|
|
112
|
-
const spendIdChunks = chunk(spendId, dbIdChunkSize);
|
|
113
|
-
for (const spendIdChunk of spendIdChunks) {
|
|
114
|
-
const updateResult = await this.permitRepository.update({ boxId: In(spendIdChunk), extractor: extractor }, { spendBlock: block.hash, spendHeight: block.height });
|
|
115
|
-
if (updateResult.affected && updateResult.affected > 0) {
|
|
116
|
-
const spentRows = await this.permitRepository.findBy({
|
|
117
|
-
boxId: In(spendIdChunk),
|
|
118
|
-
spendBlock: block.hash,
|
|
119
|
-
});
|
|
120
|
-
for (const row of spentRows) {
|
|
121
|
-
this.logger.debug(`Spent permit with boxId [${row.boxId}] belonging to watcher with WID [${row.WID}] at height ${block.height}`);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
/**
|
|
127
|
-
* Delete all permits corresponding to the block(id) and extractor(id)
|
|
128
|
-
* and update all permits spent on the specified block
|
|
129
10
|
* @param block
|
|
130
11
|
* @param extractor
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
extractor: extractor,
|
|
144
|
-
},
|
|
145
|
-
select: {
|
|
146
|
-
boxId: true,
|
|
147
|
-
},
|
|
148
|
-
});
|
|
149
|
-
return boxIds.map((item) => item.boxId);
|
|
150
|
-
};
|
|
151
|
-
/**
|
|
152
|
-
* Removes specified permit
|
|
153
|
-
* @param boxId
|
|
154
|
-
* @param extractor
|
|
155
|
-
*/
|
|
156
|
-
removePermit = async (boxId, extractor) => {
|
|
157
|
-
return await this.permitRepository.delete({
|
|
158
|
-
boxId: boxId,
|
|
159
|
-
extractor: extractor,
|
|
160
|
-
});
|
|
161
|
-
};
|
|
162
|
-
/**
|
|
163
|
-
* Update the permit spending information
|
|
164
|
-
* @param boxId
|
|
165
|
-
* @param extractor
|
|
166
|
-
* @param blockId
|
|
167
|
-
* @param blockHeight
|
|
168
|
-
*/
|
|
169
|
-
updateSpendBlock = async (boxId, extractor, blockId, blockHeight) => {
|
|
170
|
-
return await this.permitRepository.update({ boxId: boxId, extractor: extractor }, { spendBlock: blockId, spendHeight: blockHeight });
|
|
12
|
+
* @returns the permit entities (without the id)
|
|
13
|
+
*/
|
|
14
|
+
createEntity = (permits, block, extractor) => {
|
|
15
|
+
return permits.map((permit) => ({
|
|
16
|
+
...permit,
|
|
17
|
+
block: block.hash,
|
|
18
|
+
height: block.height,
|
|
19
|
+
extractor,
|
|
20
|
+
WID: permit.WID,
|
|
21
|
+
spendBlock: permit.spendBlock ?? null,
|
|
22
|
+
spendHeight: permit.spendHeight ?? null,
|
|
23
|
+
}));
|
|
171
24
|
};
|
|
172
25
|
/**
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
* @param extractorId - Identifier of the extractor
|
|
177
|
-
* @returns A query builder selecting used blocks
|
|
26
|
+
* convert the database entity back to raw data
|
|
27
|
+
* @param entities
|
|
28
|
+
* @returns the extracted collateral data
|
|
178
29
|
*/
|
|
179
|
-
|
|
180
|
-
return
|
|
181
|
-
.createQueryBuilder('permitEntity')
|
|
182
|
-
.select('permitEntity.block', 'block')
|
|
183
|
-
.where('permitEntity.extractor = :extractorId', { extractorId });
|
|
30
|
+
convertEntityToData = (entities) => {
|
|
31
|
+
return entities;
|
|
184
32
|
};
|
|
185
33
|
}
|
|
186
34
|
export default PermitAction;
|
|
187
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWl0QWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FjdGlvbnMvcGVybWl0QWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEMsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RSxPQUFPLEVBRUwsRUFBRSxHQUdILE1BQU0sZ0NBQWdDLENBQUM7QUFHeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUdwRCxNQUFNLFlBQVk7SUFDUCxNQUFNLENBQWlCO0lBQ2YsVUFBVSxDQUFhO0lBQ3ZCLGdCQUFnQixDQUEyQjtJQUU1RCxZQUFZLFVBQXNCLEVBQUUsTUFBdUI7UUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLEdBQUcsS0FBSyxFQUFFLE1BQXVCLEVBQUUsU0FBaUIsRUFBRSxFQUFFO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztZQUNsQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7WUFDbkIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO1lBQ25DLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFH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QzthQUNyQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQztDQUNIO0FBRUQsZUFBZSxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjaHVuayB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIEluLFxuICBSZXBvc2l0b3J5LFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IGRiSWRDaHVua1NpemUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IFBlcm1pdEVudGl0eSBmcm9tICcuLi9lbnRpdGllcy9wZXJtaXRFbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdGVkUGVybWl0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRyYWN0ZWRQZXJtaXQnO1xuXG5jbGFzcyBQZXJtaXRBY3Rpb24ge1xuICByZWFkb25seSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFzb3VyY2U6IERhdGFTb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWl0UmVwb3NpdG9yeTogUmVwb3NpdG9yeTxQZXJtaXRFbnRpdHk+O1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgdGhpcy5kYXRhc291cmNlID0gZGF0YVNvdXJjZTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlciA/IGxvZ2dlciA6IG5ldyBEdW1teUxvZ2dlcigpO1xuICAgIHRoaXMucGVybWl0UmVwb3NpdG9yeSA9IGRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShQZXJtaXRFbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGluc2VydCBhIG5ldyBwZXJtaXQgYm94ZXMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSBwZXJtaXRzXG4gICAqIEBwYXJhbSBpbml0aWFsSGVpZ2h0XG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIGluc2VydFBlcm1pdCA9IGFzeW5jIChwZXJtaXQ6IEV4dHJhY3RlZFBlcm1pdCwgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXRSZXBvc2l0b3J5Lmluc2VydCh7XG4gICAgICBib3hJZDogcGVybWl0LmJveElkLFxuICAgICAgYm94U2VyaWFsaXplZDogcGVybWl0LmJveFNlcmlhbGl6ZWQsXG4gICAgICBibG9jazogcGVybWl0LmJsb2NrLFxuICAgICAgaGVpZ2h0OiBwZXJtaXQuaGVpZ2h0LFxuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICBXSUQ6IHBlcm1pdC5XSUQsXG4gICAgICB0eElkOiBwZXJtaXQudHhJZCxcbiAgICAgIHNwZW5kQmxvY2s6IHBlcm1pdC5zcGVuZEJsb2NrLFxuICAgICAgc3BlbmRIZWlnaHQ6IHBlcm1pdC5zcGVuZEhlaWdodCxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogdXBkYXRlIGFuIHVuc3BlbnQgcGVybWl0IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0gcGVybWl0XG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIHVwZGF0ZVBlcm1pdCA9IGFzeW5jIChwZXJtaXQ6IEV4dHJhY3RlZFBlcm1pdCwgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICBhd2FpdCB0aGlzLnBlcm1pdFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgeyBib3hJZDogcGVybWl0LmJveElkLCBleHRyYWN0b3I6IGV4dHJhY3RvciB9LFxuICAgICAge1xuICAgICAgICBib3hTZXJpYWxpemVkOiBwZXJtaXQuYm94U2VyaWFsaXplZCxcbiAgICAgICAgYmxvY2s6IHBlcm1pdC5ibG9jayxcbiAgICAgICAgaGVpZ2h0OiBwZXJtaXQuaGVpZ2h0LFxuICAgICAgICBXSUQ6IHBlcm1pdC5XSUQsXG4gICAgICAgIHR4SWQ6IHBlcm1pdC50eElkLFxuICAgICAgICBzcGVuZEJsb2NrOiBudWxsLFxuICAgICAgICBzcGVuZEhlaWdodDogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogSXQgc3RvcmVzIGxpc3Qgb2YgcGVybWl0cyBpbiB0aGUgZGF0YVNvdXJjZSB3aXRoIGJsb2NrIGlkXG4gICAqIEBwYXJhbSBwZXJtaXRzXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBzdG9yZVBlcm1pdHMgPSBhc3luYyAoXG4gICAgcGVybWl0czogQXJyYXk8RXh0cmFjdGVkUGVybWl0PixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICApID0+IHtcbiAgICBpZiAocGVybWl0cy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGJveElkcyA9IHBlcm1pdHMubWFwKChwZXJtaXQpID0+IHBlcm1pdC5ib3hJZCk7XG4gICAgY29uc3Qgc2F2ZWRQZXJtaXRzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmRCeSh7XG4gICAgICBib3hJZDogSW4oYm94SWRzKSxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgIH0pO1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMuZGF0YXNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeShQZXJtaXRFbnRpdHkpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHBlcm1pdCBvZiBwZXJtaXRzKSB7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gc2F2ZWRQZXJtaXRzLnNvbWUoKGVudGl0eSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlbnRpdHkuYm94SWQgPT09IHBlcm1pdC5ib3hJZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHtcbiAgICAgICAgICBib3hJZDogcGVybWl0LmJveElkLFxuICAgICAgICAgIGJveFNlcmlhbGl6ZWQ6IHBlcm1pdC5ib3hTZXJpYWxpemVkLFxuICAgICAgICAgIGJsb2NrOiBibG9jay5oYXNoLFxuICAgICAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICAgIFdJRDogcGVybWl0LldJRCxcbiAgICAgICAgICB0eElkOiBwZXJtaXQudHhJZCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzYXZlZCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNhdmluZyBwZXJtaXQgWyR7cGVybWl0LmJveElkfV0gYmVsb25naW5nIHRvIHdhdGNoZXIgWyR7cGVybWl0LldJRH1dIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH0gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS5pbnNlcnQoZW50aXR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBVcGRhdGluZyBwZXJtaXQgWyR7cGVybWl0LmJveElkfV0gYmVsb25naW5nIHRvIHdhdGNoZXIgWyR7cGVybWl0LldJRH1dIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH0gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS51cGRhdGUoeyBib3hJZDogcGVybWl0LmJveElkIH0sIGVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEVudGl0eTogJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHN0b3JlIHBlcm1pdCBhY3Rpb246ICR7ZX1gKTtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHNwZW5kQmxvY2sgYW5kIHNwZW5kSGVpZ2h0IG9mIHBlcm1pdHMgc3BlbnQgb24gdGhlIGJsb2NrXG4gICAqIEBwYXJhbSBzcGVuZElkXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBzcGVuZFBlcm1pdHMgPSBhc3luYyAoXG4gICAgc3BlbmRJZDogQXJyYXk8c3RyaW5nPixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBzcGVuZElkQ2h1bmtzID0gY2h1bmsoc3BlbmRJZCwgZGJJZENodW5rU2l6ZSk7XG4gICAgZm9yIChjb25zdCBzcGVuZElkQ2h1bmsgb2Ygc3BlbmRJZENodW5rcykge1xuICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgICAgeyBib3hJZDogSW4oc3BlbmRJZENodW5rKSwgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgICAgeyBzcGVuZEJsb2NrOiBibG9jay5oYXNoLCBzcGVuZEhlaWdodDogYmxvY2suaGVpZ2h0IH0sXG4gICAgICApO1xuXG4gICAgICBpZiAodXBkYXRlUmVzdWx0LmFmZmVjdGVkICYmIHVwZGF0ZVJlc3VsdC5hZmZlY3RlZCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3BlbnRSb3dzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmRCeSh7XG4gICAgICAgICAgYm94SWQ6IEluKHNwZW5kSWRDaHVuayksXG4gICAgICAgICAgc3BlbmRCbG9jazogYmxvY2suaGFzaCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHNwZW50Um93cykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNwZW50IHBlcm1pdCB3aXRoIGJveElkIFske3Jvdy5ib3hJZH1dIGJlbG9uZ2luZyB0byB3YXRjaGVyIHdpdGggV0lEIFske3Jvdy5XSUR9XSBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEZWxldGUgYWxsIHBlcm1pdHMgY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2soaWQpIGFuZCBleHRyYWN0b3IoaWQpXG4gICAqIGFuZCB1cGRhdGUgYWxsIHBlcm1pdHMgc3BlbnQgb24gdGhlIHNwZWNpZmllZCBibG9ja1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgZGVsZXRlQmxvY2sgPSBhc3luYyAoYmxvY2s6IHN0cmluZywgZXh0cmFjdG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYERlbGV0aW5nIHBlcm1pdHMgYXQgYmxvY2sgJHtibG9ja30gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmRlbGV0ZSh7IGJsb2NrOiBibG9jaywgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSk7XG4gICAgYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHsgc3BlbmRCbG9jazogYmxvY2ssIGV4dHJhY3RvcjogZXh0cmFjdG9yIH0sXG4gICAgICB7IHNwZW5kQmxvY2s6IG51bGwsIHNwZW5kSGVpZ2h0OiBudWxsIH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogIFJldHVybnMgYWxsIHN0b3JlZCBwZXJtaXQgYm94IGlkc1xuICAgKi9cbiAgZ2V0QWxsUGVybWl0Qm94SWRzID0gYXN5bmMgKGV4dHJhY3Rvcjogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiA9PiB7XG4gICAgY29uc3QgYm94SWRzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICB9LFxuICAgICAgc2VsZWN0OiB7XG4gICAgICAgIGJveElkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gYm94SWRzLm1hcCgoaXRlbTogeyBib3hJZDogc3RyaW5nIH0pID0+IGl0ZW0uYm94SWQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHNwZWNpZmllZCBwZXJtaXRcbiAgICogQHBhcmFtIGJveElkXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIHJlbW92ZVBlcm1pdCA9IGFzeW5jIChib3hJZDogc3RyaW5nLCBleHRyYWN0b3I6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnBlcm1pdFJlcG9zaXRvcnkuZGVsZXRlKHtcbiAgICAgIGJveElkOiBib3hJZCxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHBlcm1pdCBzcGVuZGluZyBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0gYm94SWRcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gYmxvY2tJZFxuICAgKiBAcGFyYW0gYmxvY2tIZWlnaHRcbiAgICovXG4gIHVwZGF0ZVNwZW5kQmxvY2sgPSBhc3luYyAoXG4gICAgYm94SWQ6IHN0cmluZyxcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgICBibG9ja0lkOiBzdHJpbmcsXG4gICAgYmxvY2tIZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucGVybWl0UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7IGJveElkOiBib3hJZCwgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgIHsgc3BlbmRCbG9jazogYmxvY2tJZCwgc3BlbmRIZWlnaHQ6IGJsb2NrSGVpZ2h0IH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIGEgcXVlcnkgdGhhdCByZXR1cm5zIHVzZWQgYmxvY2tzIGJ5IHNlbGVjdGluZyB0aGUgYGJsb2NrYCBjb2x1bW4gZnJvbSB0aGUgYFBlcm1pdEVudGl0eWAgcmVwb3NpdG9yeSxcbiAgICogZmlsdGVyZWQgYnkgdGhlIHByb3ZpZGVkIGBleHRyYWN0b3JJZGBcbiAgICpcbiAgICogQHBhcmFtIGV4dHJhY3RvcklkIC0gSWRlbnRpZmllciBvZiB0aGUgZXh0cmFjdG9yXG4gICAqIEByZXR1cm5zIEEgcXVlcnkgYnVpbGRlciBzZWxlY3RpbmcgdXNlZCBibG9ja3NcbiAgICovXG4gIGNyZWF0ZVVzZWRCbG9ja3NRdWVyeSA9IChcbiAgICBleHRyYWN0b3JJZDogc3RyaW5nLFxuICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8UGVybWl0RW50aXR5PiA9PiB7XG4gICAgcmV0dXJuIHRoaXMucGVybWl0UmVwb3NpdG9yeVxuICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigncGVybWl0RW50aXR5JylcbiAgICAgIC5zZWxlY3QoJ3Blcm1pdEVudGl0eS5ibG9jaycsICdibG9jaycpXG4gICAgICAud2hlcmUoJ3Blcm1pdEVudGl0eS5leHRyYWN0b3IgPSA6ZXh0cmFjdG9ySWQnLCB7IGV4dHJhY3RvcklkIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBQZXJtaXRBY3Rpb247XG4iXX0=
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWl0QWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FjdGlvbnMvcGVybWl0QWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBS3pFLE9BQU8sWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBR3BELE1BQU0sWUFBYSxTQUFRLHFCQUcxQjtJQUNDLFlBQVksVUFBc0IsRUFBRSxNQUF1QjtRQUN6RCxLQUFLLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08sWUFBWSxHQUFHLENBQ3ZCLE9BQTBCLEVBQzFCLEtBQWdCLEVBQ2hCLFNBQWlCLEVBQ2dCLEVBQUU7UUFDbkMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLEdBQUcsTUFBTTtZQUNULEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNqQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsU0FBUztZQUNULEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztZQUNmLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUk7WUFDckMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSTtTQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDTyxtQkFBbUIsR0FBRyxDQUM5QixRQUF3QixFQUNMLEVBQUU7UUFDckIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0NBQ0g7QUFFRCxlQUFlLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0RXJnb0JveEFjdGlvbiB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtZXh0cmFjdG9yJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCBQZXJtaXRFbnRpdHkgZnJvbSAnLi4vZW50aXRpZXMvcGVybWl0RW50aXR5JztcbmltcG9ydCB7IEV4dHJhY3RlZFBlcm1pdCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXh0cmFjdGVkUGVybWl0JztcblxuY2xhc3MgUGVybWl0QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RFcmdvQm94QWN0aW9uPFxuICBFeHRyYWN0ZWRQZXJtaXQsXG4gIFBlcm1pdEVudGl0eVxuPiB7XG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgc3VwZXIoZGF0YVNvdXJjZSwgUGVybWl0RW50aXR5LCBsb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHBlcm1pdCBlbnRpdHkgZnJvbSBleHRyYWN0ZWQgZGF0YSBhbmQgYmxvY2sgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHBlcm1pdHNcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICogQHJldHVybnMgdGhlIHBlcm1pdCBlbnRpdGllcyAod2l0aG91dCB0aGUgaWQpXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRW50aXR5ID0gKFxuICAgIHBlcm1pdHM6IEV4dHJhY3RlZFBlcm1pdFtdLFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IEFycmF5PE9taXQ8UGVybWl0RW50aXR5LCAnaWQnPj4gPT4ge1xuICAgIHJldHVybiBwZXJtaXRzLm1hcCgocGVybWl0KSA9PiAoe1xuICAgICAgLi4ucGVybWl0LFxuICAgICAgYmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICBoZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgIGV4dHJhY3RvcixcbiAgICAgIFdJRDogcGVybWl0LldJRCxcbiAgICAgIHNwZW5kQmxvY2s6IHBlcm1pdC5zcGVuZEJsb2NrID8/IG51bGwsXG4gICAgICBzcGVuZEhlaWdodDogcGVybWl0LnNwZW5kSGVpZ2h0ID8/IG51bGwsXG4gICAgfSkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBjb252ZXJ0IHRoZSBkYXRhYmFzZSBlbnRpdHkgYmFjayB0byByYXcgZGF0YVxuICAgKiBAcGFyYW0gZW50aXRpZXNcbiAgICogQHJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2xsYXRlcmFsIGRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBjb252ZXJ0RW50aXR5VG9EYXRhID0gKFxuICAgIGVudGl0aWVzOiBQZXJtaXRFbnRpdHlbXSxcbiAgKTogRXh0cmFjdGVkUGVybWl0W10gPT4ge1xuICAgIHJldHVybiBlbnRpdGllcztcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGVybWl0QWN0aW9uO1xuIl19
|
|
@@ -1,13 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
extractor: string;
|
|
4
|
-
boxId: string;
|
|
5
|
-
boxSerialized: string;
|
|
1
|
+
import { AbstractErgoBoxEntity } from '@rosen-bridge/abstract-extractor';
|
|
2
|
+
declare class PermitEntity extends AbstractErgoBoxEntity {
|
|
6
3
|
WID: string;
|
|
7
|
-
block: string;
|
|
8
|
-
height: number;
|
|
9
|
-
spendBlock?: string | null;
|
|
10
|
-
spendHeight?: number | null;
|
|
11
4
|
txId: string;
|
|
12
5
|
}
|
|
13
6
|
export default PermitEntity;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permitEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/permitEntity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"permitEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/permitEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,cACM,YAAa,SAAQ,qBAAqB;IAE9C,GAAG,EAAE,MAAM,CAAC;IAGZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -7,62 +7,22 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
extractor;
|
|
14
|
-
boxId;
|
|
15
|
-
boxSerialized;
|
|
10
|
+
import { AbstractErgoBoxEntity } from '@rosen-bridge/abstract-extractor';
|
|
11
|
+
import { Column, Entity } from '@rosen-bridge/extended-typeorm';
|
|
12
|
+
let PermitEntity = class PermitEntity extends AbstractErgoBoxEntity {
|
|
16
13
|
WID;
|
|
17
|
-
block;
|
|
18
|
-
height;
|
|
19
|
-
spendBlock;
|
|
20
|
-
spendHeight;
|
|
21
14
|
txId;
|
|
22
15
|
};
|
|
23
|
-
__decorate([
|
|
24
|
-
PrimaryGeneratedColumn(),
|
|
25
|
-
__metadata("design:type", Number)
|
|
26
|
-
], PermitEntity.prototype, "id", void 0);
|
|
27
|
-
__decorate([
|
|
28
|
-
Column({ type: 'varchar' }),
|
|
29
|
-
__metadata("design:type", String)
|
|
30
|
-
], PermitEntity.prototype, "extractor", void 0);
|
|
31
|
-
__decorate([
|
|
32
|
-
Column({ type: 'varchar' }),
|
|
33
|
-
__metadata("design:type", String)
|
|
34
|
-
], PermitEntity.prototype, "boxId", void 0);
|
|
35
|
-
__decorate([
|
|
36
|
-
Column({ type: 'varchar' }),
|
|
37
|
-
__metadata("design:type", String)
|
|
38
|
-
], PermitEntity.prototype, "boxSerialized", void 0);
|
|
39
16
|
__decorate([
|
|
40
17
|
Column({ type: 'varchar' }),
|
|
41
18
|
__metadata("design:type", String)
|
|
42
19
|
], PermitEntity.prototype, "WID", void 0);
|
|
43
|
-
__decorate([
|
|
44
|
-
Column({ type: 'varchar' }),
|
|
45
|
-
__metadata("design:type", String)
|
|
46
|
-
], PermitEntity.prototype, "block", void 0);
|
|
47
|
-
__decorate([
|
|
48
|
-
Column({ type: 'int' }),
|
|
49
|
-
__metadata("design:type", Number)
|
|
50
|
-
], PermitEntity.prototype, "height", void 0);
|
|
51
|
-
__decorate([
|
|
52
|
-
Column({ nullable: true, type: 'text' }),
|
|
53
|
-
__metadata("design:type", Object)
|
|
54
|
-
], PermitEntity.prototype, "spendBlock", void 0);
|
|
55
|
-
__decorate([
|
|
56
|
-
Column({ nullable: true, type: 'int' }),
|
|
57
|
-
__metadata("design:type", Object)
|
|
58
|
-
], PermitEntity.prototype, "spendHeight", void 0);
|
|
59
20
|
__decorate([
|
|
60
21
|
Column({ type: 'varchar' }),
|
|
61
22
|
__metadata("design:type", String)
|
|
62
23
|
], PermitEntity.prototype, "txId", void 0);
|
|
63
24
|
PermitEntity = __decorate([
|
|
64
|
-
Entity('permit_entity')
|
|
65
|
-
Unique(['boxId', 'extractor'])
|
|
25
|
+
Entity('permit_entity')
|
|
66
26
|
], PermitEntity);
|
|
67
27
|
export default PermitEntity;
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWl0RW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2VudGl0aWVzL3Blcm1pdEVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR2hFLElBQU0sWUFBWSxHQUFsQixNQUFNLFlBQWEsU0FBUSxxQkFBcUI7SUFFOUMsR0FBRyxDQUFTO0lBR1osSUFBSSxDQUFTO0NBQ2QsQ0FBQTtBQUpDO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzt5Q0FDaEI7QUFHWjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7MENBQ2Y7QUFMVCxZQUFZO0lBRGpCLE1BQU0sQ0FBQyxlQUFlLENBQUM7R0FDbEIsWUFBWSxDQU1qQjtBQUVELGVBQWUsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RFcmdvQm94RW50aXR5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1leHRyYWN0b3InO1xuaW1wb3J0IHsgQ29sdW1uLCBFbnRpdHkgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuXG5ARW50aXR5KCdwZXJtaXRfZW50aXR5JylcbmNsYXNzIFBlcm1pdEVudGl0eSBleHRlbmRzIEFic3RyYWN0RXJnb0JveEVudGl0eSB7XG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgV0lEOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICB0eElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBlcm1pdEVudGl0eTtcbiJdfQ==
|