1 | /**
|
---|
2 | * @license
|
---|
3 | * Copyright Google LLC All Rights Reserved.
|
---|
4 | *
|
---|
5 | * Use of this source code is governed by an MIT-style license that can be
|
---|
6 | * found in the LICENSE file at https://angular.io/license
|
---|
7 | */
|
---|
8 | (function (factory) {
|
---|
9 | if (typeof module === "object" && typeof module.exports === "object") {
|
---|
10 | var v = factory(require, exports);
|
---|
11 | if (v !== undefined) module.exports = v;
|
---|
12 | }
|
---|
13 | else if (typeof define === "function" && define.amd) {
|
---|
14 | define("@angular/compiler/src/i18n/big_integer", ["require", "exports"], factory);
|
---|
15 | }
|
---|
16 | })(function (require, exports) {
|
---|
17 | "use strict";
|
---|
18 | Object.defineProperty(exports, "__esModule", { value: true });
|
---|
19 | exports.BigIntExponentiation = exports.BigIntForMultiplication = exports.BigInteger = void 0;
|
---|
20 | /**
|
---|
21 | * Represents a big integer using a buffer of its individual digits, with the least significant
|
---|
22 | * digit stored at the beginning of the array (little endian).
|
---|
23 | *
|
---|
24 | * For performance reasons, each instance is mutable. The addition operation can be done in-place
|
---|
25 | * to reduce memory pressure of allocation for the digits array.
|
---|
26 | */
|
---|
27 | var BigInteger = /** @class */ (function () {
|
---|
28 | /**
|
---|
29 | * Creates a big integer using its individual digits in little endian storage.
|
---|
30 | */
|
---|
31 | function BigInteger(digits) {
|
---|
32 | this.digits = digits;
|
---|
33 | }
|
---|
34 | BigInteger.zero = function () {
|
---|
35 | return new BigInteger([0]);
|
---|
36 | };
|
---|
37 | BigInteger.one = function () {
|
---|
38 | return new BigInteger([1]);
|
---|
39 | };
|
---|
40 | /**
|
---|
41 | * Creates a clone of this instance.
|
---|
42 | */
|
---|
43 | BigInteger.prototype.clone = function () {
|
---|
44 | return new BigInteger(this.digits.slice());
|
---|
45 | };
|
---|
46 | /**
|
---|
47 | * Returns a new big integer with the sum of `this` and `other` as its value. This does not mutate
|
---|
48 | * `this` but instead returns a new instance, unlike `addToSelf`.
|
---|
49 | */
|
---|
50 | BigInteger.prototype.add = function (other) {
|
---|
51 | var result = this.clone();
|
---|
52 | result.addToSelf(other);
|
---|
53 | return result;
|
---|
54 | };
|
---|
55 | /**
|
---|
56 | * Adds `other` to the instance itself, thereby mutating its value.
|
---|
57 | */
|
---|
58 | BigInteger.prototype.addToSelf = function (other) {
|
---|
59 | var maxNrOfDigits = Math.max(this.digits.length, other.digits.length);
|
---|
60 | var carry = 0;
|
---|
61 | for (var i = 0; i < maxNrOfDigits; i++) {
|
---|
62 | var digitSum = carry;
|
---|
63 | if (i < this.digits.length) {
|
---|
64 | digitSum += this.digits[i];
|
---|
65 | }
|
---|
66 | if (i < other.digits.length) {
|
---|
67 | digitSum += other.digits[i];
|
---|
68 | }
|
---|
69 | if (digitSum >= 10) {
|
---|
70 | this.digits[i] = digitSum - 10;
|
---|
71 | carry = 1;
|
---|
72 | }
|
---|
73 | else {
|
---|
74 | this.digits[i] = digitSum;
|
---|
75 | carry = 0;
|
---|
76 | }
|
---|
77 | }
|
---|
78 | // Apply a remaining carry if needed.
|
---|
79 | if (carry > 0) {
|
---|
80 | this.digits[maxNrOfDigits] = 1;
|
---|
81 | }
|
---|
82 | };
|
---|
83 | /**
|
---|
84 | * Builds the decimal string representation of the big integer. As this is stored in
|
---|
85 | * little endian, the digits are concatenated in reverse order.
|
---|
86 | */
|
---|
87 | BigInteger.prototype.toString = function () {
|
---|
88 | var res = '';
|
---|
89 | for (var i = this.digits.length - 1; i >= 0; i--) {
|
---|
90 | res += this.digits[i];
|
---|
91 | }
|
---|
92 | return res;
|
---|
93 | };
|
---|
94 | return BigInteger;
|
---|
95 | }());
|
---|
96 | exports.BigInteger = BigInteger;
|
---|
97 | /**
|
---|
98 | * Represents a big integer which is optimized for multiplication operations, as its power-of-twos
|
---|
99 | * are memoized. See `multiplyBy()` for details on the multiplication algorithm.
|
---|
100 | */
|
---|
101 | var BigIntForMultiplication = /** @class */ (function () {
|
---|
102 | function BigIntForMultiplication(value) {
|
---|
103 | this.powerOfTwos = [value];
|
---|
104 | }
|
---|
105 | /**
|
---|
106 | * Returns the big integer itself.
|
---|
107 | */
|
---|
108 | BigIntForMultiplication.prototype.getValue = function () {
|
---|
109 | return this.powerOfTwos[0];
|
---|
110 | };
|
---|
111 | /**
|
---|
112 | * Computes the value for `num * b`, where `num` is a JS number and `b` is a big integer. The
|
---|
113 | * value for `b` is represented by a storage model that is optimized for this computation.
|
---|
114 | *
|
---|
115 | * This operation is implemented in N(log2(num)) by continuous halving of the number, where the
|
---|
116 | * least-significant bit (LSB) is tested in each iteration. If the bit is set, the bit's index is
|
---|
117 | * used as exponent into the power-of-two multiplication of `b`.
|
---|
118 | *
|
---|
119 | * As an example, consider the multiplication num=42, b=1337. In binary 42 is 0b00101010 and the
|
---|
120 | * algorithm unrolls into the following iterations:
|
---|
121 | *
|
---|
122 | * Iteration | num | LSB | b * 2^iter | Add? | product
|
---|
123 | * -----------|------------|------|------------|------|--------
|
---|
124 | * 0 | 0b00101010 | 0 | 1337 | No | 0
|
---|
125 | * 1 | 0b00010101 | 1 | 2674 | Yes | 2674
|
---|
126 | * 2 | 0b00001010 | 0 | 5348 | No | 2674
|
---|
127 | * 3 | 0b00000101 | 1 | 10696 | Yes | 13370
|
---|
128 | * 4 | 0b00000010 | 0 | 21392 | No | 13370
|
---|
129 | * 5 | 0b00000001 | 1 | 42784 | Yes | 56154
|
---|
130 | * 6 | 0b00000000 | 0 | 85568 | No | 56154
|
---|
131 | *
|
---|
132 | * The computed product of 56154 is indeed the correct result.
|
---|
133 | *
|
---|
134 | * The `BigIntForMultiplication` representation for a big integer provides memoized access to the
|
---|
135 | * power-of-two values to reduce the workload in computing those values.
|
---|
136 | */
|
---|
137 | BigIntForMultiplication.prototype.multiplyBy = function (num) {
|
---|
138 | var product = BigInteger.zero();
|
---|
139 | this.multiplyByAndAddTo(num, product);
|
---|
140 | return product;
|
---|
141 | };
|
---|
142 | /**
|
---|
143 | * See `multiplyBy()` for details. This function allows for the computed product to be added
|
---|
144 | * directly to the provided result big integer.
|
---|
145 | */
|
---|
146 | BigIntForMultiplication.prototype.multiplyByAndAddTo = function (num, result) {
|
---|
147 | for (var exponent = 0; num !== 0; num = num >>> 1, exponent++) {
|
---|
148 | if (num & 1) {
|
---|
149 | var value = this.getMultipliedByPowerOfTwo(exponent);
|
---|
150 | result.addToSelf(value);
|
---|
151 | }
|
---|
152 | }
|
---|
153 | };
|
---|
154 | /**
|
---|
155 | * Computes and memoizes the big integer value for `this.number * 2^exponent`.
|
---|
156 | */
|
---|
157 | BigIntForMultiplication.prototype.getMultipliedByPowerOfTwo = function (exponent) {
|
---|
158 | // Compute the powers up until the requested exponent, where each value is computed from its
|
---|
159 | // predecessor. This is simple as `this.number * 2^(exponent - 1)` only has to be doubled (i.e.
|
---|
160 | // added to itself) to reach `this.number * 2^exponent`.
|
---|
161 | for (var i = this.powerOfTwos.length; i <= exponent; i++) {
|
---|
162 | var previousPower = this.powerOfTwos[i - 1];
|
---|
163 | this.powerOfTwos[i] = previousPower.add(previousPower);
|
---|
164 | }
|
---|
165 | return this.powerOfTwos[exponent];
|
---|
166 | };
|
---|
167 | return BigIntForMultiplication;
|
---|
168 | }());
|
---|
169 | exports.BigIntForMultiplication = BigIntForMultiplication;
|
---|
170 | /**
|
---|
171 | * Represents an exponentiation operation for the provided base, of which exponents are computed and
|
---|
172 | * memoized. The results are represented by a `BigIntForMultiplication` which is tailored for
|
---|
173 | * multiplication operations by memoizing the power-of-twos. This effectively results in a matrix
|
---|
174 | * representation that is lazily computed upon request.
|
---|
175 | */
|
---|
176 | var BigIntExponentiation = /** @class */ (function () {
|
---|
177 | function BigIntExponentiation(base) {
|
---|
178 | this.base = base;
|
---|
179 | this.exponents = [new BigIntForMultiplication(BigInteger.one())];
|
---|
180 | }
|
---|
181 | /**
|
---|
182 | * Compute the value for `this.base^exponent`, resulting in a big integer that is optimized for
|
---|
183 | * further multiplication operations.
|
---|
184 | */
|
---|
185 | BigIntExponentiation.prototype.toThePowerOf = function (exponent) {
|
---|
186 | // Compute the results up until the requested exponent, where every value is computed from its
|
---|
187 | // predecessor. This is because `this.base^(exponent - 1)` only has to be multiplied by `base`
|
---|
188 | // to reach `this.base^exponent`.
|
---|
189 | for (var i = this.exponents.length; i <= exponent; i++) {
|
---|
190 | var value = this.exponents[i - 1].multiplyBy(this.base);
|
---|
191 | this.exponents[i] = new BigIntForMultiplication(value);
|
---|
192 | }
|
---|
193 | return this.exponents[exponent];
|
---|
194 | };
|
---|
195 | return BigIntExponentiation;
|
---|
196 | }());
|
---|
197 | exports.BigIntExponentiation = BigIntExponentiation;
|
---|
198 | });
|
---|
199 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlnX2ludGVnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvaTE4bi9iaWdfaW50ZWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7SUFFSDs7Ozs7O09BTUc7SUFDSDtRQVNFOztXQUVHO1FBQ0gsb0JBQXFDLE1BQWdCO1lBQWhCLFdBQU0sR0FBTixNQUFNLENBQVU7UUFBRyxDQUFDO1FBWGxELGVBQUksR0FBWDtZQUNFLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFTSxjQUFHLEdBQVY7WUFDRSxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBT0Q7O1dBRUc7UUFDSCwwQkFBSyxHQUFMO1lBQ0UsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVEOzs7V0FHRztRQUNILHdCQUFHLEdBQUgsVUFBSSxLQUFpQjtZQUNuQixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQ7O1dBRUc7UUFDSCw4QkFBUyxHQUFULFVBQVUsS0FBaUI7WUFDekIsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxh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QyxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN4RDtZQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0gsOEJBQUM7SUFBRCxDQUFDLEFBM0VELElBMkVDO0lBM0VZLDBEQUF1QjtJQTZFcEM7Ozs7O09BS0c7SUFDSDtRQUdFLDhCQUE2QixJQUFZO1lBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtZQUZ4QixjQUFTLEdBQUcsQ0FBQyxJQUFJLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFakMsQ0FBQztRQUU3Qzs7O1dBR0c7UUFDSCwyQ0FBWSxHQUFaLFVBQWEsUUFBZ0I7WUFDM0IsOEZBQThGO1lBQzlGLDhGQUE4RjtZQUM5RixpQ0FBaUM7WUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0RCxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEQ7WUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNILDJCQUFDO0lBQUQsQ0FBQyxBQW5CRCxJQW1CQztJQW5CWSxvREFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgYmlnIGludGVnZXIgdXNpbmcgYSBidWZmZXIgb2YgaXRzIGluZGl2aWR1YWwgZGlnaXRzLCB3aXRoIHRoZSBsZWFzdCBzaWduaWZpY2FudFxuICogZGlnaXQgc3RvcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IChsaXR0bGUgZW5kaWFuKS5cbiAqXG4gKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgZWFjaCBpbnN0YW5jZSBpcyBtdXRhYmxlLiBUaGUgYWRkaXRpb24gb3BlcmF0aW9uIGNhbiBiZSBkb25lIGluLXBsYWNlXG4gKiB0byByZWR1Y2UgbWVtb3J5IHByZXNzdXJlIG9mIGFsbG9jYXRpb24gZm9yIHRoZSBkaWdpdHMgYXJyYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBCaWdJbnRlZ2VyIHtcbiAgc3RhdGljIHplcm8oKTogQmlnSW50ZWdlciB7XG4gICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKFswXSk7XG4gIH1cblxuICBzdGF0aWMgb25lKCk6IEJpZ0ludGVnZXIge1xuICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcihbMV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBiaWcgaW50ZWdlciB1c2luZyBpdHMgaW5kaXZpZHVhbCBkaWdpdHMgaW4gbGl0dGxlIGVuZGlhbiBzdG9yYWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRpZ2l0czogbnVtYmVyW10pIHt9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxuICAgKi9cbiAgY2xvbmUoKTogQmlnSW50ZWdlciB7XG4gICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHRoaXMuZGlnaXRzLnNsaWNlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgYmlnIGludGVnZXIgd2l0aCB0aGUgc3VtIG9mIGB0aGlzYCBhbmQgYG90aGVyYCBhcyBpdHMgdmFsdWUuIFRoaXMgZG9lcyBub3QgbXV0YXRlXG4gICAqIGB0aGlzYCBidXQgaW5zdGVhZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlLCB1bmxpa2UgYGFkZFRvU2VsZmAuXG4gICAqL1xuICBhZGQob3RoZXI6IEJpZ0ludGVnZXIpOiBCaWdJbnRlZ2VyIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgcmVzdWx0LmFkZFRvU2VsZihvdGhlcik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGBvdGhlcmAgdG8gdGhlIGluc3RhbmNlIGl0c2VsZiwgdGhlcmVieSBtdXRhdGluZyBpdHMgdmFsdWUuXG4gICAqL1xuICBhZGRUb1NlbGYob3RoZXI6IEJpZ0ludGVnZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtYXhOck9mRGlnaXRzID0gTWF0aC5tYXgodGhpcy5kaWdpdHMubGVuZ3RoLCBvdGhlci5kaWdpdHMubGVuZ3RoKTtcbiAgICBsZXQgY2FycnkgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4TnJPZkRpZ2l0czsgaSsrKSB7XG4gICAgICBsZXQgZGlnaXRTdW0gPSBjYXJyeTtcbiAgICAgIGlmIChpIDwgdGhpcy5kaWdpdHMubGVuZ3RoKSB7XG4gICAgICAgIGRpZ2l0U3VtICs9IHRoaXMuZGlnaXRzW2ldO1xuICAgICAgfVxuICAgICAgaWYgKGkgPCBvdGhlci5kaWdpdHMubGVuZ3RoKSB7XG4gICAgICAgIGRpZ2l0U3VtICs9IG90aGVyLmRpZ2l0c1tpXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZ2l0U3VtID49IDEwKSB7XG4gICAgICAgIHRoaXMuZGlnaXRzW2ldID0gZGlnaXRTdW0gLSAxMDtcbiAgICAgICAgY2FycnkgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaWdpdHNbaV0gPSBkaWdpdFN1bTtcbiAgICAgICAgY2FycnkgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGx5IGEgcmVtYWluaW5nIGNhcnJ5IGlmIG5lZWRlZC5cbiAgICBpZiAoY2FycnkgPiAwKSB7XG4gICAgICB0aGlzLmRpZ2l0c1ttYXhOck9mRGlnaXRzXSA9IDE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpZyBpbnRlZ2VyLiBBcyB0aGlzIGlzIHN0b3JlZCBpblxuICAgKiBsaXR0bGUgZW5kaWFuLCB0aGUgZGlnaXRzIGFyZSBjb25jYXRlbmF0ZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICovXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmRpZ2l0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgcmVzICs9IHRoaXMuZGlnaXRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGJpZyBpbnRlZ2VyIHdoaWNoIGlzIG9wdGltaXplZCBmb3IgbXVsdGlwbGljYXRpb24gb3BlcmF0aW9ucywgYXMgaXRzIHBvd2VyLW9mLXR3b3NcbiAqIGFyZSBtZW1vaXplZC4gU2VlIGBtdWx0aXBseUJ5KClgIGZvciBkZXRhaWxzIG9uIHRoZSBtdWx0aXBsaWNhdGlvbiBhbGdvcml0aG0uXG4gKi9cbmV4cG9ydCBjbGFzcyBCaWdJbnRGb3JNdWx0aXBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKiBTdG9yZXMgYWxsIG1lbW9pemVkIHBvd2VyLW9mLXR3b3MsIHdoZXJlIGVhY2ggaW5kZXggcmVwcmVzZW50cyBgdGhpcy5udW1iZXIgKiAyXmluZGV4YC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcG93ZXJPZlR3b3M6IEJpZ0ludGVnZXJbXTtcblxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogQmlnSW50ZWdlcikge1xuICAgIHRoaXMucG93ZXJPZlR3b3MgPSBbdmFsdWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJpZyBpbnRlZ2VyIGl0c2VsZi5cbiAgICovXG4gIGdldFZhbHVlKCk6IEJpZ0ludGVnZXIge1xuICAgIHJldHVybiB0aGlzLnBvd2VyT2ZUd29zWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSB2YWx1ZSBmb3IgYG51bSAqIGJgLCB3aGVyZSBgbnVtYCBpcyBhIEpTIG51bWJlciBhbmQgYGJgIGlzIGEgYmlnIGludGVnZXIuIFRoZVxuICAgKiB2YWx1ZSBmb3IgYGJgIGlzIHJlcHJlc2VudGVkIGJ5IGEgc3RvcmFnZSBtb2RlbCB0aGF0IGlzIG9wdGltaXplZCBmb3IgdGhpcyBjb21wdXRhdGlvbi5cbiAgICpcbiAgICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gTihsb2cyKG51bSkpIGJ5IGNvbnRpbnVvdXMgaGFsdmluZyBvZiB0aGUgbnVtYmVyLCB3aGVyZSB0aGVcbiAgICogbGVhc3Qtc2lnbmlmaWNhbnQgYml0IChMU0IpIGlzIHRlc3RlZCBpbiBlYWNoIGl0ZXJhdGlvbi4gSWYgdGhlIGJpdCBpcyBzZXQsIHRoZSBiaXQncyBpbmRleCBpc1xuICAgKiB1c2VkIGFzIGV4cG9uZW50IGludG8gdGhlIHBvd2VyLW9mLXR3byBtdWx0aXBsaWNhdGlvbiBvZiBgYmAuXG4gICAqXG4gICAqIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBtdWx0aXBsaWNhdGlvbiBudW09NDIsIGI9MTMzNy4gSW4gYmluYXJ5IDQyIGlzIDBiMDAxMDEwMTAgYW5kIHRoZVxuICAgKiBhbGdvcml0aG0gdW5yb2xscyBpbnRvIHRoZSBmb2xsb3dpbmcgaXRlcmF0aW9uczpcbiAgICpcbiAgICogIEl0ZXJhdGlvbiB8IG51bSAgICAgICAgfCBMU0IgIHwgYiAqIDJeaXRlciB8IEFkZD8gfCBwcm9kdWN0XG4gICAqIC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLVxuICAgKiAgMCAgICAgICAgIHwgMGIwMDEwMTAxMCB8IDAgICAgfCAxMzM3ICAgICAgIHwgTm8gICB8IDBcbiAgICogIDEgICAgICAgICB8IDBiMDAwMTAxMDEgfCAxICAgIHwgMjY3NCAgICAgICB8IFllcyAgfCAyNjc0XG4gICAqICAyICAgICAgICAgfCAwYjAwMDAxMDEwIHwgMCAgICB8IDUzNDggICAgICAgfCBObyAgIHwgMjY3NFxuICAgKiAgMyAgICAgICAgIHwgMGIwMDAwMDEwMSB8IDEgICAgfCAxMDY5NiAgICAgIHwgWWVzICB8IDEzMzcwXG4gICAqICA0ICAgICAgICAgfCAwYjAwMDAwMDEwIHwgMCAgICB8IDIxMzkyICAgICAgfCBObyAgIHwgMTMzNzBcbiAgICogIDUgICAgICAgICB8IDBiMDAwMDAwMDEgfCAxICAgIHwgNDI3ODQgICAgICB8IFllcyAgfCA1NjE1NFxuICAgKiAgNiAgICAgICAgIHwgMGIwMDAwMDAwMCB8IDAgICAgfCA4NTU2OCAgICAgIHwgTm8gICB8IDU2MTU0XG4gICAqXG4gICAqIFRoZSBjb21wdXRlZCBwcm9kdWN0IG9mIDU2MTU0IGlzIGluZGVlZCB0aGUgY29ycmVjdCByZXN1bHQuXG4gICAqXG4gICAqIFRoZSBgQmlnSW50Rm9yTXVsdGlwbGljYXRpb25gIHJlcHJlc2VudGF0aW9uIGZvciBhIGJpZyBpbnRlZ2VyIHByb3ZpZGVzIG1lbW9pemVkIGFjY2VzcyB0byB0aGVcbiAgICogcG93ZXItb2YtdHdvIHZhbHVlcyB0byByZWR1Y2UgdGhlIHdvcmtsb2FkIGluIGNvbXB1dGluZyB0aG9zZSB2YWx1ZXMuXG4gICAqL1xuICBtdWx0aXBseUJ5KG51bTogbnVtYmVyKTogQmlnSW50ZWdlciB7XG4gICAgY29uc3QgcHJvZHVjdCA9IEJpZ0ludGVnZXIuemVybygpO1xuICAgIHRoaXMubXVsdGlwbHlCeUFuZEFkZFRvKG51bSwgcHJvZHVjdCk7XG4gICAgcmV0dXJuIHByb2R1Y3Q7XG4gIH1cblxuICAvKipcbiAgICogU2VlIGBtdWx0aXBseUJ5KClgIGZvciBkZXRhaWxzLiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBmb3IgdGhlIGNvbXB1dGVkIHByb2R1Y3QgdG8gYmUgYWRkZWRcbiAgICogZGlyZWN0bHkgdG8gdGhlIHByb3ZpZGVkIHJlc3VsdCBiaWcgaW50ZWdlci5cbiAgICovXG4gIG11bHRpcGx5QnlBbmRBZGRUbyhudW06IG51bWJlciwgcmVzdWx0OiBCaWdJbnRlZ2VyKTogdm9pZCB7XG4gICAgZm9yIChsZXQgZXhwb25lbnQgPSAwOyBudW0gIT09IDA7IG51bSA9IG51bSA+Pj4gMSwgZXhwb25lbnQrKykge1xuICAgICAgaWYgKG51bSAmIDEpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE11bHRpcGxpZWRCeVBvd2VyT2ZUd28oZXhwb25lbnQpO1xuICAgICAgICByZXN1bHQuYWRkVG9TZWxmKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgYW5kIG1lbW9pemVzIHRoZSBiaWcgaW50ZWdlciB2YWx1ZSBmb3IgYHRoaXMubnVtYmVyICogMl5leHBvbmVudGAuXG4gICAqL1xuICBwcml2YXRlIGdldE11bHRpcGxpZWRCeVBvd2VyT2ZUd28oZXhwb25lbnQ6IG51bWJlcik6IEJpZ0ludGVnZXIge1xuICAgIC8vIENvbXB1dGUgdGhlIHBvd2VycyB1cCB1bnRpbCB0aGUgcmVxdWVzdGVkIGV4cG9uZW50LCB3aGVyZSBlYWNoIHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gaXRzXG4gICAgLy8gcHJlZGVjZXNzb3IuIFRoaXMgaXMgc2ltcGxlIGFzIGB0aGlzLm51bWJlciAqIDJeKGV4cG9uZW50IC0gMSlgIG9ubHkgaGFzIHRvIGJlIGRvdWJsZWQgKGkuZS5cbiAgICAvLyBhZGRlZCB0byBpdHNlbGYpIHRvIHJlYWNoIGB0aGlzLm51bWJlciAqIDJeZXhwb25lbnRgLlxuICAgIGZvciAobGV0IGkgPSB0aGlzLnBvd2VyT2ZUd29zLmxlbmd0aDsgaSA8PSBleHBvbmVudDsgaSsrKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1Bvd2VyID0gdGhpcy5wb3dlck9mVHdvc1tpIC0gMV07XG4gICAgICB0aGlzLnBvd2VyT2ZUd29zW2ldID0gcHJldmlvdXNQb3dlci5hZGQocHJldmlvdXNQb3dlcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBvd2VyT2ZUd29zW2V4cG9uZW50XTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXhwb25lbnRpYXRpb24gb3BlcmF0aW9uIGZvciB0aGUgcHJvdmlkZWQgYmFzZSwgb2Ygd2hpY2ggZXhwb25lbnRzIGFyZSBjb21wdXRlZCBhbmRcbiAqIG1lbW9pemVkLiBUaGUgcmVzdWx0cyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBgQmlnSW50Rm9yTXVsdGlwbGljYXRpb25gIHdoaWNoIGlzIHRhaWxvcmVkIGZvclxuICogbXVsdGlwbGljYXRpb24gb3BlcmF0aW9ucyBieSBtZW1vaXppbmcgdGhlIHBvd2VyLW9mLXR3b3MuIFRoaXMgZWZmZWN0aXZlbHkgcmVzdWx0cyBpbiBhIG1hdHJpeFxuICogcmVwcmVzZW50YXRpb24gdGhhdCBpcyBsYXppbHkgY29tcHV0ZWQgdXBvbiByZXF1ZXN0LlxuICovXG5leHBvcnQgY2xhc3MgQmlnSW50RXhwb25lbnRpYXRpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IGV4cG9uZW50cyA9IFtuZXcgQmlnSW50Rm9yTXVsdGlwbGljYXRpb24oQmlnSW50ZWdlci5vbmUoKSldO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYmFzZTogbnVtYmVyKSB7fVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSB2YWx1ZSBmb3IgYHRoaXMuYmFzZV5leHBvbmVudGAsIHJlc3VsdGluZyBpbiBhIGJpZyBpbnRlZ2VyIHRoYXQgaXMgb3B0aW1pemVkIGZvclxuICAgKiBmdXJ0aGVyIG11bHRpcGxpY2F0aW9uIG9wZXJhdGlvbnMuXG4gICAqL1xuICB0b1RoZVBvd2VyT2YoZXhwb25lbnQ6IG51bWJlcik6IEJpZ0ludEZvck11bHRpcGxpY2F0aW9uIHtcbiAgICAvLyBDb21wdXRlIHRoZSByZXN1bHRzIHVwIHVudGlsIHRoZSByZXF1ZXN0ZWQgZXhwb25lbnQsIHdoZXJlIGV2ZXJ5IHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gaXRzXG4gICAgLy8gcHJlZGVjZXNzb3IuIFRoaXMgaXMgYmVjYXVzZSBgdGhpcy5iYXNlXihleHBvbmVudCAtIDEpYCBvbmx5IGhhcyB0byBiZSBtdWx0aXBsaWVkIGJ5IGBiYXNlYFxuICAgIC8vIHRvIHJlYWNoIGB0aGlzLmJhc2VeZXhwb25lbnRgLlxuICAgIGZvciAobGV0IGkgPSB0aGlzLmV4cG9uZW50cy5sZW5ndGg7IGkgPD0gZXhwb25lbnQ7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cG9uZW50c1tpIC0gMV0ubXVsdGlwbHlCeSh0aGlzLmJhc2UpO1xuICAgICAgdGhpcy5leHBvbmVudHNbaV0gPSBuZXcgQmlnSW50Rm9yTXVsdGlwbGljYXRpb24odmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leHBvbmVudHNbZXhwb25lbnRdO1xuICB9XG59XG4iXX0= |
---|