1 | /**
|
2 | * @license
|
3 | * Copyright 2020 Google LLC. All Rights Reserved.
|
4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | * you may not use this file except in compliance with the License.
|
6 | * You may obtain a copy of the License at
|
7 | *
|
8 | * http://www.apache.org/licenses/LICENSE-2.0
|
9 | *
|
10 | * Unless required by applicable law or agreed to in writing, software
|
11 | * distributed under the License is distributed on an "AS IS" BASIS,
|
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13 | * See the License for the specific language governing permissions and
|
14 | * limitations under the License.
|
15 | * =============================================================================
|
16 | */
|
17 | import * as tf from '../index';
|
18 | import { ALL_ENVS, describeWithFlags } from '../jasmine_util';
|
19 | import { expectArrayInMeanStdRange, jarqueBeraNormalityTest } from './rand_util';
|
20 | describeWithFlags('randomNormal', ALL_ENVS, () => {
|
21 | const SEED = 2002;
|
22 | const EPSILON = 0.05;
|
23 | it('should return a float32 1D of random normal values', async () => {
|
24 | const SAMPLES = 10000;
|
25 | // Ensure defaults to float32.
|
26 | let result = tf.randomNormal([SAMPLES], 0, 0.5, null, SEED);
|
27 | expect(result.dtype).toBe('float32');
|
28 | expect(result.shape).toEqual([SAMPLES]);
|
29 | jarqueBeraNormalityTest(await result.data());
|
30 | expectArrayInMeanStdRange(await result.data(), 0, 0.5, EPSILON);
|
31 | result = tf.randomNormal([SAMPLES], 0, 1.5, 'float32', SEED);
|
32 | expect(result.dtype).toBe('float32');
|
33 | expect(result.shape).toEqual([SAMPLES]);
|
34 | jarqueBeraNormalityTest(await result.data());
|
35 | expectArrayInMeanStdRange(await result.data(), 0, 1.5, EPSILON);
|
36 | });
|
37 | it('should return a int32 1D of random normal values', async () => {
|
38 | const SAMPLES = 10000;
|
39 | const result = tf.randomNormal([SAMPLES], 0, 2, 'int32', SEED);
|
40 | expect(result.dtype).toBe('int32');
|
41 | expect(result.shape).toEqual([SAMPLES]);
|
42 | jarqueBeraNormalityTest(await result.data());
|
43 | expectArrayInMeanStdRange(await result.data(), 0, 2, EPSILON);
|
44 | });
|
45 | it('should return a float32 2D of random normal values', async () => {
|
46 | const SAMPLES = 100;
|
47 | // Ensure defaults to float32.
|
48 | let result = tf.randomNormal([SAMPLES, SAMPLES], 0, 2.5, null, SEED);
|
49 | expect(result.dtype).toBe('float32');
|
50 | expect(result.shape).toEqual([SAMPLES, SAMPLES]);
|
51 | jarqueBeraNormalityTest(await result.data());
|
52 | expectArrayInMeanStdRange(await result.data(), 0, 2.5, EPSILON);
|
53 | result = tf.randomNormal([SAMPLES, SAMPLES], 0, 3.5, 'float32', SEED);
|
54 | expect(result.dtype).toBe('float32');
|
55 | expect(result.shape).toEqual([SAMPLES, SAMPLES]);
|
56 | jarqueBeraNormalityTest(await result.data());
|
57 | expectArrayInMeanStdRange(await result.data(), 0, 3.5, EPSILON);
|
58 | });
|
59 | it('should return a int32 2D of random normal values', async () => {
|
60 | const SAMPLES = 100;
|
61 | const result = tf.randomNormal([SAMPLES, SAMPLES], 0, 2, 'int32', SEED);
|
62 | expect(result.dtype).toBe('int32');
|
63 | expect(result.shape).toEqual([SAMPLES, SAMPLES]);
|
64 | jarqueBeraNormalityTest(await result.data());
|
65 | expectArrayInMeanStdRange(await result.data(), 0, 2, EPSILON);
|
66 | });
|
67 | it('should return a float32 3D of random normal values', async () => {
|
68 | const SAMPLES_SHAPE = [20, 20, 20];
|
69 | // Ensure defaults to float32.
|
70 | let result = tf.randomNormal(SAMPLES_SHAPE, 0, 0.5, null, SEED);
|
71 | expect(result.dtype).toBe('float32');
|
72 | expect(result.shape).toEqual(SAMPLES_SHAPE);
|
73 | jarqueBeraNormalityTest(await result.data());
|
74 | expectArrayInMeanStdRange(await result.data(), 0, 0.5, EPSILON);
|
75 | result = tf.randomNormal(SAMPLES_SHAPE, 0, 1.5, 'float32', SEED);
|
76 | expect(result.dtype).toBe('float32');
|
77 | expect(result.shape).toEqual(SAMPLES_SHAPE);
|
78 | jarqueBeraNormalityTest(await result.data());
|
79 | expectArrayInMeanStdRange(await result.data(), 0, 1.5, EPSILON);
|
80 | });
|
81 | it('should return a int32 3D of random normal values', async () => {
|
82 | const SAMPLES_SHAPE = [20, 20, 20];
|
83 | const result = tf.randomNormal(SAMPLES_SHAPE, 0, 2, 'int32', SEED);
|
84 | expect(result.dtype).toBe('int32');
|
85 | expect(result.shape).toEqual(SAMPLES_SHAPE);
|
86 | jarqueBeraNormalityTest(await result.data());
|
87 | expectArrayInMeanStdRange(await result.data(), 0, 2, EPSILON);
|
88 | });
|
89 | it('should return a float32 4D of random normal values', async () => {
|
90 | const SAMPLES_SHAPE = [10, 10, 10, 10];
|
91 | // Ensure defaults to float32.
|
92 | let result = tf.randomNormal(SAMPLES_SHAPE, 0, 0.5, null, SEED);
|
93 | expect(result.dtype).toBe('float32');
|
94 | expect(result.shape).toEqual(SAMPLES_SHAPE);
|
95 | jarqueBeraNormalityTest(await result.data());
|
96 | expectArrayInMeanStdRange(await result.data(), 0, 0.5, EPSILON);
|
97 | result = tf.randomNormal(SAMPLES_SHAPE, 0, 1.5, 'float32', SEED);
|
98 | expect(result.dtype).toBe('float32');
|
99 | expect(result.shape).toEqual(SAMPLES_SHAPE);
|
100 | jarqueBeraNormalityTest(await result.data());
|
101 | expectArrayInMeanStdRange(await result.data(), 0, 1.5, EPSILON);
|
102 | });
|
103 | it('should return a int32 4D of random normal values', async () => {
|
104 | const SAMPLES_SHAPE = [10, 10, 10, 10];
|
105 | const result = tf.randomNormal(SAMPLES_SHAPE, 0, 2, 'int32', SEED);
|
106 | expect(result.dtype).toBe('int32');
|
107 | expect(result.shape).toEqual(SAMPLES_SHAPE);
|
108 | jarqueBeraNormalityTest(await result.data());
|
109 | expectArrayInMeanStdRange(await result.data(), 0, 2, EPSILON);
|
110 | });
|
111 | it('should return a int32 5D of random normal values', async () => {
|
112 | const SAMPLES_SHAPE = [10, 10, 10, 10, 10];
|
113 | const result = tf.randomNormal(SAMPLES_SHAPE, 0, 2, 'int32', SEED);
|
114 | expect(result.dtype).toBe('int32');
|
115 | expect(result.shape).toEqual(SAMPLES_SHAPE);
|
116 | jarqueBeraNormalityTest(await result.data());
|
117 | expectArrayInMeanStdRange(await result.data(), 0, 2, EPSILON);
|
118 | });
|
119 | });
|
120 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tX25vcm1hbF90ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvcmFuZG9tX25vcm1hbF90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMseUJBQXlCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0UsaUJBQWlCLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7SUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQztJQUVyQixFQUFFLENBQUMsb0RBQW9ELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEUsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXRCLDhCQUE4QjtRQUM5QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLHVCQUF1QixDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0MseUJBQXlCLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMs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LENBQUMsQ0FBQztRQUM3Qyx5QkFBeUIsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHtBTExfRU5WUywgZGVzY3JpYmVXaXRoRmxhZ3N9IGZyb20gJy4uL2phc21pbmVfdXRpbCc7XG5pbXBvcnQge2V4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UsIGphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0fSBmcm9tICcuL3JhbmRfdXRpbCc7XG5cbmRlc2NyaWJlV2l0aEZsYWdzKCdyYW5kb21Ob3JtYWwnLCBBTExfRU5WUywgKCkgPT4ge1xuICBjb25zdCBTRUVEID0gMjAwMjtcbiAgY29uc3QgRVBTSUxPTiA9IDAuMDU7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmbG9hdDMyIDFEIG9mIHJhbmRvbSBub3JtYWwgdmFsdWVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFNBTVBMRVMgPSAxMDAwMDtcblxuICAgIC8vIEVuc3VyZSBkZWZhdWx0cyB0byBmbG9hdDMyLlxuICAgIGxldCByZXN1bHQgPSB0Zi5yYW5kb21Ob3JtYWwoW1NBTVBMRVNdLCAwLCAwLjUsIG51bGwsIFNFRUQpO1xuICAgIGV4cGVjdChyZXN1bHQuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QocmVzdWx0LnNoYXBlKS50b0VxdWFsKFtTQU1QTEVTXSk7XG4gICAgamFycXVlQmVyYU5vcm1hbGl0eVRlc3QoYXdhaXQgcmVzdWx0LmRhdGEoKSk7XG4gICAgZXhwZWN0QXJyYXlJbk1lYW5TdGRSYW5nZShhd2FpdCByZXN1bHQuZGF0YSgpLCAwLCAwLjUsIEVQU0lMT04pO1xuXG4gICAgcmVzdWx0ID0gdGYucmFuZG9tTm9ybWFsKFtTQU1QTEVTXSwgMCwgMS41LCAnZmxvYXQzMicsIFNFRUQpO1xuICAgIGV4cGVjdChyZXN1bHQuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QocmVzdWx0LnNoYXBlKS50b0VxdWFsKFtTQU1QTEVTXSk7XG4gICAgamFycXVlQmVyYU5vcm1hbGl0eVRlc3QoYXdhaXQgcmVzdWx0LmRhdGEoKSk7XG4gICAgZXhwZWN0QXJyYXlJbk1lYW5TdGRSYW5nZShhd2FpdCByZXN1bHQuZGF0YSgpLCAwLCAxLjUsIEVQU0lMT04pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBhIGludDMyIDFEIG9mIHJhbmRvbSBub3JtYWwgdmFsdWVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFNBTVBMRVMgPSAxMDAwMDtcbiAgICBjb25zdCByZXN1bHQgPSB0Zi5yYW5kb21Ob3JtYWwoW1NBTVBMRVNdLCAwLCAyLCAnaW50MzInLCBTRUVEKTtcbiAgICBleHBlY3QocmVzdWx0LmR0eXBlKS50b0JlKCdpbnQzMicpO1xuICAgIGV4cGVjdChyZXN1bHQuc2hhcGUpLnRvRXF1YWwoW1NBTVBMRVNdKTtcbiAgICBqYXJxdWVCZXJhTm9ybWFsaXR5VGVzdChhd2FpdCByZXN1bHQuZGF0YSgpKTtcbiAgICBleHBlY3RBcnJheUluTWVhblN0ZFJhbmdlKGF3YWl0IHJlc3VsdC5kYXRhKCksIDAsIDIsIEVQU0lMT04pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBhIGZsb2F0MzIgMkQgb2YgcmFuZG9tIG5vcm1hbCB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgU0FNUExFUyA9IDEwMDtcblxuICAgIC8vIEVuc3VyZSBkZWZhdWx0cyB0byBmbG9hdDMyLlxuICAgIGxldCByZXN1bHQgPSB0Zi5yYW5kb21Ob3JtYWwoW1NBTVBMRVMsIFNBTVBMRVNdLCAwLCAyLjUsIG51bGwsIFNFRUQpO1xuICAgIGV4cGVjdChyZXN1bHQuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QocmVzdWx0LnNoYXBlKS50b0VxdWFsKFtTQU1QTEVTLCBTQU1QTEVTXSk7XG4gICAgamFycXVlQmVyYU5vcm1hbGl0eVRlc3QoYXdhaXQgcmVzdWx0LmRhdGEoKSk7XG4gICAgZXhwZWN0QXJyYXlJbk1lYW5TdGRSYW5nZShhd2FpdCByZXN1bHQuZGF0YSgpLCAwLCAyLjUsIEVQU0lMT04pO1xuXG4gICAgcmVzdWx0ID0gdGYucmFuZG9tTm9ybWFsKFtTQU1QTEVTLCBTQU1QTEVTXSwgMCwgMy41LCAnZmxvYXQzMicsIFNFRUQpO1xuICAgIGV4cGVjdChyZXN1bHQuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QocmVzdWx0LnNoYXBlKS50b0VxdWFsKFtTQU1QTEVTLCBTQU1QTEVTXSk7XG4gICAgamFycXVlQmVyYU5vcm1hbGl0eVRlc3QoYXdhaXQgcmVzdWx0LmRhdGEoKSk7XG4gICAgZXhwZWN0QXJyYXlJbk1lYW5TdGRSYW5nZShhd2FpdCByZXN1bHQuZGF0YSgpLCAwLCAzLjUsIEVQU0lMT04pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBhIGludDMyIDJEIG9mIHJhbmRvbSBub3JtYWwgdmFsdWVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFNBTVBMRVMgPSAxMDA7XG4gICAgY29uc3QgcmVzdWx0ID0gdGYucmFuZG9tTm9ybWFsKFtTQU1QTEVTLCBTQU1QTEVTXSwgMCwgMiwgJ2ludDMyJywgU0VFRCk7XG4gICAgZXhwZWN0KHJlc3VsdC5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QocmVzdWx0LnNoYXBlKS50b0VxdWFsKFtTQU1QTEVTLCBTQU1QTEVTXSk7XG4gICAgamFycXVlQmVyYU5vcm1hbGl0eVRlc3QoYXdhaXQgcmVzdWx0LmRhdGEoKSk7XG4gICAgZXhwZWN0QXJyYXlJbk1lYW5TdGRSYW5nZShhd2FpdCByZXN1bHQuZGF0YSgpLCAwLCAyLCBFUFNJTE9OKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmbG9hdDMyIDNEIG9mIHJhbmRvbSBub3JtYWwgdmFsdWVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFNBTVBMRVNfU0hBUEUgPSBbMjAsIDIwLCAyMF07XG5cbiAgICAvLyBFbnN1cmUgZGVmYXVsdHMgdG8gZmxvYXQzMi5cbiAgICBsZXQgcmVzdWx0ID0gdGYucmFuZG9tTm9ybWFsKFNBTVBMRVNfU0hBUEUsIDAsIDAuNSwgbnVsbCwgU0VFRCk7XG4gICAgZXhwZWN0KHJlc3VsdC5kdHlwZSkudG9CZSgnZmxvYXQzMicpO1xuICAgIGV4cGVjdChyZXN1bHQuc2hhcGUpLnRvRXF1YWwoU0FNUExFU19TSEFQRSk7XG4gICAgamFycXVlQmVyYU5vcm1hbGl0eVRlc3QoYXdhaXQgcmVzdWx0LmRhdGEoKSk7XG4gICAgZXhwZWN0QXJyYXlJbk1lYW5TdGRSYW5nZShhd2FpdCByZXN1bHQuZGF0YSgpLCAwLCAwLjUsIEVQU0lMT04pO1xuXG4gICAgcmVzdWx0ID0gdGYucmFuZG9tTm9ybWFsKFNBTVBMRVNfU0hBUEUsIDAsIDEuNSwgJ2Zsb2F0MzInLCBTRUVEKTtcbiAgICBleHBlY3QocmVzdWx0LmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KHJlc3VsdC5zaGFwZSkudG9FcXVhbChTQU1QTEVTX1NIQVBFKTtcbiAgICBqYXJxdWVCZXJhTm9ybWFsaXR5VGVzdChhd2FpdCByZXN1bHQuZGF0YSgpKTtcbiAgICBleHBlY3RBcnJheUluTWVhblN0ZFJhbmdlKGF3YWl0IHJlc3VsdC5kYXRhKCksIDAsIDEuNSwgRVBTSUxPTik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGEgaW50MzIgM0Qgb2YgcmFuZG9tIG5vcm1hbCB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgU0FNUExFU19TSEFQRSA9IFsyMCwgMjAsIDIwXTtcbiAgICBjb25zdCByZXN1bHQgPSB0Zi5yYW5kb21Ob3JtYWwoU0FNUExFU19TSEFQRSwgMCwgMiwgJ2ludDMyJywgU0VFRCk7XG4gICAgZXhwZWN0KHJlc3VsdC5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QocmVzdWx0LnNoYXBlKS50b0VxdWFsKFNBTVBMRVNfU0hBUEUpO1xuICAgIGphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0KGF3YWl0IHJlc3VsdC5kYXRhKCkpO1xuICAgIGV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UoYXdhaXQgcmVzdWx0LmRhdGEoKSwgMCwgMiwgRVBTSUxPTik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGEgZmxvYXQzMiA0RCBvZiByYW5kb20gbm9ybWFsIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBTQU1QTEVTX1NIQVBFID0gWzEwLCAxMCwgMTAsIDEwXTtcblxuICAgIC8vIEVuc3VyZSBkZWZhdWx0cyB0byBmbG9hdDMyLlxuICAgIGxldCByZXN1bHQgPSB0Zi5yYW5kb21Ob3JtYWwoU0FNUExFU19TSEFQRSwgMCwgMC41LCBudWxsLCBTRUVEKTtcbiAgICBleHBlY3QocmVzdWx0LmR0eXBlKS50b0JlKCdmbG9hdDMyJyk7XG4gICAgZXhwZWN0KHJlc3VsdC5zaGFwZSkudG9FcXVhbChTQU1QTEVTX1NIQVBFKTtcbiAgICBqYXJxdWVCZXJhTm9ybWFsaXR5VGVzdChhd2FpdCByZXN1bHQuZGF0YSgpKTtcbiAgICBleHBlY3RBcnJheUluTWVhblN0ZFJhbmdlKGF3YWl0IHJlc3VsdC5kYXRhKCksIDAsIDAuNSwgRVBTSUxPTik7XG5cbiAgICByZXN1bHQgPSB0Zi5yYW5kb21Ob3JtYWwoU0FNUExFU19TSEFQRSwgMCwgMS41LCAnZmxvYXQzMicsIFNFRUQpO1xuICAgIGV4cGVjdChyZXN1bHQuZHR5cGUpLnRvQmUoJ2Zsb2F0MzInKTtcbiAgICBleHBlY3QocmVzdWx0LnNoYXBlKS50b0VxdWFsKFNBTVBMRVNfU0hBUEUpO1xuICAgIGphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0KGF3YWl0IHJlc3VsdC5kYXRhKCkpO1xuICAgIGV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UoYXdhaXQgcmVzdWx0LmRhdGEoKSwgMCwgMS41LCBFUFNJTE9OKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gYSBpbnQzMiA0RCBvZiByYW5kb20gbm9ybWFsIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBTQU1QTEVTX1NIQVBFID0gWzEwLCAxMCwgMTAsIDEwXTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRmLnJhbmRvbU5vcm1hbChTQU1QTEVTX1NIQVBFLCAwLCAyLCAnaW50MzInLCBTRUVEKTtcbiAgICBleHBlY3QocmVzdWx0LmR0eXBlKS50b0JlKCdpbnQzMicpO1xuICAgIGV4cGVjdChyZXN1bHQuc2hhcGUpLnRvRXF1YWwoU0FNUExFU19TSEFQRSk7XG4gICAgamFycXVlQmVyYU5vcm1hbGl0eVRlc3QoYXdhaXQgcmVzdWx0LmRhdGEoKSk7XG4gICAgZXhwZWN0QXJyYXlJbk1lYW5TdGRSYW5nZShhd2FpdCByZXN1bHQuZGF0YSgpLCAwLCAyLCBFUFNJTE9OKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gYSBpbnQzMiA1RCBvZiByYW5kb20gbm9ybWFsIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBTQU1QTEVTX1NIQVBFID0gWzEwLCAxMCwgMTAsIDEwLCAxMF07XG5cbiAgICBjb25zdCByZXN1bHQgPSB0Zi5yYW5kb21Ob3JtYWwoU0FNUExFU19TSEFQRSwgMCwgMiwgJ2ludDMyJywgU0VFRCk7XG4gICAgZXhwZWN0KHJlc3VsdC5kdHlwZSkudG9CZSgnaW50MzInKTtcbiAgICBleHBlY3QocmVzdWx0LnNoYXBlKS50b0VxdWFsKFNBTVBMRVNfU0hBUEUpO1xuICAgIGphcnF1ZUJlcmFOb3JtYWxpdHlUZXN0KGF3YWl0IHJlc3VsdC5kYXRhKCkpO1xuICAgIGV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UoYXdhaXQgcmVzdWx0LmRhdGEoKSwgMCwgMiwgRVBTSUxPTik7XG4gIH0pO1xufSk7XG4iXX0= |
\ | No newline at end of file |