UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

137 lines (135 loc) • 17.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Transaction = exports.OPERATION_TYPE = exports.ISOLATION_LEVEL = void 0; exports.assertValidIsolationLevel = assertValidIsolationLevel; exports.isolationLevelByValue = void 0; var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer")); var _allHeaders = require("./all-headers"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /* s2.2.6.8 */ const OPERATION_TYPE = exports.OPERATION_TYPE = { TM_GET_DTC_ADDRESS: 0x00, TM_PROPAGATE_XACT: 0x01, TM_BEGIN_XACT: 0x05, TM_PROMOTE_XACT: 0x06, TM_COMMIT_XACT: 0x07, TM_ROLLBACK_XACT: 0x08, TM_SAVE_XACT: 0x09 }; const ISOLATION_LEVEL = exports.ISOLATION_LEVEL = { NO_CHANGE: 0x00, READ_UNCOMMITTED: 0x01, READ_COMMITTED: 0x02, REPEATABLE_READ: 0x03, SERIALIZABLE: 0x04, SNAPSHOT: 0x05 }; const isolationLevelByValue = exports.isolationLevelByValue = {}; for (const name in ISOLATION_LEVEL) { const value = ISOLATION_LEVEL[name]; isolationLevelByValue[value] = name; } function assertValidIsolationLevel(isolationLevel, name) { if (typeof isolationLevel !== 'number') { throw new TypeError(`The "${name}" ${name.includes('.') ? 'property' : 'argument'} must be of type number. Received type ${typeof isolationLevel} (${isolationLevel})`); } if (!Number.isInteger(isolationLevel)) { throw new RangeError(`The value of "${name}" is out of range. It must be an integer. Received: ${isolationLevel}`); } if (!(isolationLevel >= 0 && isolationLevel <= 5)) { throw new RangeError(`The value of "${name}" is out of range. It must be >= 0 && <= 5. Received: ${isolationLevel}`); } } class Transaction { constructor(name, isolationLevel = ISOLATION_LEVEL.NO_CHANGE) { this.name = name; this.isolationLevel = isolationLevel; this.outstandingRequestCount = 1; } beginPayload(txnDescriptor) { const buffer = new _writableTrackingBuffer.default(); (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount); buffer.writeUShort(OPERATION_TYPE.TM_BEGIN_XACT); buffer.writeUInt8(this.isolationLevel); buffer.writeUInt8(this.name.length * 2); buffer.writeString(this.name, 'ucs2'); return { *[Symbol.iterator]() { yield buffer.data; }, toString: () => { return 'Begin Transaction: name=' + this.name + ', isolationLevel=' + isolationLevelByValue[this.isolationLevel]; } }; } commitPayload(txnDescriptor) { const buffer = new _writableTrackingBuffer.default(); (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount); buffer.writeUShort(OPERATION_TYPE.TM_COMMIT_XACT); buffer.writeUInt8(this.name.length * 2); buffer.writeString(this.name, 'ucs2'); // No fBeginXact flag, so no new transaction is started. buffer.writeUInt8(0); return { *[Symbol.iterator]() { yield buffer.data; }, toString: () => { return 'Commit Transaction: name=' + this.name; } }; } rollbackPayload(txnDescriptor) { const buffer = new _writableTrackingBuffer.default(); (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount); buffer.writeUShort(OPERATION_TYPE.TM_ROLLBACK_XACT); buffer.writeUInt8(this.name.length * 2); buffer.writeString(this.name, 'ucs2'); // No fBeginXact flag, so no new transaction is started. buffer.writeUInt8(0); return { *[Symbol.iterator]() { yield buffer.data; }, toString: () => { return 'Rollback Transaction: name=' + this.name; } }; } savePayload(txnDescriptor) { const buffer = new _writableTrackingBuffer.default(); (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount); buffer.writeUShort(OPERATION_TYPE.TM_SAVE_XACT); buffer.writeUInt8(this.name.length * 2); buffer.writeString(this.name, 'ucs2'); return { *[Symbol.iterator]() { yield buffer.data; }, toString: () => { return 'Save Transaction: name=' + this.name; } }; } isolationLevelToTSQL() { switch (this.isolationLevel) { case ISOLATION_LEVEL.READ_UNCOMMITTED: return 'READ UNCOMMITTED'; case ISOLATION_LEVEL.READ_COMMITTED: return 'READ COMMITTED'; case ISOLATION_LEVEL.REPEATABLE_READ: return 'REPEATABLE READ'; case ISOLATION_LEVEL.SERIALIZABLE: return 'SERIALIZABLE'; case ISOLATION_LEVEL.SNAPSHOT: return 'SNAPSHOT'; } return ''; } } exports.Transaction = Transaction; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2FsbEhlYWRlcnMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJPUEVSQVRJT05fVFlQRSIsImV4cG9ydHMiLCJUTV9HRVRfRFRDX0FERFJFU1MiLCJUTV9QUk9QQUdBVEVfWEFDVCIsIlRNX0JFR0lOX1hBQ1QiLCJUTV9QUk9NT1RFX1hBQ1QiLCJUTV9DT01NSVRfWEFDVCIsIlRNX1JPTExCQUNLX1hBQ1QiLCJUTV9TQVZFX1hBQ1QiLCJJU09MQVRJT05fTEVWRUwiLCJOT19DSEFOR0UiLCJSRUFEX1VOQ09NTUlUVEVEIiwiUkVBRF9DT01NSVRURUQiLCJSRVBFQVRBQkxFX1JFQUQiLCJTRVJJQUxJWkFCTEUiLCJTTkFQU0hPVCIsImlzb2xhdGlvbkxldmVsQnlWYWx1ZSIsIm5hbWUiLCJ2YWx1ZSIsImFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwiLCJpc29sYXRpb25MZXZlbCIsIlR5cGVFcnJvciIsImluY2x1ZGVzIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiUmFuZ2VFcnJvciIsIlRyYW5zYWN0aW9uIiwiY29uc3RydWN0b3IiLCJvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCIsImJlZ2luUGF5bG9hZCIsInR4bkRlc2NyaXB0b3IiLCJidWZmZXIiLCJXcml0YWJsZVRyYWNraW5nQnVmZmVyIiwid3JpdGVUb1RyYWNraW5nQnVmZmVyIiwid3JpdGVVU2hvcnQiLCJ3cml0ZVVJbnQ4IiwibGVuZ3RoIiwid3JpdGVTdHJpbmciLCJTeW1ib2wiLCJpdGVyYXRvciIsImRhdGEiLCJ0b1N0cmluZyIsImNvbW1pdFBheWxvYWQiLCJyb2xsYmFja1BheWxvYWQiLCJzYXZlUGF5bG9hZCIsImlzb2xhdGlvbkxldmVsVG9UU1FMIl0sInNvdXJjZXMiOlsiLi4vc3JjL3RyYW5zYWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBXcml0YWJsZVRyYWNraW5nQnVmZmVyIGZyb20gJy4vdHJhY2tpbmctYnVmZmVyL3dyaXRhYmxlLXRyYWNraW5nLWJ1ZmZlcic7XG5pbXBvcnQgeyB3cml0ZVRvVHJhY2tpbmdCdWZmZXIgfSBmcm9tICcuL2FsbC1oZWFkZXJzJztcblxuLypcbiAgczIuMi42LjhcbiAqL1xuXG5leHBvcnQgY29uc3QgT1BFUkFUSU9OX1RZUEUgPSB7XG4gIFRNX0dFVF9EVENfQUREUkVTUzogMHgwMCxcbiAgVE1fUFJPUEFHQVRFX1hBQ1Q6IDB4MDEsXG4gIFRNX0JFR0lOX1hBQ1Q6IDB4MDUsXG4gIFRNX1BST01PVEVfWEFDVDogMHgwNixcbiAgVE1fQ09NTUlUX1hBQ1Q6IDB4MDcsXG4gIFRNX1JPTExCQUNLX1hBQ1Q6IDB4MDgsXG4gIFRNX1NBVkVfWEFDVDogMHgwOVxufTtcblxuZXhwb3J0IGNvbnN0IElTT0xBVElPTl9MRVZFTDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHtcbiAgTk9fQ0hBTkdFOiAweDAwLFxuICBSRUFEX1VOQ09NTUlUVEVEOiAweDAxLFxuICBSRUFEX0NPTU1JVFRFRDogMHgwMixcbiAgUkVQRUFUQUJMRV9SRUFEOiAweDAzLFxuICBTRVJJQUxJWkFCTEU6IDB4MDQsXG4gIFNOQVBTSE9UOiAweDA1XG59O1xuXG5leHBvcnQgY29uc3QgaXNvbGF0aW9uTGV2ZWxCeVZhbHVlOiB7IFtrZXk6IG51bWJlcl06IHN0cmluZyB9ID0ge307XG5mb3IgKGNvbnN0IG5hbWUgaW4gSVNPTEFUSU9OX0xFVkVMKSB7XG4gIGNvbnN0IHZhbHVlID0gSVNPTEFUSU9OX0xFVkVMW25hbWVdO1xuICBpc29sYXRpb25MZXZlbEJ5VmFsdWVbdmFsdWVdID0gbmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwoaXNvbGF0aW9uTGV2ZWw6IGFueSwgbmFtZTogc3RyaW5nKTogYXNzZXJ0cyBpc29sYXRpb25MZXZlbCBpcyAwIHwgMSB8IDIgfCAzIHwgNCB8IDUge1xuICBpZiAodHlwZW9mIGlzb2xhdGlvbkxldmVsICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBcIiR7bmFtZX1cIiAke25hbWUuaW5jbHVkZXMoJy4nKSA/ICdwcm9wZXJ0eScgOiAnYXJndW1lbnQnfSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIGlzb2xhdGlvbkxldmVsfSAoJHtpc29sYXRpb25MZXZlbH0pYCk7XG4gIH1cblxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoaXNvbGF0aW9uTGV2ZWwpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiBcIiR7bmFtZX1cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYW4gaW50ZWdlci4gUmVjZWl2ZWQ6ICR7aXNvbGF0aW9uTGV2ZWx9YCk7XG4gIH1cblxuICBpZiAoIShpc29sYXRpb25MZXZlbCA+PSAwICYmIGlzb2xhdGlvbkxldmVsIDw9IDUpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiBcIiR7bmFtZX1cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgPj0gMCAmJiA8PSA1LiBSZWNlaXZlZDogJHtpc29sYXRpb25MZXZlbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24ge1xuICBkZWNsYXJlIG5hbWU6IHN0cmluZztcbiAgZGVjbGFyZSBpc29sYXRpb25MZXZlbDogbnVtYmVyO1xuICBkZWNsYXJlIG91dHN0YW5kaW5nUmVxdWVzdENvdW50OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBpc29sYXRpb25MZXZlbCA9IElTT0xBVElPTl9MRVZFTC5OT19DSEFOR0UpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuaXNvbGF0aW9uTGV2ZWwgPSBpc29sYXRpb25MZXZlbDtcbiAgICB0aGlzLm91dHN0YW5kaW5nUmVxdWVzdENvdW50ID0gMTtcbiAgfVxuXG4gIGJlZ2luUGF5bG9hZCh0eG5EZXNjcmlwdG9yOiBCdWZmZXIpIHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigpO1xuICAgIHdyaXRlVG9UcmFja2luZ0J1ZmZlcihidWZmZXIsIHR4bkRlc2NyaXB0b3IsIHRoaXMub3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQpO1xuICAgIGJ1ZmZlci53cml0ZVVTaG9ydChPUEVSQVRJT05fVFlQRS5UTV9CRUdJTl9YQUNUKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLmlzb2xhdGlvbkxldmVsKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLm5hbWUubGVuZ3RoICogMik7XG4gICAgYnVmZmVyLndyaXRlU3RyaW5nKHRoaXMubmFtZSwgJ3VjczInKTtcblxuICAgIHJldHVybiB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkIGJ1ZmZlci5kYXRhO1xuICAgICAgfSxcbiAgICAgIHRvU3RyaW5nOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiAnQmVnaW4gVHJhbnNhY3Rpb246IG5hbWU9JyArIHRoaXMubmFtZSArICcsIGlzb2xhdGlvbkxldmVsPScgKyBpc29sYXRpb25MZXZlbEJ5VmFsdWVbdGhpcy5pc29sYXRpb25MZXZlbF07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNvbW1pdFBheWxvYWQodHhuRGVzY3JpcHRvcjogQnVmZmVyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoKTtcbiAgICB3cml0ZVRvVHJhY2tpbmdCdWZmZXIoYnVmZmVyLCB0eG5EZXNjcmlwdG9yLCB0aGlzLm91dHN0YW5kaW5nUmVxdWVzdENvdW50KTtcbiAgICBidWZmZXIud3JpdGVVU2hvcnQoT1BFUkFUSU9OX1RZUEUuVE1fQ09NTUlUX1hBQ1QpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KHRoaXMubmFtZS5sZW5ndGggKiAyKTtcbiAgICBidWZmZXIud3JpdGVTdHJpbmcodGhpcy5uYW1lLCAndWNzMicpO1xuICAgIC8vIE5vIGZCZWdpblhhY3QgZmxhZywgc28gbm8gbmV3IHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQuXG4gICAgYnVmZmVyLndyaXRlVUludDgoMCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCBidWZmZXIuZGF0YTtcbiAgICAgIH0sXG4gICAgICB0b1N0cmluZzogKCkgPT4ge1xuICAgICAgICByZXR1cm4gJ0NvbW1pdCBUcmFuc2FjdGlvbjogbmFtZT0nICsgdGhpcy5uYW1lO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByb2xsYmFja1BheWxvYWQodHhuRGVzY3JpcHRvcjogQnVmZmVyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoKTtcbiAgICB3cml0ZVRvVHJhY2tpbmdCdWZmZXIoYnVmZmVyLCB0eG5EZXNjcmlwdG9yLCB0aGlzLm91dHN0YW5kaW5nUmVxdWVzdENvdW50KTtcbiAgICBidWZmZXIud3JpdGVVU2hvcnQoT1BFUkFUSU9OX1RZUEUuVE1fUk9MTEJBQ0tfWEFDVCk7XG4gICAgYnVmZmVyLndyaXRlVUludDgodGhpcy5uYW1lLmxlbmd0aCAqIDIpO1xuICAgIGJ1ZmZlci53cml0ZVN0cmluZyh0aGlzLm5hbWUsICd1Y3MyJyk7XG4gICAgLy8gTm8gZkJlZ2luWGFjdCBmbGFnLCBzbyBubyBuZXcgdHJhbnNhY3Rpb24gaXMgc3RhcnRlZC5cbiAgICBidWZmZXIud3JpdGVVSW50OCgwKTtcblxuICAgIHJldHVybiB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkIGJ1ZmZlci5kYXRhO1xuICAgICAgfSxcbiAgICAgIHRvU3RyaW5nOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiAnUm9sbGJhY2sgVHJhbnNhY3Rpb246IG5hbWU9JyArIHRoaXMubmFtZTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2F2ZVBheWxvYWQodHhuRGVzY3JpcHRvcjogQnVmZmVyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoKTtcbiAgICB3cml0ZVRvVHJhY2tpbmdCdWZmZXIoYnVmZmVyLCB0eG5EZXNjcmlwdG9yLCB0aGlzLm91dHN0YW5kaW5nUmVxdWVzdENvdW50KTtcbiAgICBidWZmZXIud3JpdGVVU2hvcnQoT1BFUkFUSU9OX1RZUEUuVE1fU0FWRV9YQUNUKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLm5hbWUubGVuZ3RoICogMik7XG4gICAgYnVmZmVyLndyaXRlU3RyaW5nKHRoaXMubmFtZSwgJ3VjczInKTtcblxuICAgIHJldHVybiB7XG4gICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkIGJ1ZmZlci5kYXRhO1xuICAgICAgfSxcbiAgICAgIHRvU3RyaW5nOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiAnU2F2ZSBUcmFuc2FjdGlvbjogbmFtZT0nICsgdGhpcy5uYW1lO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBpc29sYXRpb25MZXZlbFRvVFNRTCgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlJFQURfVU5DT01NSVRURUQ6XG4gICAgICAgIHJldHVybiAnUkVBRCBVTkNPTU1JVFRFRCc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5SRUFEX0NPTU1JVFRFRDpcbiAgICAgICAgcmV0dXJuICdSRUFEIENPTU1JVFRFRCc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5SRVBFQVRBQkxFX1JFQUQ6XG4gICAgICAgIHJldHVybiAnUkVQRUFUQUJMRSBSRUFEJztcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlNFUklBTElaQUJMRTpcbiAgICAgICAgcmV0dXJuICdTRVJJQUxJWkFCTEUnO1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuU05BUFNIT1Q6XG4gICAgICAgIHJldHVybiAnU05BUFNIT1QnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSx1QkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQXNELFNBQUFELHVCQUFBRyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRXREO0FBQ0E7QUFDQTs7QUFFTyxNQUFNRyxjQUFjLEdBQUFDLE9BQUEsQ0FBQUQsY0FBQSxHQUFHO0VBQzVCRSxrQkFBa0IsRUFBRSxJQUFJO0VBQ3hCQyxpQkFBaUIsRUFBRSxJQUFJO0VBQ3ZCQyxhQUFhLEVBQUUsSUFBSTtFQUNuQkMsZUFBZSxFQUFFLElBQUk7RUFDckJDLGNBQWMsRUFBRSxJQUFJO0VBQ3BCQyxnQkFBZ0IsRUFBRSxJQUFJO0VBQ3RCQyxZQUFZLEVBQUU7QUFDaEIsQ0FBQztBQUVNLE1BQU1DLGVBQTBDLEdBQUFSLE9BQUEsQ0FBQVEsZUFBQSxHQUFHO0VBQ3hEQyxTQUFTLEVBQUUsSUFBSTtFQUNmQyxnQkFBZ0IsRUFBRSxJQUFJO0VBQ3RCQyxjQUFjLEVBQUUsSUFBSTtFQUNwQkMsZUFBZSxFQUFFLElBQUk7RUFDckJDLFlBQVksRUFBRSxJQUFJO0VBQ2xCQyxRQUFRLEVBQUU7QUFDWixDQUFDO0FBRU0sTUFBTUMscUJBQWdELEdBQUFmLE9BQUEsQ0FBQWUscUJBQUEsR0FBRyxDQUFDLENBQUM7QUFDbEUsS0FBSyxNQUFNQyxJQUFJLElBQUlSLGVBQWUsRUFBRTtFQUNsQyxNQUFNUyxLQUFLLEdBQUdULGVBQWUsQ0FBQ1EsSUFBSSxDQUFDO0VBQ25DRCxxQkFBcUIsQ0FBQ0UsS0FBSyxDQUFDLEdBQUdELElBQUk7QUFDckM7QUFFTyxTQUFTRSx5QkFBeUJB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