author | Csoregi Natalia <ncsoregi@mozilla.com> |
Mon, 07 Jan 2019 23:46:59 +0200 | |
changeset 452767 | aac6849c6ff0eb4981b569988a094f04e42f14dd |
parent 452766 | 14d8f03b496c919c3049db1a094570a7122a4513 (current diff) |
parent 452719 | f366780cecefaaf10c947449a65f299155038fed (diff) |
child 452768 | 5f427c2fdff5b3e4ff2e791c009f2b77e9a3d659 |
child 452824 | 5429ea01ddec11832a4bf42b88c6355ad0c268b2 |
push id | 110970 |
push user | ncsoregi@mozilla.com |
push date | Mon, 07 Jan 2019 21:51:41 +0000 |
treeherder | mozilla-inbound@5f427c2fdff5 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | merge |
milestone | 66.0a1 |
first release with | nightly linux32
aac6849c6ff0
/
66.0a1
/
20190107214730
/
files
nightly linux64
aac6849c6ff0
/
66.0a1
/
20190107214730
/
files
nightly mac
aac6849c6ff0
/
66.0a1
/
20190107214730
/
files
nightly win32
aac6849c6ff0
/
66.0a1
/
20190107214730
/
files
nightly win64
aac6849c6ff0
/
66.0a1
/
20190107214730
/
files
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
releases | nightly linux32
66.0a1
/
20190107214730
/
pushlog to previous
nightly linux64
66.0a1
/
20190107214730
/
pushlog to previous
nightly mac
66.0a1
/
20190107214730
/
pushlog to previous
nightly win32
66.0a1
/
20190107214730
/
pushlog to previous
nightly win64
66.0a1
/
20190107214730
/
pushlog to previous
|
devtools/client/debugger/new/src/workers/parser/getScopes/moz.build | file | annotate | diff | comparison | revisions |
--- a/browser/extensions/pdfjs/README.mozilla +++ b/browser/extensions/pdfjs/README.mozilla @@ -1,5 +1,5 @@ This is the PDF.js project output, https://github.com/mozilla/pdf.js -Current extension version is: 2.1.153 +Current extension version is: 2.1.176 -Taken from upstream commit: 5a2bd9fc +Taken from upstream commit: e4d2a160
--- a/browser/extensions/pdfjs/content/PdfJsDefaultPreferences.jsm +++ b/browser/extensions/pdfjs/content/PdfJsDefaultPreferences.jsm @@ -37,11 +37,12 @@ var PdfJsDefaultPreferences = Object.fre "useOnlyCssZoom": false, "externalLinkTarget": 0, "renderer": "canvas", "renderInteractiveForms": false, "enablePrintAutoRotate": false, "disableOpenActionDestination": true, "disablePageMode": false, "disablePageLabels": false, + "historyUpdateUrl": false, "scrollModeOnLoad": 0, "spreadModeOnLoad": 0 });
--- a/browser/extensions/pdfjs/content/build/pdf.js +++ b/browser/extensions/pdfjs/content/build/pdf.js @@ -118,18 +118,18 @@ return /******/ (function(modules) { // /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var pdfjsVersion = '2.1.153'; -var pdfjsBuild = '5a2bd9fc'; +var pdfjsVersion = '2.1.176'; +var pdfjsBuild = 'e4d2a160'; var pdfjsSharedUtil = __w_pdfjs_require__(1); var pdfjsDisplayAPI = __w_pdfjs_require__(7); var pdfjsDisplayTextLayer = __w_pdfjs_require__(19); var pdfjsDisplayAnnotationLayer = __w_pdfjs_require__(20); @@ -5149,17 +5149,17 @@ function _fetchDocument(worker, source, if (pdfDataRangeTransport) { source.length = pdfDataRangeTransport.length; source.initialData = pdfDataRangeTransport.initialData; } return worker.messageHandler.sendWithPromise('GetDocRequest', { docId, - apiVersion: '2.1.153', + apiVersion: '2.1.176', source: { data: source.data, url: source.url, password: source.password, disableAutoFetch: source.disableAutoFetch, rangeChunkSize: source.rangeChunkSize, length: source.length }, @@ -6880,19 +6880,19 @@ const InternalRenderTask = function Inte } } } return InternalRenderTask; }(); -const version = '2.1.153'; +const version = '2.1.176'; exports.version = version; -const build = '5a2bd9fc'; +const build = 'e4d2a160'; exports.build = build; /***/ }), /* 8 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -10694,17 +10694,17 @@ function isWhitespaceString(s) { } } return true; } class XMLParserBase { _resolveEntities(s) { - return s.replace(/&([^;]+);/g, function (all, entity) { + return s.replace(/&([^;]+);/g, (all, entity) => { if (entity.substring(0, 2) === '#x') { return String.fromCharCode(parseInt(entity.substring(2), 16)); } else if (entity.substring(0, 1) === '#') { return String.fromCharCode(parseInt(entity.substring(1), 10)); } switch (entity) { case 'lt': @@ -10984,16 +10984,21 @@ class SimpleDOMNode { get nextSibling() { const childNodes = this.parentNode.childNodes; if (!childNodes) { return undefined; } const index = childNodes.indexOf(this); + + if (index === -1) { + return undefined; + } + return childNodes[index + 1]; } get textContent() { if (!this.childNodes) { return this.nodeValue || ''; } @@ -11073,19 +11078,23 @@ class SimpleXMLParser extends XMLParserB } this._stack.push(this._currentFragment); this._currentFragment = node.childNodes; } onEndElement(name) { - this._currentFragment = this._stack.pop(); + this._currentFragment = this._stack.pop() || []; const lastElement = this._currentFragment[this._currentFragment.length - 1]; + if (!lastElement) { + return; + } + for (let i = 0, ii = lastElement.childNodes.length; i < ii; i++) { lastElement.childNodes[i].parentNode = lastElement; } } onError(code) { this._errorCode = code; }
--- a/browser/extensions/pdfjs/content/build/pdf.worker.js +++ b/browser/extensions/pdfjs/content/build/pdf.worker.js @@ -118,18 +118,18 @@ return /******/ (function(modules) { // /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; -var pdfjsVersion = '2.1.153'; -var pdfjsBuild = '5a2bd9fc'; +var pdfjsVersion = '2.1.176'; +var pdfjsBuild = 'e4d2a160'; var pdfjsCoreWorker = __w_pdfjs_require__(1); exports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler; /***/ }), /* 1 */ /***/ (function(module, exports, __w_pdfjs_require__) { @@ -370,17 +370,17 @@ var WorkerMessageHandler = { }, createDocumentHandler(docParams, port) { var pdfManager; var terminated = false; var cancelXHRs = null; var WorkerTasks = []; let apiVersion = docParams.apiVersion; - let workerVersion = '2.1.153'; + let workerVersion = '2.1.176'; if (apiVersion !== workerVersion) { throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); } var docId = docParams.docId; var docBaseUrl = docParams.docBaseUrl; var workerHandlerName = docParams.docId + '_worker'; @@ -14937,360 +14937,356 @@ exports.Jbig2Image = Jbig2Image; "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ArithmeticDecoder = void 0; - -var ArithmeticDecoder = function ArithmeticDecoderClosure() { - var QeTable = [{ - qe: 0x5601, - nmps: 1, - nlps: 1, - switchFlag: 1 - }, { - qe: 0x3401, - nmps: 2, - nlps: 6, - switchFlag: 0 - }, { - qe: 0x1801, - nmps: 3, - nlps: 9, - switchFlag: 0 - }, { - qe: 0x0AC1, - nmps: 4, - nlps: 12, - switchFlag: 0 - }, { - qe: 0x0521, - nmps: 5, - nlps: 29, - switchFlag: 0 - }, { - qe: 0x0221, - nmps: 38, - nlps: 33, - switchFlag: 0 - }, { - qe: 0x5601, - nmps: 7, - nlps: 6, - switchFlag: 1 - }, { - qe: 0x5401, - nmps: 8, - nlps: 14, - switchFlag: 0 - }, { - qe: 0x4801, - nmps: 9, - nlps: 14, - switchFlag: 0 - }, { - qe: 0x3801, - nmps: 10, - nlps: 14, - switchFlag: 0 - }, { - qe: 0x3001, - nmps: 11, - nlps: 17, - switchFlag: 0 - }, { - qe: 0x2401, - nmps: 12, - nlps: 18, - switchFlag: 0 - }, { - qe: 0x1C01, - nmps: 13, - nlps: 20, - switchFlag: 0 - }, { - qe: 0x1601, - nmps: 29, - nlps: 21, - switchFlag: 0 - }, { - qe: 0x5601, - nmps: 15, - nlps: 14, - switchFlag: 1 - }, { - qe: 0x5401, - nmps: 16, - nlps: 14, - switchFlag: 0 - }, { - qe: 0x5101, - nmps: 17, - nlps: 15, - switchFlag: 0 - }, { - qe: 0x4801, - nmps: 18, - nlps: 16, - switchFlag: 0 - }, { - qe: 0x3801, - nmps: 19, - nlps: 17, - switchFlag: 0 - }, { - qe: 0x3401, - nmps: 20, - nlps: 18, - switchFlag: 0 - }, { - qe: 0x3001, - nmps: 21, - nlps: 19, - switchFlag: 0 - }, { - qe: 0x2801, - nmps: 22, - nlps: 19, - switchFlag: 0 - }, { - qe: 0x2401, - nmps: 23, - nlps: 20, - switchFlag: 0 - }, { - qe: 0x2201, - nmps: 24, - nlps: 21, - switchFlag: 0 - }, { - qe: 0x1C01, - nmps: 25, - nlps: 22, - switchFlag: 0 - }, { - qe: 0x1801, - nmps: 26, - nlps: 23, - switchFlag: 0 - }, { - qe: 0x1601, - nmps: 27, - nlps: 24, - switchFlag: 0 - }, { - qe: 0x1401, - nmps: 28, - nlps: 25, - switchFlag: 0 - }, { - qe: 0x1201, - nmps: 29, - nlps: 26, - switchFlag: 0 - }, { - qe: 0x1101, - nmps: 30, - nlps: 27, - switchFlag: 0 - }, { - qe: 0x0AC1, - nmps: 31, - nlps: 28, - switchFlag: 0 - }, { - qe: 0x09C1, - nmps: 32, - nlps: 29, - switchFlag: 0 - }, { - qe: 0x08A1, - nmps: 33, - nlps: 30, - switchFlag: 0 - }, { - qe: 0x0521, - nmps: 34, - nlps: 31, - switchFlag: 0 - }, { - qe: 0x0441, - nmps: 35, - nlps: 32, - switchFlag: 0 - }, { - qe: 0x02A1, - nmps: 36, - nlps: 33, - switchFlag: 0 - }, { - qe: 0x0221, - nmps: 37, - nlps: 34, - switchFlag: 0 - }, { - qe: 0x0141, - nmps: 38, - nlps: 35, - switchFlag: 0 - }, { - qe: 0x0111, - nmps: 39, - nlps: 36, - switchFlag: 0 - }, { - qe: 0x0085, - nmps: 40, - nlps: 37, - switchFlag: 0 - }, { - qe: 0x0049, - nmps: 41, - nlps: 38, - switchFlag: 0 - }, { - qe: 0x0025, - nmps: 42, - nlps: 39, - switchFlag: 0 - }, { - qe: 0x0015, - nmps: 43, - nlps: 40, - switchFlag: 0 - }, { - qe: 0x0009, - nmps: 44, - nlps: 41, - switchFlag: 0 - }, { - qe: 0x0005, - nmps: 45, - nlps: 42, - switchFlag: 0 - }, { - qe: 0x0001, - nmps: 45, - nlps: 43, - switchFlag: 0 - }, { - qe: 0x5601, - nmps: 46, - nlps: 46, - switchFlag: 0 - }]; - - function ArithmeticDecoder(data, start, end) { +const QeTable = [{ + qe: 0x5601, + nmps: 1, + nlps: 1, + switchFlag: 1 +}, { + qe: 0x3401, + nmps: 2, + nlps: 6, + switchFlag: 0 +}, { + qe: 0x1801, + nmps: 3, + nlps: 9, + switchFlag: 0 +}, { + qe: 0x0AC1, + nmps: 4, + nlps: 12, + switchFlag: 0 +}, { + qe: 0x0521, + nmps: 5, + nlps: 29, + switchFlag: 0 +}, { + qe: 0x0221, + nmps: 38, + nlps: 33, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 7, + nlps: 6, + switchFlag: 1 +}, { + qe: 0x5401, + nmps: 8, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x4801, + nmps: 9, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x3801, + nmps: 10, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x3001, + nmps: 11, + nlps: 17, + switchFlag: 0 +}, { + qe: 0x2401, + nmps: 12, + nlps: 18, + switchFlag: 0 +}, { + qe: 0x1C01, + nmps: 13, + nlps: 20, + switchFlag: 0 +}, { + qe: 0x1601, + nmps: 29, + nlps: 21, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 15, + nlps: 14, + switchFlag: 1 +}, { + qe: 0x5401, + nmps: 16, + nlps: 14, + switchFlag: 0 +}, { + qe: 0x5101, + nmps: 17, + nlps: 15, + switchFlag: 0 +}, { + qe: 0x4801, + nmps: 18, + nlps: 16, + switchFlag: 0 +}, { + qe: 0x3801, + nmps: 19, + nlps: 17, + switchFlag: 0 +}, { + qe: 0x3401, + nmps: 20, + nlps: 18, + switchFlag: 0 +}, { + qe: 0x3001, + nmps: 21, + nlps: 19, + switchFlag: 0 +}, { + qe: 0x2801, + nmps: 22, + nlps: 19, + switchFlag: 0 +}, { + qe: 0x2401, + nmps: 23, + nlps: 20, + switchFlag: 0 +}, { + qe: 0x2201, + nmps: 24, + nlps: 21, + switchFlag: 0 +}, { + qe: 0x1C01, + nmps: 25, + nlps: 22, + switchFlag: 0 +}, { + qe: 0x1801, + nmps: 26, + nlps: 23, + switchFlag: 0 +}, { + qe: 0x1601, + nmps: 27, + nlps: 24, + switchFlag: 0 +}, { + qe: 0x1401, + nmps: 28, + nlps: 25, + switchFlag: 0 +}, { + qe: 0x1201, + nmps: 29, + nlps: 26, + switchFlag: 0 +}, { + qe: 0x1101, + nmps: 30, + nlps: 27, + switchFlag: 0 +}, { + qe: 0x0AC1, + nmps: 31, + nlps: 28, + switchFlag: 0 +}, { + qe: 0x09C1, + nmps: 32, + nlps: 29, + switchFlag: 0 +}, { + qe: 0x08A1, + nmps: 33, + nlps: 30, + switchFlag: 0 +}, { + qe: 0x0521, + nmps: 34, + nlps: 31, + switchFlag: 0 +}, { + qe: 0x0441, + nmps: 35, + nlps: 32, + switchFlag: 0 +}, { + qe: 0x02A1, + nmps: 36, + nlps: 33, + switchFlag: 0 +}, { + qe: 0x0221, + nmps: 37, + nlps: 34, + switchFlag: 0 +}, { + qe: 0x0141, + nmps: 38, + nlps: 35, + switchFlag: 0 +}, { + qe: 0x0111, + nmps: 39, + nlps: 36, + switchFlag: 0 +}, { + qe: 0x0085, + nmps: 40, + nlps: 37, + switchFlag: 0 +}, { + qe: 0x0049, + nmps: 41, + nlps: 38, + switchFlag: 0 +}, { + qe: 0x0025, + nmps: 42, + nlps: 39, + switchFlag: 0 +}, { + qe: 0x0015, + nmps: 43, + nlps: 40, + switchFlag: 0 +}, { + qe: 0x0009, + nmps: 44, + nlps: 41, + switchFlag: 0 +}, { + qe: 0x0005, + nmps: 45, + nlps: 42, + switchFlag: 0 +}, { + qe: 0x0001, + nmps: 45, + nlps: 43, + switchFlag: 0 +}, { + qe: 0x5601, + nmps: 46, + nlps: 46, + switchFlag: 0 +}]; + +class ArithmeticDecoder { + constructor(data, start, end) { this.data = data; this.bp = start; this.dataEnd = end; this.chigh = data[start]; this.clow = 0; this.byteIn(); this.chigh = this.chigh << 7 & 0xFFFF | this.clow >> 9 & 0x7F; this.clow = this.clow << 7 & 0xFFFF; this.ct -= 7; this.a = 0x8000; } - ArithmeticDecoder.prototype = { - byteIn: function ArithmeticDecoder_byteIn() { - var data = this.data; - var bp = this.bp; - - if (data[bp] === 0xFF) { - var b1 = data[bp + 1]; - - if (b1 > 0x8F) { - this.clow += 0xFF00; - this.ct = 8; - } else { - bp++; - this.clow += data[bp] << 9; - this.ct = 7; - this.bp = bp; - } + byteIn() { + const data = this.data; + let bp = this.bp; + + if (data[bp] === 0xFF) { + if (data[bp + 1] > 0x8F) { + this.clow += 0xFF00; + this.ct = 8; } else { bp++; - this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xFF00; - this.ct = 8; + this.clow += data[bp] << 9; + this.ct = 7; this.bp = bp; } - - if (this.clow > 0xFFFF) { - this.chigh += this.clow >> 16; - this.clow &= 0xFFFF; - } - }, - readBit: function ArithmeticDecoder_readBit(contexts, pos) { - var cx_index = contexts[pos] >> 1, - cx_mps = contexts[pos] & 1; - var qeTableIcx = QeTable[cx_index]; - var qeIcx = qeTableIcx.qe; - var d; - var a = this.a - qeIcx; - - if (this.chigh < qeIcx) { - if (a < qeIcx) { - a = qeIcx; - d = cx_mps; - cx_index = qeTableIcx.nmps; - } else { - a = qeIcx; - d = 1 ^ cx_mps; - - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - - cx_index = qeTableIcx.nlps; - } - } else { - this.chigh -= qeIcx; - - if ((a & 0x8000) !== 0) { - this.a = a; - return cx_mps; - } - - if (a < qeIcx) { - d = 1 ^ cx_mps; - - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - - cx_index = qeTableIcx.nlps; - } else { - d = cx_mps; - cx_index = qeTableIcx.nmps; - } - } - - do { - if (this.ct === 0) { - this.byteIn(); - } - - a <<= 1; - this.chigh = this.chigh << 1 & 0xFFFF | this.clow >> 15 & 1; - this.clow = this.clow << 1 & 0xFFFF; - this.ct--; - } while ((a & 0x8000) === 0); - - this.a = a; - contexts[pos] = cx_index << 1 | cx_mps; - return d; - } - }; - return ArithmeticDecoder; -}(); + } else { + bp++; + this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xFF00; + this.ct = 8; + this.bp = bp; + } + + if (this.clow > 0xFFFF) { + this.chigh += this.clow >> 16; + this.clow &= 0xFFFF; + } + } + + readBit(contexts, pos) { + let cx_index = contexts[pos] >> 1, + cx_mps = contexts[pos] & 1; + const qeTableIcx = QeTable[cx_index]; + const qeIcx = qeTableIcx.qe; + let d; + let a = this.a - qeIcx; + + if (this.chigh < qeIcx) { + if (a < qeIcx) { + a = qeIcx; + d = cx_mps; + cx_index = qeTableIcx.nmps; + } else { + a = qeIcx; + d = 1 ^ cx_mps; + + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + + cx_index = qeTableIcx.nlps; + } + } else { + this.chigh -= qeIcx; + + if ((a & 0x8000) !== 0) { + this.a = a; + return cx_mps; + } + + if (a < qeIcx) { + d = 1 ^ cx_mps; + + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + + cx_index = qeTableIcx.nlps; + } else { + d = cx_mps; + cx_index = qeTableIcx.nmps; + } + } + + do { + if (this.ct === 0) { + this.byteIn(); + } + + a <<= 1; + this.chigh = this.chigh << 1 & 0xFFFF | this.clow >> 15 & 1; + this.clow = this.clow << 1 & 0xFFFF; + this.ct--; + } while ((a & 0x8000) === 0); + + this.a = a; + contexts[pos] = cx_index << 1 | cx_mps; + return d; + } + +} exports.ArithmeticDecoder = ArithmeticDecoder; /***/ }), /* 20 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -21980,17 +21976,18 @@ class AnnotationBorderStyle { this.style = _util.AnnotationBorderStyleType.SOLID; this.dashArray = [3]; this.horizontalCornerRadius = 0; this.verticalCornerRadius = 0; } setWidth(width) { if ((0, _primitives.isName)(width)) { - width = parseFloat(width.name); + this.width = 0; + return; } if (Number.isInteger(width)) { this.width = width; } } setStyle(style) { @@ -28764,17 +28761,29 @@ var Font = function FontClosure() { if (metrics) { metrics.data = null; } return; } font.pos = (font.start ? font.start : 0) + header.offset; - font.pos += header.length - 2; + font.pos += 4; + font.pos += 2; + font.pos += 2; + font.pos += 2; + font.pos += 2; + font.pos += 2; + font.pos += 2; + font.pos += 2; + font.pos += 2; + font.pos += 2; + font.pos += 2; + font.pos += 8; + font.pos += 2; var numOfMetrics = font.getUint16(); if (numOfMetrics > numGlyphs) { (0, _util.info)('The numOfMetrics (' + numOfMetrics + ') should not be ' + 'greater than the numGlyphs (' + numGlyphs + ')'); numOfMetrics = numGlyphs; header.data[34] = (numOfMetrics & 0xff00) >> 8; header.data[35] = numOfMetrics & 0x00ff; } @@ -32255,21 +32264,21 @@ exports.CFFCompiler = CFFCompiler; "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExpertSubsetCharset = exports.ExpertCharset = exports.ISOAdobeCharset = void 0; -var ISOAdobeCharset = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron']; +const ISOAdobeCharset = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron']; exports.ISOAdobeCharset = ISOAdobeCharset; -var ExpertCharset = ['.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall']; +const ExpertCharset = ['.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall']; exports.ExpertCharset = ExpertCharset; -var ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior']; +const ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior']; exports.ExpertSubsetCharset = ExpertSubsetCharset; /***/ }), /* 33 */ /***/ (function(module, exports, __w_pdfjs_require__) { "use strict"; @@ -36866,17 +36875,17 @@ exports.getDingbatsGlyphsUnicode = getDi Object.defineProperty(exports, "__esModule", { value: true }); exports.getSupplementalGlyphMapForCalibri = exports.getSupplementalGlyphMapForArialBlack = exports.getGlyphMapForStandardFonts = exports.getSymbolsFonts = exports.getSerifFonts = exports.getNonStdFontMap = exports.getStdFontMap = void 0; var _util = __w_pdfjs_require__(2); -var getStdFontMap = (0, _util.getLookupTableFactory)(function (t) { +const getStdFontMap = (0, _util.getLookupTableFactory)(function (t) { t['ArialNarrow'] = 'Helvetica'; t['ArialNarrow-Bold'] = 'Helvetica-Bold'; t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique'; t['ArialNarrow-Italic'] = 'Helvetica-Oblique'; t['ArialBlack'] = 'Helvetica'; t['ArialBlack-Bold'] = 'Helvetica-Bold'; t['ArialBlack-BoldItalic'] = 'Helvetica-BoldOblique'; t['ArialBlack-Italic'] = 'Helvetica-Oblique'; @@ -36925,17 +36934,17 @@ var getStdFontMap = (0, _util.getLookupT t['TimesNewRomanPS-Italic'] = 'Times-Italic'; t['TimesNewRomanPS-ItalicMT'] = 'Times-Italic'; t['TimesNewRomanPSMT'] = 'Times-Roman'; t['TimesNewRomanPSMT-Bold'] = 'Times-Bold'; t['TimesNewRomanPSMT-BoldItalic'] = 'Times-BoldItalic'; t['TimesNewRomanPSMT-Italic'] = 'Times-Italic'; }); exports.getStdFontMap = getStdFontMap; -var getNonStdFontMap = (0, _util.getLookupTableFactory)(function (t) { +const getNonStdFontMap = (0, _util.getLookupTableFactory)(function (t) { t['Calibri'] = 'Helvetica'; t['Calibri-Bold'] = 'Helvetica-Bold'; t['Calibri-BoldItalic'] = 'Helvetica-BoldOblique'; t['Calibri-Italic'] = 'Helvetica-Oblique'; t['CenturyGothic'] = 'Helvetica'; t['CenturyGothic-Bold'] = 'Helvetica-Bold'; t['CenturyGothic-BoldItalic'] = 'Helvetica-BoldOblique'; t['CenturyGothic-Italic'] = 'Helvetica-Oblique'; @@ -36963,17 +36972,17 @@ var getNonStdFontMap = (0, _util.getLook t['MS-PMincho'] = 'MS PMincho'; t['MS-PMincho-Bold'] = 'MS PMincho-Bold'; t['MS-PMincho-BoldItalic'] = 'MS PMincho-BoldItalic'; t['MS-PMincho-Italic'] = 'MS PMincho-Italic'; t['NuptialScript'] = 'Times-Italic'; t['Wingdings'] = 'ZapfDingbats'; }); exports.getNonStdFontMap = getNonStdFontMap; -var getSerifFonts = (0, _util.getLookupTableFactory)(function (t) { +const getSerifFonts = (0, _util.getLookupTableFactory)(function (t) { t['Adobe Jenson'] = true; t['Adobe Text'] = true; t['Albertus'] = true; t['Aldus'] = true; t['Alexandria'] = true; t['Algerian'] = true; t['American Typewriter'] = true; t['Antiqua'] = true; @@ -37099,23 +37108,23 @@ var getSerifFonts = (0, _util.getLookupT t['Versailles'] = true; t['Wanted'] = true; t['Weiss'] = true; t['Wide Latin'] = true; t['Windsor'] = true; t['XITS'] = true; }); exports.getSerifFonts = getSerifFonts; -var getSymbolsFonts = (0, _util.getLookupTableFactory)(function (t) { +const getSymbolsFonts = (0, _util.getLookupTableFactory)(function (t) { t['Dingbats'] = true; t['Symbol'] = true; t['ZapfDingbats'] = true; }); exports.getSymbolsFonts = getSymbolsFonts; -var getGlyphMapForStandardFonts = (0, _util.getLookupTableFactory)(function (t) { +const getGlyphMapForStandardFonts = (0, _util.getLookupTableFactory)(function (t) { t[2] = 10; t[3] = 32; t[4] = 33; t[5] = 34; t[6] = 35; t[7] = 36; t[8] = 37; t[9] = 38; @@ -37501,23 +37510,23 @@ var getGlyphMapForStandardFonts = (0, _u t[3182] = 7623; t[3282] = 11799; t[3316] = 578; t[3379] = 42785; t[3393] = 1159; t[3416] = 8377; }); exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts; -var getSupplementalGlyphMapForArialBlack = (0, _util.getLookupTableFactory)(function (t) { +const getSupplementalGlyphMapForArialBlack = (0, _util.getLookupTableFactory)(function (t) { t[227] = 322; t[264] = 261; t[291] = 346; }); exports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack; -let getSupplementalGlyphMapForCalibri = (0, _util.getLookupTableFactory)(function (t) { +const getSupplementalGlyphMapForCalibri = (0, _util.getLookupTableFactory)(function (t) { t[1] = 32; t[4] = 65; t[17] = 66; t[18] = 67; t[24] = 68; t[28] = 69; t[38] = 70; t[39] = 71;
--- a/browser/extensions/pdfjs/content/web/viewer.js +++ b/browser/extensions/pdfjs/content/web/viewer.js @@ -1016,18 +1016,21 @@ let PDFViewerApplication = { let pagesPromise = pdfViewer.pagesPromise; let onePageRendered = pdfViewer.onePageRendered; let pdfThumbnailViewer = this.pdfThumbnailViewer; pdfThumbnailViewer.setDocument(pdfDocument); firstPagePromise.then(pdfPage => { this.loadingBar.setWidth(this.appConfig.viewerContainer); if (!_app_options.AppOptions.get('disableHistory') && !this.isViewerEmbedded) { - let resetHistory = !_app_options.AppOptions.get('showPreviousViewOnLoad'); - this.pdfHistory.initialize(pdfDocument.fingerprint, resetHistory); + this.pdfHistory.initialize({ + fingerprint: pdfDocument.fingerprint, + resetHistory: !_app_options.AppOptions.get('showPreviousViewOnLoad'), + updateUrl: _app_options.AppOptions.get('historyUpdateUrl') + }); if (this.pdfHistory.initialBookmark) { this.initialBookmark = this.pdfHistory.initialBookmark; this.initialRotation = this.pdfHistory.initialRotation; } } let storePromise = store.getMultiple({ @@ -3923,16 +3926,20 @@ const defaultOptions = { externalLinkRel: { value: 'noopener noreferrer nofollow', kind: OptionKind.VIEWER }, externalLinkTarget: { value: 0, kind: OptionKind.VIEWER }, + historyUpdateUrl: { + value: false, + kind: OptionKind.VIEWER + }, imageResourcesPath: { value: './images/', kind: OptionKind.VIEWER }, maxCanvasPixels: { value: _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels || 16777216, kind: OptionKind.VIEWER }, @@ -5793,24 +5800,29 @@ class PDFHistory { this.eventBus.on('presentationmodechanged', evt => { this._isViewerInPresentationMode = evt.active || evt.switchInProgress; }); this.eventBus.on('pagesloaded', evt => { this._isPagesLoaded = !!evt.pagesCount; }); } - initialize(fingerprint, resetHistory = false) { + initialize({ + fingerprint, + resetHistory = false, + updateUrl = false + }) { if (!fingerprint || typeof fingerprint !== 'string') { console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.'); return; } let reInitialized = this.initialized && this.fingerprint !== fingerprint; this.fingerprint = fingerprint; + this._updateUrl = updateUrl === true; if (!this.initialized) { this._bindEvents(); } let state = window.history.state; this.initialized = true; this.initialBookmark = null; @@ -5818,17 +5830,17 @@ class PDFHistory { this._popStateInProgress = false; this._blockHashChange = 0; this._currentHash = getCurrentHash(); this._numPositionUpdates = 0; this._uid = this._maxUid = 0; this._destination = null; this._position = null; - if (!this._isValidState(state) || resetHistory) { + if (!this._isValidState(state, true) || resetHistory) { let { hash, page, rotation } = parseCurrentHash(this.linkService); if (!hash || reInitialized || resetHistory) { this._pushOrReplaceState(null, true); @@ -5965,21 +5977,31 @@ class PDFHistory { let newState = { fingerprint: this.fingerprint, uid: shouldReplace ? this._uid : this._uid + 1, destination }; this._updateInternalState(destination, newState.uid); + let newUrl; + + if (this._updateUrl && destination && destination.hash) { + const baseUrl = document.location.href.split('#')[0]; + + if (!baseUrl.startsWith('file://')) { + newUrl = `${baseUrl}#${destination.hash}`; + } + } + if (shouldReplace) { - window.history.replaceState(newState, ''); + window.history.replaceState(newState, '', newUrl); } else { this._maxUid = this._uid; - window.history.pushState(newState, ''); + window.history.pushState(newState, '', newUrl); } } _tryPushCurrentPosition(temporary = false) { if (!this._position) { return; } @@ -6018,23 +6040,35 @@ class PDFHistory { } forceReplace = true; } this._pushOrReplaceState(position, forceReplace); } - _isValidState(state) { + _isValidState(state, checkReload = false) { if (!state) { return false; } if (state.fingerprint !== this.fingerprint) { - return false; + if (checkReload) { + if (typeof state.fingerprint !== 'string' || state.fingerprint.length !== this.fingerprint.length) { + return false; + } + + const [perfEntry] = performance.getEntriesByType('navigation'); + + if (!perfEntry || perfEntry.type !== 'reload') { + return false; + } + } else { + return false; + } } if (!Number.isInteger(state.uid) || state.uid < 0) { return false; } if (state.destination === null || typeof state.destination !== 'object') { return false; @@ -11595,16 +11629,17 @@ function getDefaultPreferences() { "useOnlyCssZoom": false, "externalLinkTarget": 0, "renderer": "canvas", "renderInteractiveForms": false, "enablePrintAutoRotate": false, "disableOpenActionDestination": true, "disablePageMode": false, "disablePageLabels": false, + "historyUpdateUrl": false, "scrollModeOnLoad": 0, "spreadModeOnLoad": 0 }); } return defaultPreferences; }
--- a/browser/extensions/pdfjs/moz.yaml +++ b/browser/extensions/pdfjs/moz.yaml @@ -15,15 +15,15 @@ origin: description: Portable Document Format (PDF) viewer that is built with HTML5 # Full URL for the package's homepage/etc # Usually different from repository url url: https://github.com/mozilla/pdf.js # Human-readable identifier for this version/release # Generally "version NNN", "tag SSS", "bookmark SSS" - release: version 2.1.153 + release: version 2.1.176 # The package's license, where possible using the mnemonic from # https://spdx.org/licenses/ # Multiple licenses can be specified (as a YAML list) # A "LICENSE" file must exist containing the full license text license: Apache-2.0
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/.babelrc @@ -0,0 +1,45 @@ +{ + "presets": [ + "react", + + [ + "env", + { + "targets": { + "browsers": ["last 1 Chrome version", "last 1 Firefox version"] + }, + "modules": "commonjs" + } + ] + ], + "plugins": [ + "transform-flow-strip-types", + "transform-class-properties", + "syntax-trailing-function-commas", + "syntax-object-rest-spread", + [ + "module-resolver", + { + "alias": { + "devtools/client/shared/vendor/react": "react", + "devtools/client/shared/vendor/react-dom": "react-dom" + } + } + ] + ], + "env": { + "test": { + "presets": [ + [ + "env", + { + "targets": { + "node": 7 + }, + "modules": "commonjs" + } + ] + ] + } + } +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/images/Svg.js @@ -0,0 +1,109 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const React = require("react"); +import InlineSVG from "svg-inline-react"; + +const svg = { + "angle-brackets": require("./angle-brackets.svg"), + angular: require("./angular.svg"), + arrow: require("./arrow.svg"), + babel: require("./babel.svg"), + backbone: require("./backbone.svg"), + blackBox: require("./blackBox.svg"), + breadcrumb: require("./breadcrumbs-divider.svg"), + breakpoint: require("./breakpoint.svg"), + "column-breakpoint": require("./column-breakpoint.svg"), + "column-marker": require("./column-marker.svg"), + "case-match": require("./case-match.svg"), + choo: require("./choo.svg"), + close: require("./close.svg"), + coffeescript: require(`./coffeescript.svg`), + dojo: require("./dojo.svg"), + domain: require("./domain.svg"), + extension: require("./extension.svg"), + file: require("./file.svg"), + folder: require("./folder.svg"), + globe: require("./globe.svg"), + home: require("./home.svg"), + javascript: require("./javascript.svg"), + jquery: require("./jquery.svg"), + underscore: require("./underscore.svg"), + lodash: require("./lodash.svg"), + ember: require("./ember.svg"), + vuejs: require("./vuejs.svg"), + "magnifying-glass": require("./magnifying-glass.svg"), + "arrow-up": require("./arrow-up.svg"), + "arrow-down": require("./arrow-down.svg"), + pause: require("./pause.svg"), + "pause-exceptions": require("./pause-exceptions.svg"), + plus: require("./plus.svg"), + preact: require("./preact.svg"), + aframe: require("./aframe.svg"), + prettyPrint: require("./prettyPrint.svg"), + react: require("./react.svg"), + "regex-match": require("./regex-match.svg"), + redux: require("./redux.svg"), + immutable: require("./immutable.svg"), + resume: require("./resume.svg"), + settings: require("./settings.svg"), + stepIn: require("./stepIn.svg"), + stepOut: require("./stepOut.svg"), + stepOver: require("./stepOver.svg"), + subSettings: require("./subSettings.svg"), + tab: require("./tab.svg"), + toggleBreakpoints: require("./toggle-breakpoints.svg"), + togglePanes: require("./toggle-panes.svg"), + typescript: require("./typescript.svg"), + "whole-word-match": require("./whole-word-match.svg"), + worker: require("./worker.svg"), + "sad-face": require("devtools-mc-assets/assets/devtools/client/themes/images/sad-face.svg"), + refresh: require("devtools-mc-assets/assets/devtools/client/themes/images/reload.svg"), + webpack: require("./webpack.svg"), + node: require("./node.svg"), + express: require("./express.svg"), + pug: require("./pug.svg"), + extjs: require("./sencha-extjs.svg"), + mobx: require("./mobx.svg"), + marko: require("./marko.svg"), + nextjs: require("./nextjs.svg"), + showSources: require("./showSources.svg"), + showOutline: require("./showOutline.svg"), + nuxtjs: require("./nuxtjs.svg"), + rxjs: require("./rxjs.svg"), + loader: require('./loader.svg') +}; + +type SvgType = { + name: string, + className?: string, + onClick?: () => void, + "aria-label"?: string +}; + +function Svg({ name, className, onClick, "aria-label": ariaLabel }) { + if (!svg[name]) { + const error = `Unknown SVG: ${name}`; + console.warn(error); + return null; + } + + className = `${name} ${className || ""}`; + if (name === "subSettings") { + className = ""; + } + + const props = { + className, + onClick, + ["aria-label"]: ariaLabel, + src: svg[name] + }; + + return <InlineSVG {...props} />; +} + +Svg.displayName = "Svg"; + +module.exports = Svg;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/jest-test.config.js @@ -0,0 +1,40 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const { resolve } = require("path"); +const rootDir = resolve(__dirname); +module.exports = { + rootDir, + displayName: "test", + testURL: "http://localhost/", + testPathIgnorePatterns: [ + "/node_modules/", + "/helpers/", + "/fixtures/", + "src/test/mochitest/examples/", + "<rootDir>/firefox", + "package.json", + "<rootDir>/packages" + ], + modulePathIgnorePatterns: ["src/test/mochitest", "firefox"], + collectCoverageFrom: [ + "src/**/*.js", + "!src/**/fixtures/*.js", + "!src/test/**/*.js", + "!src/components/stories/**/*.js", + "!**/*.mock.js", + "!**/*.spec.js" + ], + transformIgnorePatterns: ["node_modules/(?!devtools-)"], + setupTestFrameworkScriptFile: "<rootDir>/src/test/tests-setup.js", + setupFiles: ["<rootDir>/src/test/shim.js", "jest-localstorage-mock"], + snapshotSerializers: [ + "jest-serializer-babel-ast", + "enzyme-to-json/serializer" + ], + moduleNameMapper: { + "\\.css$": "<rootDir>/src/test/__mocks__/styleMock.js", + "\\.svg$": "<rootDir>/src/test/__mocks__/svgMock.js" + } +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/jest.config.js @@ -0,0 +1,14 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const { resolve } = require("path"); +const rootDir = resolve(__dirname); +module.exports = { + rootDir, + reporters: ["default"], + projects: [ + "<rootDir>/jest-test.config.js", + "<rootDir>/packages/*/jest.config.js" + ] +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/package.json @@ -0,0 +1,137 @@ +{ + "name": "debugger.html", + "version": "0.6.0", + "license": "MPL-2.0", + "repository": { + "url": "git://github.com/devtools-html/debugger.html.git", + "type": "git" + }, + "bugs": { + "url": "https://github.com/devtools-html/debugger.html/issues" + }, + "homepage": "https://github.com/devtools-html/debugger.html#readme", + "engineStrict": true, + "engines": { + "node": ">=7.7.0" + }, + "scripts": { + }, + "dependencies": { + "@babel/core": "^7.0.0-beta.55", + "@babel/parser": "^7.0.0-beta.55", + "@babel/template": "^7.0.0-beta.55", + "@babel/types": "^7.0.0-beta.55", + "babel-plugin-transform-imports": "^1.5.0", + "codemirror": "^5.28.0", + "devtools-environment": "^0.0.6", + "devtools-launchpad": "^0.0.141", + "devtools-linters": "^0.0.4", + "devtools-reps": "0.23.0", + "devtools-source-map": "0.16.0", + "devtools-splitter": "^0.0.8", + "devtools-utils": "0.0.14", + "fuzzaldrin-plus": "^0.6.0", + "immutable": "^3.8.2", + "lodash": "^4.17.4", + "lodash-move": "^1.1.1", + "lodash.kebabcase": "^4.1.1", + "md5": "^2.2.1", + "parse-script-tags": "^0.1.6", + "pretty-fast": "^0.2.3", + "prop-types": "^15.6.0", + "react": "16.4.1", + "react-aria-components": "^0.0.4", + "react-dom": "16.4.1", + "react-immutable-proptypes": "^2.1.0", + "react-inlinesvg": "^0.8.1", + "react-redux": "^5.0.7", + "react-transition-group": "^2.2.1", + "reselect": "^4.0.0", + "svg-inline-react": "^3.0.0", + "wasmparser": "^0.7.0" + }, + "private": true, + "workspaces": [ + "packages/*" + ], + "files": [ + "src", + "assets" + ], + "greenkeeper": { + "ignore": [ + "react", + "react-dom", + "react-redux", + "redux", + "codemirror" + ] + }, + "main": "src/main.js", + "author": "Jason Laster <jlaster@mozilla.com>", + "devDependencies": { + "@sucrase/webpack-object-rest-spread-plugin": "^1.0.0", + "babel-eslint": "^10.0.1", + "babel-jest": "^23.0.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "babel-preset-env": "^1.6.1", + "babel-preset-react": "^6.24.1", + "chalk": "^2.1.0", + "copy-paste": "^1.3.0", + "copy-webpack-plugin": "^4.5.2", + "devtools-license-check": "^0.7.0", + "enzyme": "^3.3.0", + "enzyme-adapter-react-16": "^1.1.1", + "enzyme-to-json": "3.3.4", + "eslint": "^5.0.0", + "eslint-config-prettier": "^3.0.0", + "eslint-plugin-babel": "^5.0.0", + "eslint-plugin-file-header": "0.0.1", + "eslint-plugin-flowtype": "^3.0.0", + "eslint-plugin-import": "^2.8.0", + "eslint-plugin-jest": "^21.15.1", + "eslint-plugin-jsx-a11y": "^6.1.2", + "eslint-plugin-mozilla": "1.0.4", + "eslint-plugin-prettier": "^3.0.0", + "eslint-plugin-react": "^7.2.1", + "expect.js": "^0.3.1", + "flow-bin": "^0.89.0", + "glob": "^7.0.3", + "husky": "^1.0.1", + "jest": "^23.0.0", + "jest-environment-jsdom": "^23.0.0", + "jest-in-case": "^1.0.2", + "jest-junit": "^5.0.0", + "jest-localstorage-mock": "^2.2.0", + "jest-serializer-babel-ast": "^0.0.5", + "lint-staged": "^8.0.0", + "mochii": "^0.0.32", + "mock-require": "^3.0.0", + "node-emoji": "^1.8.1", + "npm-run-all": "^4.0.2", + "prettier": "^1.12.1", + "pretty-quick": "^1.4.1", + "remark-cli": "^6.0.0", + "remark-lint": "^6.0.1", + "remark-lint-list-item-bullet-indent": "^1.0.1", + "remark-lint-list-item-indent": "^1.0.1", + "remark-lint-no-shortcut-reference-image": "^1.0.1", + "remark-lint-no-shortcut-reference-link": "^1.0.2", + "remark-lint-no-table-indentation": "^1.0.0", + "remark-lint-no-unused-definitions": "^1.0.1", + "remark-lint-ordered-list-marker-style": "^1.0.1", + "remark-lint-table-cell-padding": "^1.0.0", + "remark-lint-table-pipes": "^1.0.0", + "remark-preset-lint-recommended": "^3.0.0", + "remark-validate-links": "^7.0.0", + "rimraf": "^2.6.1", + "single-line-log": "^1.1.2", + "stylelint": "^9.0.0", + "webpack": "^3.5.5", + "webpack-visualizer-plugin": "^0.1.11", + "workerjs": "github:jasonLaster/workerjs#a2425aaeebacae7a7640e496a54c2a41962f3890" + } +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/.babelrc @@ -0,0 +1,7 @@ +{ + "presets": ["react", "flow"], + "plugins": [ + "transform-es2015-modules-commonjs", + "transform-flow-strip-types" + ] +} \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/.storybook/config.js @@ -0,0 +1,11 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const { configure } = require("@storybook/react"); + +function loadStories() { + require("../stories/index"); +} + +configure(loadStories, module);
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/.storybook/webpack.config.js @@ -0,0 +1,5 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +module.exports = require("../webpack.config.js"); \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/LICENSE @@ -0,0 +1,362 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0.
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/README.md @@ -0,0 +1,5 @@ +## Devtools Components + +Devtools shared Components + +* _Tree_ - A performant tree
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/index.js @@ -0,0 +1,9 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import Tree from "./src/tree"; + +module.exports = { + Tree +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/jest.config.js @@ -0,0 +1,20 @@ +const { resolve } = require("path"); +const rootDir = resolve(__dirname, "src"); +module.exports = { + rootDir, + displayName: "devtools-components test", + setupFiles: [ + "<rootDir>/../../../src/test/__mocks__/request-animation-frame.js", + "<rootDir>/tests/setup.js" + ], + testMatch: ["**/tests/**/*.js"], + testPathIgnorePatterns: [ + "/node_modules/", + "<rootDir>/tests/__mocks__/", + "<rootDir>/tests/setup.js" + ], + testURL: "http://localhost/", + moduleNameMapper: { + "\\.css$": "<rootDir>/../../../src/test/__mocks__/styleMock.js" + } +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/package.json @@ -0,0 +1,33 @@ +{ + "name": "devtools-components", + "version": "0.6.0", + "description": "DevTools HTML Components", + "main": "index.js", + "scripts": { + "copy-assets": "node bin/copy-assets", + "license-check": "devtools-license-check", + "storybook": + "NODE_ENV=storybook start-storybook -p 9002 -c .storybook -s ./src", + "test": "jest --projects jest.config.js" + }, + "author": "Jason Laster", + "license": "MPL-2.0", + "dependencies": { + "prop-types": "^15.6.0", + "react": "^16.4.1", + "react-dom": "^16.4.1", + "react-dom-factories": "^1.0.2" + }, + "devDependencies": { + "@storybook/react": "^3.3.14", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "babel-preset-react": "^6.24.1", + "devtools-license-check": "^0.7.0", + "enzyme": "^3.3.0", + "enzyme-adapter-react-16": "^1.1.1", + "eslint": "^5.0.0", + "eslint-plugin-mozilla": "1.0.4", + "fs-extra": "^7.0.0", + "lodash": "^4.17.2" + } +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/postcss.config.js @@ -0,0 +1,37 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const mapUrl = require("postcss-url-mapper"); +const MC_PATH = "resource://devtools/client/debugger/new/images/"; +const EXPRESS_PATH = "/devtools-components/images/"; + +function mapUrlProduction(url, type) { + return url.replace("/images/arrow.svg", MC_PATH + "arrow.svg"); +} + +function mapUrlDevelopment(url) { + return url.replace("/images/arrow.svg", EXPRESS_PATH + "arrow.svg"); +} + +module.exports = ({ file, options, env }) => { + // Here we don't want to do anything for storybook since we serve the images thanks + // to the `-s ./src` option in the `storybook` command (see package.json). + if (env === "storybook") { + return {}; + } + + // This will be used when creating a bundle for mozilla-central (from devtools-reps + // or debugger.html). + if (env === "production") { + return { + plugins: [mapUrl(mapUrlProduction)] + }; + } + + // This will be used when using this module in launchpad mode. We set a unique path so + // we can serve images from express. + return { + plugins: [mapUrl(mapUrlDevelopment)] + }; +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/src/images/arrow.svg @@ -0,0 +1,6 @@ +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="context-fill #9B9B9B"> + <path d="M8 13.4c-.5 0-.9-.2-1.2-.6L.4 5.2C0 4.7-.1 4.3.2 3.7S1 3 1.6 3h12.8c.6 0 1.2.1 1.4.7.3.6.2 1.1-.2 1.6l-6.4 7.6c-.3.4-.7.5-1.2.5z"/> +</svg>
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/src/tests/__snapshots__/tree.js.snap @@ -0,0 +1,908 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Tree Don't auto expand root with very large number of children 1`] = ` +Array [ + "key-A", + "key-B", + "key-E", + "key-F", + "key-G", + "key-C", + "key-H", + "key-I", + "key-D", + "key-J", + "key-M", + "key-N", +] +`; + +exports[`Tree ignores key strokes when pressing modifiers 1`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 2`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 3`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 4`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 5`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 6`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 7`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 8`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 9`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 10`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 11`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 12`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 13`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 14`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 15`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 16`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree ignores key strokes when pressing modifiers 17`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders arrows as expected when nodes are collapsed 1`] = ` +" +▶︎ A +▶︎ M +" +`; + +exports[`Tree renders arrows as expected when nodes are expanded 1`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected 1`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected navigating down with keyboard on last node 1`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | [O] +" +`; + +exports[`Tree renders as expected navigating down with keyboard on last node 2`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | [O] +" +`; + +exports[`Tree renders as expected navigating up with the keyboard on a root 1`] = ` +" +▼ [A] +| ▼ B +| | ▼ E +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected navigating up with the keyboard on a root 2`] = ` +" +▼ [A] +| ▼ B +| | ▼ E +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected navigating with arrows on unexpandable roots 1`] = ` +" + [A] + M +" +`; + +exports[`Tree renders as expected navigating with arrows on unexpandable roots 2`] = ` +" + A + [M] +" +`; + +exports[`Tree renders as expected navigating with arrows on unexpandable roots 3`] = ` +" + [A] + M +" +`; + +exports[`Tree renders as expected when given a focused item 1`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | L +| | F +| | [G] +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when given a focused item 2`] = ` +" +▶︎ [A] +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when given a focused item 3`] = ` +" +▼ [A] +| ▼ B +| | ▼ E +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when given a focused item 4`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating down with the keyboard 1`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | [K] +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating down with the keyboard 2`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating down with the keyboard 3`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | L +| | [F] +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating up with the keyboard 1`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating up with the keyboard 2`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | [K] +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating up with the keyboard 3`] = ` +" +▼ A +| ▼ B +| | ▼ [E] +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating with home/end 1`] = ` +" +▶︎ A +▶︎ [M] +" +`; + +exports[`Tree renders as expected when navigating with home/end 2`] = ` +" +▶︎ [A] +▶︎ M +" +`; + +exports[`Tree renders as expected when navigating with home/end 3`] = ` +" +▶︎ [A] +▶︎ M +" +`; + +exports[`Tree renders as expected when navigating with home/end 4`] = ` +" +▶︎ A +▶︎ [M] +" +`; + +exports[`Tree renders as expected when navigating with home/end 5`] = ` +" +▶︎ A +▶︎ [M] +" +`; + +exports[`Tree renders as expected when navigating with home/end 6`] = ` +" +▶︎ A +▼ [M] +| ▶︎ N +" +`; + +exports[`Tree renders as expected when navigating with home/end 7`] = ` +" +▶︎ A +▼ M +| ▶︎ [N] +" +`; + +exports[`Tree renders as expected when navigating with home/end 8`] = ` +" +▶︎ A +▼ M +| ▶︎ [N] +" +`; + +exports[`Tree renders as expected when navigating with home/end 9`] = ` +" +▶︎ [A] +▼ M +| ▶︎ N +" +`; + +exports[`Tree renders as expected when navigating with left arrows on roots 1`] = ` +" +▶︎ A +▶︎ [M] +" +`; + +exports[`Tree renders as expected when navigating with left arrows on roots 2`] = ` +" +▶︎ [A] +▶︎ M +" +`; + +exports[`Tree renders as expected when navigating with left arrows on roots 3`] = ` +" +▶︎ [A] +▶︎ M +" +`; + +exports[`Tree renders as expected when navigating with right/left arrows 1`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | K +| | | [L] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating with right/left arrows 2`] = ` +" +▼ A +| ▼ B +| | ▼ [E] +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating with right/left arrows 3`] = ` +" +▼ A +| ▼ B +| | ▶︎ [E] +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating with right/left arrows 4`] = ` +" +▼ A +| ▼ B +| | ▼ [E] +| | | K +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when navigating with right/left arrows 5`] = ` +" +▼ A +| ▼ B +| | ▼ E +| | | [K] +| | | L +| | F +| | G +| ▼ C +| | H +| | I +| ▼ D +| | J +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree renders as expected when passed autoDepth:1 1`] = ` +" +▼ A +| ▶︎ B +| ▶︎ C +| ▶︎ D +▼ M +| ▶︎ N +" +`; + +exports[`Tree renders as expected with collapsed nodes 1`] = ` +" +▶︎ A +▼ M +| ▼ N +| | O +" +`; + +exports[`Tree uses isExpandable prop if it exists to render tree nodes 1`] = ` +" +▶︎ A + M +" +`;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/src/tests/setup.js @@ -0,0 +1,8 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +// Configure enzyme with React 16 adapter. +const Enzyme = require("enzyme"); +const Adapter = require("enzyme-adapter-react-16"); +Enzyme.configure({ adapter: new Adapter() });
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/src/tests/tree.js @@ -0,0 +1,762 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +/* global jest */ + +import React from "react"; +import { mount } from "enzyme"; +import Components from "../../index"; +import dom from "react-dom-factories"; + +const { Component, createFactory } = React; +const Tree = createFactory(Components.Tree); + +function mountTree(overrides = {}) { + return mount( + createFactory( + class container extends Component { + constructor(props) { + super(props); + const state = { + expanded: overrides.expanded || new Set(), + focused: overrides.focused + }; + delete overrides.focused; + this.state = state; + } + + render() { + return Tree( + Object.assign( + { + getParent: x => TEST_TREE.parent[x], + getChildren: x => TEST_TREE.children[x], + renderItem: (x, depth, focused, arrow) => { + return dom.div( + {}, + arrow, + focused ? "[" : null, + x, + focused ? "]" : null + ); + }, + getRoots: () => ["A", "M"], + getKey: x => `key-${x}`, + itemHeight: 1, + onFocus: x => { + this.setState(previousState => { + return { focused: x }; + }); + }, + onExpand: x => { + this.setState(previousState => { + const expanded = new Set(previousState.expanded); + expanded.add(x); + return { expanded }; + }); + }, + onCollapse: x => { + this.setState(previousState => { + const expanded = new Set(previousState.expanded); + expanded.delete(x); + return { expanded }; + }); + }, + isExpanded: x => this.state && this.state.expanded.has(x), + focused: this.state.focused + }, + overrides + ) + ); + } + } + )() + ); +} + +describe("Tree", () => { + it("does not throw", () => { + expect(mountTree()).toBeTruthy(); + }); + + it("Don't auto expand root with very large number of children", () => { + const children = Array.from( + { length: 51 }, + (_, i) => `should-not-be-visible-${i + 1}` + ); + // N has a lot of children, so it won't be automatically expanded + const wrapper = mountTree({ + autoExpandDepth: 2, + autoExpandNodeChildrenLimit: 50, + getChildren: item => { + if (item === "N") { + return children; + } + + return TEST_TREE.children[item] || []; + } + }); + const ids = getTreeNodes(wrapper).map(node => node.prop("id")); + expect(ids).toMatchSnapshot(); + }); + + it("is accessible", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJMN".split("")) + }); + expect(wrapper.getDOMNode().getAttribute("role")).toBe("tree"); + expect(wrapper.getDOMNode().getAttribute("tabIndex")).toBe("0"); + + const expected = { + A: { id: "key-A", level: 1, expanded: true }, + B: { id: "key-B", level: 2, expanded: true }, + C: { id: "key-C", level: 2, expanded: true }, + D: { id: "key-D", level: 2, expanded: true }, + E: { id: "key-E", level: 3, expanded: true }, + F: { id: "key-F", level: 3, expanded: true }, + G: { id: "key-G", level: 3, expanded: true }, + H: { id: "key-H", level: 3, expanded: true }, + I: { id: "key-I", level: 3, expanded: true }, + J: { id: "key-J", level: 3, expanded: true }, + K: { id: "key-K", level: 4, expanded: undefined }, + L: { id: "key-L", level: 4, expanded: undefined }, + M: { id: "key-M", level: 1, expanded: true }, + N: { id: "key-N", level: 2, expanded: true }, + O: { id: "key-O", level: 3, expanded: undefined } + }; + + getTreeNodes(wrapper).forEach(node => { + const key = node.prop("id").replace("key-", ""); + const item = expected[key]; + + expect(node.prop("id")).toBe(item.id); + expect(node.prop("role")).toBe("treeitem"); + expect(node.prop("aria-level")).toBe(item.level); + expect(node.prop("aria-expanded")).toBe(item.expanded); + }); + }); + + it("renders as expected", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")) + }); + + expect(formatTree(wrapper)).toMatchSnapshot(); + }); + + it("renders as expected when passed a className", () => { + const wrapper = mountTree({ + className: "testClassName" + }); + + expect(wrapper.find(".tree").hasClass("testClassName")).toBe(true); + }); + + it("renders as expected when passed a style", () => { + const wrapper = mountTree({ + style: { + color: "red" + } + }); + + expect(wrapper.getDOMNode().style.color).toBe("red"); + }); + + it("renders as expected when passed a label", () => { + const wrapper = mountTree({ + label: "testAriaLabel" + }); + expect(wrapper.getDOMNode().getAttribute("aria-label")).toBe( + "testAriaLabel" + ); + }); + + it("renders as expected when passed an aria-labelledby", () => { + const wrapper = mountTree({ + labelledby: "testAriaLabelBy" + }); + expect(wrapper.getDOMNode().getAttribute("aria-labelledby")).toBe( + "testAriaLabelBy" + ); + }); + + it("renders as expected with collapsed nodes", () => { + const wrapper = mountTree({ + expanded: new Set("MNO".split("")) + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + }); + + it("renders as expected when passed autoDepth:1", () => { + const wrapper = mountTree({ + autoExpandDepth: 1 + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + }); + + it("renders as expected when given a focused item", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "G" + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-G" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-G"); + + getTreeNodes(wrapper) + .first() + .simulate("click"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-A" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-A"); + + getTreeNodes(wrapper) + .first() + .simulate("click"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-A" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-A"); + + wrapper.simulate("blur"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().hasAttribute("aria-activedescendant")).toBe( + false + ); + expect(wrapper.find(".focused").exists()).toBe(false); + }); + + it("renders as expected when navigating up with the keyboard", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "L" + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-L" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-L"); + + simulateKeyDown(wrapper, "ArrowUp"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-K" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-K"); + + simulateKeyDown(wrapper, "ArrowUp"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-E" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-E"); + }); + + it("renders as expected navigating up with the keyboard on a root", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "A" + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-A" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-A"); + + simulateKeyDown(wrapper, "ArrowUp"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-A" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-A"); + }); + + it("renders as expected when navigating down with the keyboard", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "K" + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-K" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-K"); + + simulateKeyDown(wrapper, "ArrowDown"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-L" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-L"); + + simulateKeyDown(wrapper, "ArrowDown"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-F" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-F"); + }); + + it("renders as expected navigating down with keyboard on last node", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "O" + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-O" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-O"); + + simulateKeyDown(wrapper, "ArrowDown"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-O" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-O"); + }); + + it("renders as expected when navigating with right/left arrows", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "L" + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-L" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-L"); + + simulateKeyDown(wrapper, "ArrowLeft"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-E" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-E"); + + simulateKeyDown(wrapper, "ArrowLeft"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-E" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-E"); + + simulateKeyDown(wrapper, "ArrowRight"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-E" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-E"); + + simulateKeyDown(wrapper, "ArrowRight"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-K" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-K"); + }); + + it("renders as expected when navigating with left arrows on roots", () => { + const wrapper = mountTree({ + focused: "M" + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-M" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-M"); + + simulateKeyDown(wrapper, "ArrowLeft"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-A" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-A"); + + simulateKeyDown(wrapper, "ArrowLeft"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-A" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-A"); + }); + + it("renders as expected when navigating with home/end", () => { + const wrapper = mountTree({ + focused: "M" + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-M" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-M"); + + simulateKeyDown(wrapper, "Home"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-A" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-A"); + + simulateKeyDown(wrapper, "Home"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-A" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-A"); + + simulateKeyDown(wrapper, "End"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-M" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-M"); + + simulateKeyDown(wrapper, "End"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-M" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-M"); + + simulateKeyDown(wrapper, "ArrowRight"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-M" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-M"); + + simulateKeyDown(wrapper, "End"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-N" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-N"); + + simulateKeyDown(wrapper, "End"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-N" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-N"); + + simulateKeyDown(wrapper, "Home"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-A" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-A"); + }); + + it("renders as expected navigating with arrows on unexpandable roots", () => { + const wrapper = mountTree({ + focused: "A", + isExpandable: item => false + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + + simulateKeyDown(wrapper, "ArrowRight"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-M" + ); + + simulateKeyDown(wrapper, "ArrowLeft"); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-A" + ); + }); + + it("calls onFocus when expected", () => { + const onFocus = jest.fn(x => { + wrapper && + wrapper.setState(() => { + return { focused: x }; + }); + }); + + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "I", + onFocus + }); + + simulateKeyDown(wrapper, "ArrowUp"); + expect(onFocus.mock.calls[0][0]).toBe("H"); + + simulateKeyDown(wrapper, "ArrowUp"); + expect(onFocus.mock.calls[1][0]).toBe("C"); + + simulateKeyDown(wrapper, "ArrowLeft"); + simulateKeyDown(wrapper, "ArrowLeft"); + expect(onFocus.mock.calls[2][0]).toBe("A"); + + simulateKeyDown(wrapper, "ArrowRight"); + expect(onFocus.mock.calls[3][0]).toBe("B"); + + simulateKeyDown(wrapper, "ArrowDown"); + expect(onFocus.mock.calls[4][0]).toBe("E"); + }); + + it("focus treeRef when a node is clicked", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")) + }); + const treeRef = wrapper + .find("Tree") + .first() + .instance().treeRef; + treeRef.focus = jest.fn(); + + getTreeNodes(wrapper) + .first() + .simulate("click"); + expect(treeRef.focus.mock.calls).toHaveLength(1); + }); + + it("doesn't focus treeRef when focused is null", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "A" + }); + const treeRef = wrapper + .find("Tree") + .first() + .instance().treeRef; + treeRef.focus = jest.fn(); + wrapper.simulate("blur"); + expect(treeRef.focus.mock.calls).toHaveLength(0); + }); + + it("calls onActivate when expected", () => { + const onActivate = jest.fn(); + + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "A", + onActivate + }); + + simulateKeyDown(wrapper, "Enter"); + expect(onActivate.mock.calls).toHaveLength(1); + expect(onActivate.mock.calls[0][0]).toBe("A"); + + simulateKeyDown(wrapper, "Enter"); + expect(onActivate.mock.calls).toHaveLength(2); + expect(onActivate.mock.calls[1][0]).toBe("A"); + + simulateKeyDown(wrapper, "ArrowDown"); + simulateKeyDown(wrapper, "Enter"); + expect(onActivate.mock.calls).toHaveLength(3); + expect(onActivate.mock.calls[2][0]).toBe("B"); + + wrapper.simulate("blur"); + simulateKeyDown(wrapper, "Enter"); + expect(onActivate.mock.calls).toHaveLength(3); + }); + + it("does not throw when onActivate is undefined and Enter is pressed", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "A" + }); + + simulateKeyDown(wrapper, "Enter"); + }); + + it("ignores key strokes when pressing modifiers", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")), + focused: "L" + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-L" + ); + expect(wrapper.find(".focused").prop("id")).toBe("key-L"); + + const testKeys = [ + { key: "ArrowDown" }, + { key: "ArrowUp" }, + { key: "ArrowLeft" }, + { key: "ArrowRight" } + ]; + const modifiers = [ + { altKey: true }, + { ctrlKey: true }, + { metaKey: true }, + { shiftKey: true } + ]; + + for (const key of testKeys) { + for (const modifier of modifiers) { + wrapper.simulate("keydown", Object.assign({}, key, modifier)); + expect(formatTree(wrapper)).toMatchSnapshot(); + expect(wrapper.getDOMNode().getAttribute("aria-activedescendant")).toBe( + "key-L" + ); + } + } + }); + + it("renders arrows as expected when nodes are expanded", () => { + const wrapper = mountTree({ + expanded: new Set("ABCDEFGHIJKLMNO".split("")) + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + + getTreeNodes(wrapper).forEach(n => { + if ("ABECDMN".split("").includes(getSanitizedNodeText(n))) { + expect(n.find(".arrow.expanded").exists()).toBe(true); + } else { + expect(n.find(".arrow").exists()).toBe(false); + } + }); + }); + + it("renders arrows as expected when nodes are collapsed", () => { + const wrapper = mountTree(); + expect(formatTree(wrapper)).toMatchSnapshot(); + + getTreeNodes(wrapper).forEach(n => { + const arrow = n.find(".arrow"); + expect(arrow.exists()).toBe(true); + expect(arrow.hasClass("expanded")).toBe(false); + }); + }); + + it("uses isExpandable prop if it exists to render tree nodes", () => { + const wrapper = mountTree({ + isExpandable: item => item === "A" + }); + expect(formatTree(wrapper)).toMatchSnapshot(); + }); + + it("adds the expected data-expandable attribute", () => { + const wrapper = mountTree({ + isExpandable: item => item === "A" + }); + const nodes = getTreeNodes(wrapper); + expect(nodes.at(0).prop("data-expandable")).toBe(true); + expect(nodes.at(1).prop("data-expandable")).toBe(false); + }); +}); + +function getTreeNodes(wrapper) { + return wrapper.find(".tree-node"); +} + +function simulateKeyDown(wrapper, key) { + wrapper.simulate("keydown", { + key, + preventDefault: () => {}, + stopPropagation: () => {} + }); +} + +/* + * Takes an Enzyme wrapper (obtained with mount/mount/…) and + * returns a stringified version of the Tree, e.g. + * + * ▼ A + * | ▼ B + * | | ▼ E + * | | | K + * | | | L + * | | F + * | | G + * | ▼ C + * | | H + * | | I + * | ▼ D + * | | J + * ▼ M + * | ▼ N + * | | O + * + */ +function formatTree(wrapper) { + const textTree = getTreeNodes(wrapper) + .map(node => { + const level = (node.prop("aria-level") || 1) - 1; + const indentStr = "| ".repeat(level); + const arrow = node.find(".arrow"); + let arrowStr = " "; + if (arrow.exists()) { + arrowStr = arrow.hasClass("expanded") ? "▼ " : "▶︎ "; + } + + return `${indentStr}${arrowStr}${getSanitizedNodeText(node)}`; + }) + .join("\n"); + + // Wrap in new lines so tree nodes are aligned as expected. + return `\n${textTree}\n`; +} + +function getSanitizedNodeText(node) { + // Stripping off the invisible space used in the indent. + return node.text().replace(/^\u200B+/, ""); +} + +// Encoding of the following tree/forest: +// +// A +// |-- B +// | |-- E +// | | |-- K +// | | `-- L +// | |-- F +// | `-- G +// |-- C +// | |-- H +// | `-- I +// `-- D +// `-- J +// M +// `-- N +// `-- O + +var TEST_TREE = { + children: { + A: ["B", "C", "D"], + B: ["E", "F", "G"], + C: ["H", "I"], + D: ["J"], + E: ["K", "L"], + F: [], + G: [], + H: [], + I: [], + J: [], + K: [], + L: [], + M: ["N"], + N: ["O"], + O: [] + }, + parent: { + A: null, + B: "A", + C: "A", + D: "A", + E: "B", + F: "B", + G: "B", + H: "C", + I: "C", + J: "D", + K: "E", + L: "E", + M: null, + N: "M", + O: "N" + } +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/src/tree.css @@ -0,0 +1,90 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + /* We can remove the outline since we do add our own focus style on nodes */ +.tree:focus { + outline: none; +} + +.tree.inline { + display: inline-block; +} + +.tree.nowrap { + white-space: nowrap; +} + +.tree.noselect { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} + +.tree .tree-node { + display: flex; +} + +.tree .tree-node:not(.focused):hover { + background-color: var(--theme-selection-background-hover); +} + +.tree-indent { + display: inline-block; + width: 12px; + margin-inline-start: 5px; + border-inline-start: 1px solid #A2D1FF; + flex-shrink: 0; +} + +/* Align with expandables siblings (where we have the arrow) */ +.tree-node[data-expandable="false"] .tree-indent:last-of-type { + margin-inline-end: 15px; +} + +/* For non expandable root nodes, we don't have .tree-indent elements, so we declare + the margin on the start of the node */ +.tree-node[data-expandable="false"][aria-level="1"] { + padding-inline-start: 15px +} + +.tree .tree-node[data-expandable="true"] { + cursor: default; +} + +.tree-node button.arrow { + background:url(/images/arrow.svg) no-repeat; + background-size:contain; + background-position:center center; + width: 9px; + height: 9px; + border:0; + padding:0; + margin-inline-start: 1px; + margin-inline-end: 4px; + transform: rotate(-90deg); + transform-origin: center center; + transition: transform 0.125s ease; + align-self: center; + -moz-context-properties: fill; + fill: var(--theme-splitter-color, #9B9B9B); +} + +html[dir="rtl"] .tree-node button.arrow { + transform: rotate(90deg); +} + +.tree-node button.arrow.expanded.expanded { + transform: rotate(0deg); + } + +.tree .tree-node.focused { + color: white; + background-color: var(--theme-selection-background, #0a84ff); +} + +.tree-node.focused button.arrow { + fill: currentColor; +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/src/tree.js @@ -0,0 +1,852 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +import React from "react"; +const { Component, createFactory } = React; +import dom from "react-dom-factories"; +import PropTypes from "prop-types"; + +require("./tree.css"); + +// depth +const AUTO_EXPAND_DEPTH = 0; + +/** + * An arrow that displays whether its node is expanded (▼) or collapsed + * (▶). When its node has no children, it is hidden. + */ +class ArrowExpander extends Component { + static get propTypes() { + return { + expanded: PropTypes.bool + }; + } + + shouldComponentUpdate(nextProps, nextState) { + return this.props.expanded !== nextProps.expanded; + } + + render() { + const { expanded } = this.props; + + const classNames = ["arrow"]; + if (expanded) { + classNames.push("expanded"); + } + return dom.button({ + className: classNames.join(" ") + }); + } +} + +const treeIndent = dom.span({ className: "tree-indent" }, "\u200B"); + +class TreeNode extends Component { + static get propTypes() { + return { + id: PropTypes.any.isRequired, + index: PropTypes.number.isRequired, + depth: PropTypes.number.isRequired, + focused: PropTypes.bool.isRequired, + expanded: PropTypes.bool.isRequired, + item: PropTypes.any.isRequired, + isExpandable: PropTypes.bool.isRequired, + onClick: PropTypes.func, + renderItem: PropTypes.func.isRequired + }; + } + + shouldComponentUpdate(nextProps) { + return ( + this.props.item !== nextProps.item || + this.props.focused !== nextProps.focused || + this.props.expanded !== nextProps.expanded + ); + } + + render() { + const { + depth, + id, + item, + focused, + expanded, + renderItem, + isExpandable + } = this.props; + + const arrow = isExpandable + ? ArrowExpanderFactory({ + item, + expanded + }) + : null; + + let ariaExpanded; + if (this.props.isExpandable) { + ariaExpanded = false; + } + if (this.props.expanded) { + ariaExpanded = true; + } + + const indents = Array.from({ length: depth }).fill(treeIndent); + const items = indents.concat( + renderItem(item, depth, focused, arrow, expanded) + ); + + return dom.div( + { + id, + className: `tree-node${focused ? " focused" : ""}`, + onClick: this.props.onClick, + role: "treeitem", + "aria-level": depth + 1, + "aria-expanded": ariaExpanded, + "data-expandable": this.props.isExpandable + }, + ...items + ); + } +} + +const ArrowExpanderFactory = createFactory(ArrowExpander); +const TreeNodeFactory = createFactory(TreeNode); + +/** + * Create a function that calls the given function `fn` only once per animation + * frame. + * + * @param {Function} fn + * @returns {Function} + */ +function oncePerAnimationFrame(fn) { + let animationId = null; + let argsToPass = null; + return function(...args) { + argsToPass = args; + if (animationId !== null) { + return; + } + + animationId = requestAnimationFrame(() => { + fn.call(this, ...argsToPass); + animationId = null; + argsToPass = null; + }); + }; +} + +/** + * A generic tree component. See propTypes for the public API. + * + * This tree component doesn't make any assumptions about the structure of your + * tree data. Whether children are computed on demand, or stored in an array in + * the parent's `_children` property, it doesn't matter. We only require the + * implementation of `getChildren`, `getRoots`, `getParent`, and `isExpanded` + * functions. + * + * This tree component is well tested and reliable. See the tests in ./tests + * and its usage in the performance and memory panels in mozilla-central. + * + * This tree component doesn't make any assumptions about how to render items in + * the tree. You provide a `renderItem` function, and this component will ensure + * that only those items whose parents are expanded and which are visible in the + * viewport are rendered. The `renderItem` function could render the items as a + * "traditional" tree or as rows in a table or anything else. It doesn't + * restrict you to only one certain kind of tree. + * + * The tree comes with basic styling for the indent, the arrow, as well as + * hovered and focused styles which can be override in CSS. + * + * ### Example Usage + * + * Suppose we have some tree data where each item has this form: + * + * { + * id: Number, + * label: String, + * parent: Item or null, + * children: Array of child items, + * expanded: bool, + * } + * + * Here is how we could render that data with this component: + * + * class MyTree extends Component { + * static get propTypes() { + * // The root item of the tree, with the form described above. + * return { + * root: PropTypes.object.isRequired + * }; + * }, + * + * render() { + * return Tree({ + * itemHeight: 20, // px + * + * getRoots: () => [this.props.root], + * + * getParent: item => item.parent, + * getChildren: item => item.children, + * getKey: item => item.id, + * isExpanded: item => item.expanded, + * + * renderItem: (item, depth, isFocused, arrow, isExpanded) => { + * let className = "my-tree-item"; + * if (isFocused) { + * className += " focused"; + * } + * return dom.div({ + * className, + * }, + * arrow, + * // And here is the label for this item. + * dom.span({ className: "my-tree-item-label" }, item.label) + * ); + * }, + * + * onExpand: item => dispatchExpandActionToRedux(item), + * onCollapse: item => dispatchCollapseActionToRedux(item), + * }); + * } + * } + */ +class Tree extends Component { + static get propTypes() { + return { + // Required props + + // A function to get an item's parent, or null if it is a root. + // + // Type: getParent(item: Item) -> Maybe<Item> + // + // Example: + // + // // The parent of this item is stored in its `parent` property. + // getParent: item => item.parent + getParent: PropTypes.func.isRequired, + + // A function to get an item's children. + // + // Type: getChildren(item: Item) -> [Item] + // + // Example: + // + // // This item's children are stored in its `children` property. + // getChildren: item => item.children + getChildren: PropTypes.func.isRequired, + + // A function which takes an item and ArrowExpander component instance and + // returns a component, or text, or anything else that React considers + // renderable. + // + // Type: renderItem(item: Item, + // depth: Number, + // isFocused: Boolean, + // arrow: ReactComponent, + // isExpanded: Boolean) -> ReactRenderable + // + // Example: + // + // renderItem: (item, depth, isFocused, arrow, isExpanded) => { + // let className = "my-tree-item"; + // if (isFocused) { + // className += " focused"; + // } + // return dom.div( + // { + // className, + // style: { marginLeft: depth * 10 + "px" } + // }, + // arrow, + // dom.span({ className: "my-tree-item-label" }, item.label) + // ); + // }, + renderItem: PropTypes.func.isRequired, + + // A function which returns the roots of the tree (forest). + // + // Type: getRoots() -> [Item] + // + // Example: + // + // // In this case, we only have one top level, root item. You could + // // return multiple items if you have many top level items in your + // // tree. + // getRoots: () => [this.props.rootOfMyTree] + getRoots: PropTypes.func.isRequired, + + // A function to get a unique key for the given item. This helps speed up + // React's rendering a *TON*. + // + // Type: getKey(item: Item) -> String + // + // Example: + // + // getKey: item => `my-tree-item-${item.uniqueId}` + getKey: PropTypes.func.isRequired, + + // A function to get whether an item is expanded or not. If an item is not + // expanded, then it must be collapsed. + // + // Type: isExpanded(item: Item) -> Boolean + // + // Example: + // + // isExpanded: item => item.expanded, + isExpanded: PropTypes.func.isRequired, + + // Optional props + + // The currently focused item, if any such item exists. + focused: PropTypes.any, + + // Handle when a new item is focused. + onFocus: PropTypes.func, + + // The depth to which we should automatically expand new items. + autoExpandDepth: PropTypes.number, + // Should auto expand all new items or just the new items under the first + // root item. + autoExpandAll: PropTypes.bool, + + // Auto expand a node only if number of its children + // are less than autoExpandNodeChildrenLimit + autoExpandNodeChildrenLimit: PropTypes.number, + + // Note: the two properties below are mutually exclusive. Only one of the + // label properties is necessary. + // ID of an element whose textual content serves as an accessible label + // for a tree. + labelledby: PropTypes.string, + // Accessibility label for a tree widget. + label: PropTypes.string, + + // Optional event handlers for when items are expanded or collapsed. + // Useful for dispatching redux events and updating application state, + // maybe lazily loading subtrees from a worker, etc. + // + // Type: + // onExpand(item: Item) + // onCollapse(item: Item) + // + // Example: + // + // onExpand: item => dispatchExpandActionToRedux(item) + onExpand: PropTypes.func, + onCollapse: PropTypes.func, + // Optional event handler called with the current focused node when the + // Enter key is pressed. Can be useful to allow further keyboard actions + // within the tree node. + onActivate: PropTypes.func, + isExpandable: PropTypes.func, + // Additional classes to add to the root element. + className: PropTypes.string, + // style object to be applied to the root element. + style: PropTypes.object, + // Prevents blur when Tree loses focus + preventBlur: PropTypes.bool + }; + } + + static get defaultProps() { + return { + autoExpandDepth: AUTO_EXPAND_DEPTH, + autoExpandAll: true + }; + } + + constructor(props) { + super(props); + + this.state = { + seen: new Set() + }; + + this._onExpand = oncePerAnimationFrame(this._onExpand).bind(this); + this._onCollapse = oncePerAnimationFrame(this._onCollapse).bind(this); + this._focusPrevNode = oncePerAnimationFrame(this._focusPrevNode).bind(this); + this._focusNextNode = oncePerAnimationFrame(this._focusNextNode).bind(this); + this._focusParentNode = oncePerAnimationFrame(this._focusParentNode).bind( + this + ); + this._focusFirstNode = oncePerAnimationFrame(this._focusFirstNode).bind( + this + ); + this._focusLastNode = oncePerAnimationFrame(this._focusLastNode).bind(this); + + this._autoExpand = this._autoExpand.bind(this); + this._preventArrowKeyScrolling = this._preventArrowKeyScrolling.bind(this); + this._dfs = this._dfs.bind(this); + this._dfsFromRoots = this._dfsFromRoots.bind(this); + this._focus = this._focus.bind(this); + this._scrollNodeIntoView = this._scrollNodeIntoView.bind(this); + this._onBlur = this._onBlur.bind(this); + this._onKeyDown = this._onKeyDown.bind(this); + this._nodeIsExpandable = this._nodeIsExpandable.bind(this); + this._activateNode = oncePerAnimationFrame(this._activateNode).bind(this); + } + + componentDidMount() { + this._autoExpand(); + if (this.props.focused) { + this._scrollNodeIntoView(this.props.focused); + // Always keep the focus on the tree itself. + this.treeRef.focus(); + } + } + + componentWillReceiveProps(nextProps) { + this._autoExpand(); + } + + componentDidUpdate(prevProps, prevState) { + if (this.props.focused && prevProps.focused !== this.props.focused) { + this._scrollNodeIntoView(this.props.focused); + // Always keep the focus on the tree itself. + this.treeRef.focus(); + } + } + + _autoExpand() { + const { autoExpandDepth, autoExpandNodeChildrenLimit } = this.props; + if (!autoExpandDepth) { + return; + } + + // Automatically expand the first autoExpandDepth levels for new items. Do + // not use the usual DFS infrastructure because we don't want to ignore + // collapsed nodes. + const autoExpand = (item, currentDepth) => { + if (currentDepth >= autoExpandDepth || this.state.seen.has(item)) { + return; + } + + const children = this.props.getChildren(item); + if ( + autoExpandNodeChildrenLimit && + children.length > autoExpandNodeChildrenLimit + ) { + return; + } + + this.props.onExpand(item); + this.state.seen.add(item); + + const length = children.length; + for (let i = 0; i < length; i++) { + autoExpand(children[i], currentDepth + 1); + } + }; + + const roots = this.props.getRoots(); + const length = roots.length; + if (this.props.autoExpandAll) { + for (let i = 0; i < length; i++) { + autoExpand(roots[i], 0); + } + } else if (length != 0) { + autoExpand(roots[0], 0); + } + } + + _preventArrowKeyScrolling(e) { + switch (e.key) { + case "ArrowUp": + case "ArrowDown": + case "ArrowLeft": + case "ArrowRight": + e.preventDefault(); + e.stopPropagation(); + if (e.nativeEvent) { + if (e.nativeEvent.preventDefault) { + e.nativeEvent.preventDefault(); + } + if (e.nativeEvent.stopPropagation) { + e.nativeEvent.stopPropagation(); + } + } + } + } + + /** + * Perform a pre-order depth-first search from item. + */ + _dfs(item, maxDepth = Infinity, traversal = [], _depth = 0) { + traversal.push({ item, depth: _depth }); + + if (!this.props.isExpanded(item)) { + return traversal; + } + + const nextDepth = _depth + 1; + + if (nextDepth > maxDepth) { + return traversal; + } + + const children = this.props.getChildren(item); + const length = children.length; + for (let i = 0; i < length; i++) { + this._dfs(children[i], maxDepth, traversal, nextDepth); + } + + return traversal; + } + + /** + * Perform a pre-order depth-first search over the whole forest. + */ + _dfsFromRoots(maxDepth = Infinity) { + const traversal = []; + + const roots = this.props.getRoots(); + const length = roots.length; + for (let i = 0; i < length; i++) { + this._dfs(roots[i], maxDepth, traversal); + } + + return traversal; + } + + /** + * Expands current row. + * + * @param {Object} item + * @param {Boolean} expandAllChildren + */ + _onExpand(item, expandAllChildren) { + if (this.props.onExpand) { + this.props.onExpand(item); + + if (expandAllChildren) { + const children = this._dfs(item); + const length = children.length; + for (let i = 0; i < length; i++) { + this.props.onExpand(children[i].item); + } + } + } + } + + /** + * Collapses current row. + * + * @param {Object} item + */ + _onCollapse(item) { + if (this.props.onCollapse) { + this.props.onCollapse(item); + } + } + + /** + * Sets the passed in item to be the focused item. + * + * @param {Object|undefined} item + * The item to be focused, or undefined to focus no item. + * + * @param {Object|undefined} options + * An options object which can contain: + * - dir: "up" or "down" to indicate if we should scroll the element + * to the top or the bottom of the scrollable container when + * the element is off canvas. + */ + _focus(item, options = {}) { + const { preventAutoScroll } = options; + if (item && !preventAutoScroll) { + this._scrollNodeIntoView(item, options); + } + if (this.props.onFocus) { + this.props.onFocus(item); + } + } + + /** + * Sets the passed in item to be the focused item. + * + * @param {Object|undefined} item + * The item to be scrolled to. + * + * @param {Object|undefined} options + * An options object which can contain: + * - dir: "up" or "down" to indicate if we should scroll the element + * to the top or the bottom of the scrollable container when + * the element is off canvas. + */ + _scrollNodeIntoView(item, options = {}) { + if (item !== undefined) { + const treeElement = this.treeRef; + const element = document.getElementById(this.props.getKey(item)); + + if (element) { + const { top, bottom } = element.getBoundingClientRect(); + const closestScrolledParent = node => { + if (node == null) { + return null; + } + + if (node.scrollHeight > node.clientHeight) { + return node; + } + return closestScrolledParent(node.parentNode); + }; + const scrolledParent = closestScrolledParent(treeElement); + const scrolledParentRect = scrolledParent + ? scrolledParent.getBoundingClientRect() + : null; + const isVisible = + !scrolledParent || + (top >= scrolledParentRect.top && + bottom <= scrolledParentRect.bottom); + + if (!isVisible) { + const { alignTo } = options; + const scrollToTop = alignTo + ? alignTo === "top" + : !scrolledParentRect || top < scrolledParentRect.top; + element.scrollIntoView(scrollToTop); + } + } + } + } + + /** + * Sets the state to have no focused item. + */ + _onBlur() { + if (!this.props.preventBlur) { + this._focus(undefined); + } + } + + /** + * Handles key down events in the tree's container. + * + * @param {Event} e + */ + _onKeyDown(e) { + if (this.props.focused == null) { + return; + } + + // Allow parent nodes to use navigation arrows with modifiers. + if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) { + return; + } + + this._preventArrowKeyScrolling(e); + + switch (e.key) { + case "ArrowUp": + this._focusPrevNode(); + return; + + case "ArrowDown": + this._focusNextNode(); + return; + + case "ArrowLeft": + if ( + this.props.isExpanded(this.props.focused) && + this._nodeIsExpandable(this.props.focused) + ) { + this._onCollapse(this.props.focused); + } else { + this._focusParentNode(); + } + return; + + case "ArrowRight": + if ( + this._nodeIsExpandable(this.props.focused) && + !this.props.isExpanded(this.props.focused) + ) { + this._onExpand(this.props.focused); + } else { + this._focusNextNode(); + } + return; + + case "Home": + this._focusFirstNode(); + return; + + case "End": + this._focusLastNode(); + return; + + case "Enter": + this._activateNode(); + } + } + + /** + * Sets the previous node relative to the currently focused item, to focused. + */ + _focusPrevNode() { + // Start a depth first search and keep going until we reach the currently + // focused node. Focus the previous node in the DFS, if it exists. If it + // doesn't exist, we're at the first node already. + + let prev; + + const traversal = this._dfsFromRoots(); + const length = traversal.length; + for (let i = 0; i < length; i++) { + const item = traversal[i].item; + if (item === this.props.focused) { + break; + } + prev = item; + } + if (prev === undefined) { + return; + } + + this._focus(prev, { alignTo: "top" }); + } + + /** + * Handles the down arrow key which will focus either the next child + * or sibling row. + */ + _focusNextNode() { + // Start a depth first search and keep going until we reach the currently + // focused node. Focus the next node in the DFS, if it exists. If it + // doesn't exist, we're at the last node already. + const traversal = this._dfsFromRoots(); + const length = traversal.length; + let i = 0; + + while (i < length) { + if (traversal[i].item === this.props.focused) { + break; + } + i++; + } + + if (i + 1 < traversal.length) { + this._focus(traversal[i + 1].item, { alignTo: "bottom" }); + } + } + + /** + * Handles the left arrow key, going back up to the current rows' + * parent row. + */ + _focusParentNode() { + const parent = this.props.getParent(this.props.focused); + if (!parent) { + this._focusPrevNode(this.props.focused); + return; + } + + this._focus(parent, { alignTo: "top" }); + } + + _focusFirstNode() { + const traversal = this._dfsFromRoots(); + this._focus(traversal[0].item, { alignTo: "top" }); + } + + _focusLastNode() { + const traversal = this._dfsFromRoots(); + const lastIndex = traversal.length - 1; + this._focus(traversal[lastIndex].item, { alignTo: "bottom" }); + } + + _activateNode() { + if (this.props.onActivate) { + this.props.onActivate(this.props.focused); + } + } + + _nodeIsExpandable(item) { + return this.props.isExpandable + ? this.props.isExpandable(item) + : !!this.props.getChildren(item).length; + } + + render() { + const traversal = this._dfsFromRoots(); + const { focused } = this.props; + + const nodes = traversal.map((v, i) => { + const { item, depth } = traversal[i]; + const key = this.props.getKey(item, i); + return TreeNodeFactory({ + key, + id: key, + index: i, + item, + depth, + renderItem: this.props.renderItem, + focused: focused === item, + expanded: this.props.isExpanded(item), + isExpandable: this._nodeIsExpandable(item), + onExpand: this._onExpand, + onCollapse: this._onCollapse, + onClick: e => { + // We can stop the propagation since click handler on the node can be + // created in `renderItem`. + e.stopPropagation(); + + // Since the user just clicked the node, there's no need to check if + // it should be scrolled into view. + this._focus(item, { preventAutoScroll: true }); + if (this.props.isExpanded(item)) { + this.props.onCollapse(item); + } else { + this.props.onExpand(item, e.altKey); + } + } + }); + }); + + const style = Object.assign({}, this.props.style || {}, { + padding: 0, + margin: 0 + }); + + return dom.div( + { + className: `tree ${this.props.className ? this.props.className : ""}`, + ref: el => { + this.treeRef = el; + }, + role: "tree", + tabIndex: "0", + onKeyDown: this._onKeyDown, + onKeyPress: this._preventArrowKeyScrolling, + onKeyUp: this._preventArrowKeyScrolling, + onFocus: ({ nativeEvent }) => { + if (focused || !nativeEvent || !this.treeRef) { + return; + } + + const { explicitOriginalTarget } = nativeEvent; + // Only set default focus to the first tree node if the focus came + // from outside the tree (e.g. by tabbing to the tree from other + // external elements). + if ( + explicitOriginalTarget !== this.treeRef && + !this.treeRef.contains(explicitOriginalTarget) + ) { + this._focus(traversal[0].item); + } + }, + onBlur: this._onBlur, + "aria-label": this.props.label, + "aria-labelledby": this.props.labelledby, + "aria-activedescendant": focused && this.props.getKey(focused), + style + }, + nodes + ); + } +} + +export default Tree;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/stories/index.js @@ -0,0 +1,5 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this file, +* You can obtain one at http://mozilla.org/MPL/2.0/. */ + +require("./tree");
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-components/stories/tree.js @@ -0,0 +1,244 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this file, +* You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import React from "react"; +const { Component, createFactory, createElement } = React; + +import Components from "../index"; +const Tree = createFactory(Components.Tree); +import { storiesOf } from "@storybook/react"; + +storiesOf("Tree", module) + .add("Simple tree - autoExpand 1", () => { + return renderTree({ + autoExpandDepth: 1, + }); + }) + .add("Simple tree - autoExpand 2", () => { + return renderTree({ + autoExpandDepth: 2, + }); + }) + .add("Simple tree - autoExpand ∞", () => { + return renderTree({ + autoExpandDepth: Infinity, + }); + }) + .add("Multiple root tree", () => { + return renderTree({ + autoExpandDepth: Infinity, + getRoots: () => ["A", "P", "M", "Q", "W", "R"], + }); + }) + .add("focused node", () => { + return renderTree({ + focused: "W", + getRoots: () => ["A", "W"], + expanded: new Set(["A"]) + }); + }) + .add("variable height nodes", () => { + const nodes = Array.from({length: 10}) + .map((_, i) => `item ${i + 1} - `.repeat(10 + Math.random() * 50)); + return renderTree({ + getRoots: () => ["ROOT"], + expanded: new Set(["ROOT"]) + }, { + children: {"ROOT": nodes} + }); + }) + .add("scrollable tree", () => { + const nodes = Array.from({length: 500}).map((_, i) => (i + 1).toString()); + + class container extends Component { + constructor(props) { + super(props); + const state = { + expanded: new Set(), + focused: null + }; + this.state = state; + } + + render() { + return createElement("div", {}, + createElement("label", { + style: {position: "fixed", right: 0}, + }, + "Enter node number to set focus on: ", + createElement("input", { + type: "number", + min: 1, + max: 500, + onInput: e => { + // Storing balue since `e` can be reused by the time the setState + // callback is called. + const value = e.target.value.toString(); + this.setState(previousState => { + return {focused: value}; + }); + } + }), + ), + createTreeElement({getRoots: () => nodes}, this, {}) + ); + } + } + return createFactory(container)(); + }) + .add("scrollable tree with focused node", () => { + const nodes = Array.from({length: 500}).map((_, i) => `item ${i + 1}`); + return renderTree({ + focused: "item 250", + getRoots: () => nodes, + }, {}); + }) + .add("1000 items tree", () => { + const nodes = Array.from({length: 1000}).map((_, i) => `item-${i + 1}`); + return renderTree({ + getRoots: () => ["ROOT"], + expanded: new Set() + }, { + children: {"ROOT": nodes} + }); + }) + .add("30,000 items tree", () => { + const nodes = Array.from({length: 1000}).map((_, i) => `item-${i + 1}`); + return renderTree({ + getRoots: () => nodes, + expanded: new Set(Array.from({length: 2000}).map((_, i) => `item-${i + 1}`)) + }, { + children: Array.from({length: 2000}).reduce((res, _, i) => { + res[`item-${i + 1}`] = [`item-${i + 1001}`]; + return res; + }, {}) + }); + }); + +// Encoding of the following tree/forest: +// +// A +// |-- B +// | |-- E +// | | |-- K +// | | `-- L +// | |-- F +// | `-- G +// |-- C +// | |-- H +// | `-- I +// `-- D +// `-- J +// M +// `-- N +// `-- O +// P +// Q +// R +// W +// `-- X +// `-- Z +// `-- Y +const TEST_TREE = { + children: { + A: ["B", "C", "D"], + B: ["E", "F", "G"], + C: ["H", "I"], + D: ["J"], + E: ["K", "L"], + F: [], + G: [], + H: [], + I: [], + J: [], + K: [], + L: [], + M: ["N"], + N: ["O"], + O: [], + P: [], + Q: [], + R: [], + W: ["X", "Y"], + X: ["Z"], + Y: [], + Z: [], + }, + parent: { + A: null, + B: "A", + C: "A", + D: "A", + E: "B", + F: "B", + G: "B", + H: "C", + I: "C", + J: "D", + K: "E", + L: "E", + M: null, + N: "M", + O: "N", + P: null, + Q: null, + R: null, + W: null, + X: "W", + Y: "W", + Z: "X", + }, +}; + +function renderTree(props, tree = TEST_TREE) { + class container extends Component { + constructor(props2) { + super(props2); + const state = { + expanded: props2.expanded || new Set(), + focused: props2.focused + }; + delete props2.focused; + this.state = state; + } + + render() { + return createTreeElement(props, this, tree); + } + } + return createFactory(container)(); +} + +function createTreeElement(props, context, tree) { + return Tree(Object.assign({ + getParent: x => tree.parent && tree.parent[x], + getChildren: x => tree.children && tree.children[x] + ? tree.children[x] + : [], + renderItem: (x, depth, focused, arrow, expanded) => [arrow, x], + getRoots: () => ["A"], + getKey: x => "key-" + x, + onFocus: x => { + context.setState(previousState => { + return {focused: x}; + }); + }, + onExpand: x => { + context.setState(previousState => { + const expanded = new Set(previousState.expanded); + expanded.add(x); + return {expanded}; + }); + }, + onCollapse: x => { + context.setState(previousState => { + const expanded = new Set(previousState.expanded); + expanded.delete(x); + return {expanded}; + }); + }, + isExpanded: x => context.state && context.state.expanded.has(x), + focused: context.state.focused, + }, props)); +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0.
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/README.md @@ -0,0 +1,104 @@ +# DevTools Reps + + + +Reps is Firefox DevTools' remote object formatter. It stands for _representation_. + +## Example + +```js +const React = require("react"); +let { + Rep, + Grip, + MODE, + ObjectInspector, + ObjectInspectorUtils +} = require("devtools-reps"); + +function renderRep({ object, mode }) { + return Rep({ object, defaultRep: Grip, mode }); +} + +ReactDOM.render( + Rep({ object, defaultRep: Grip, mode }), + document.createElement("div") +); +``` + +## What is what? + +### `Rep` + +`Rep` is the top-level component that is capable of formatting any type. + +Supported types: + +> RegExp, StyleSheet, Event, DateTime, TextNode, Attribute, Func, ArrayRep, Document, Window, ObjectWithText, ObjectWithURL, GripArray, GripMap, Grip, Undefined, Null, StringRep, Number, SymbolRep, + +### `Grip` + +`Grip` is a client representation of a remote JS object and is used as an input object for this rep component. + +## Getting started + +You need to clone the debugger.html repository, then install dependencies, for which you'll need the [Yarn](https://yarnpkg.com/en/) tool: + +``` +git clone https://github.com/devtools-html/debugger.html.git +cd debugger.html +yarn install +``` + +Once everything is installed, you can start the development server with: + +```bash +cd packages/devtools-reps/ +yarn start +``` + +and navigate to `http://localhost:8000` to access the dashboard. + +## Running the demo app + +Navigating to the above address will have landed you on an empty launchpad UI: + + + +Click on the _Launch Firefox_ button. This should launch Firefox with a dedicated profile, listening for connections on port 6080. + +The UI should update automatically and show you at least one tab for the new Firefox instance. If it doesn't, reload the dashboard. + + + +Click on any of the tabs. This should open the demo app: + + + +Then you can type any expression in the input field. They will be evaluated against the target tab selected in the previous steps (so if there specific objects on window on this webpage, you can check how they are represented with reps etc, ...). + +## Running the tests + +Reps tests are written with jest. + +They are run on every pull request with Circle CI, and you can run them locally by executing `yarn test` from /packages/devtools-reps. + +## History + +The Reps project was ported to Github January 18th, 2017. You can view the history of a file after that date on [github][history] or by running this query: + +```bash +git log --before "2017-1-17" devtools/client/shared/components/reps +``` + +They were first moved to the [devtools-reps][gh-devtools-reps] repository, then to the [devtools-core][gh-devtools-core] one, before being migrated to this repository. + +[history]: https://github.com/mozilla/gecko-dev/commits/master/devtools/client/shared/components/reps +[gh-devtools-reps]: +https://github.com/devtools-html/reps/commits/master +[gh-devtools-core]: +https://github.com/devtools-html/devtools-core/commits/5ba3d6f6a44def9978a983edd6f2f89747dca2c7/packages/devtools-reps + +## License + +[MPL 2](./LICENSE)
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/assets/README.md @@ -0,0 +1,1 @@ +The assets directory is mandatory to run `../bin/publish-assets.js`.
new file mode 100644 index 0000000000000000000000000000000000000000..c5d114d4ccca2078740fd12a2a31bbf95f39afa2 GIT binary patch literal 87062 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
new file mode 100644 index 0000000000000000000000000000000000000000..b439184495807d84bdacaf029c6fa9f8e1fd58d8 GIT binary patch literal 71842 zc%1BdXH-*Nw=Rm<6%`SsBTYI;?;s)_qz0r)Zy~hMLJ?8vpdh^|y@pQcph80Loj~X< zv;ZN5dhvVT_dDl)2Y=olcZ{>g$QV0&uQ~U8=9+6hbMC!@U#rU9xk-MLfPmnRg8WMj z0s<l^0Rf@+^{eMsN@T@J2?%aKwvmx}tso;q``Q^~X=86eKp-C+1GuKE+5RY1U*q}> zj(e9_z6-8WWx7jCiHu!Wc=!6n^(&;JWw|pGvRBw@SxxnC(T0WunZCVWGD>ux)WVS6 zM0!!>fz+taB7_;$b>gy=%zGy6zU0eG&^B3m<^64~OYf9@q1;cKlb(>JH8X$-ube)7 zC&F!6>T<<sc9xEyV{CWpx$CWo7c~x?5!hbL8EXio!(9pj2Ff`G)w`l3b0h>aYxe%! zWCSlnhtS>aq(K<bpqP)JX$fAIJ<gFY{q&ewp){t2iS_3-Q)7ZQtw&1nm)|7|N$^Id zT%K>cL0dKF;^7_S{$jmH)xwE(^Sy_LrRAfR9j&17=*H0K9ay}=Jda-CS10yv*{9~l zMiI0D{99-2h_l$P+x=sdwI%ABAN}voCBL28&#@v3<ynZ}+m3$mi&p3T!GlQpQnGnS zUV8J2`jM|&1aaXL6M}b_?{*44Hq}-7N~ajPPu?oP{=J24BIA2K@>{NYGDBC$<M7BO z4DSn>SM!DPi&w*EH;|M~Z9GZlsebob9J9VN?`US2W{LGLi5V$BYjM5@Th5fb8hI$u zp@zLdRenF@X-hJe&Nq&IFY@z*Nq&N`ndjR__Oa%i+Ckzjni-d~8g(fJnK{kF2m{e* z=EZkT)yFI94v!5Cr|)Mp%DxZVR)^S&3ewZQcw@D0t!lIo53=GkFc}ari5%3`{F!xJ zN+<2$@%1Z3M8LfnLhnl?K_*I<^=R*GPaN7E%}TBYNt#@ulfPtOB9Z@OHz+1-`z_6l zogZoUoTPiI(_rRbZ|!_L?X1?BND44-w@z)LrxN=pL;^reIRV73?5CED&!|@K#?xr} z+Uum#^v6Ax-(yY;+cl9Hc~WxY(iUpv{cQBDauS!>$i;0A>RFcW0o(D8(S5Sjw@jN! z6uzn#jMrbDCGJWvVO@FOe=Jw7^q%JkZtp15HbISpPtp3dQCZEbHB-U@5<F(9xdkD) zC#m19lP6(sPKDCqu{eC#+M@E}x||+Ec+-<KrvjRc18)HRUGJ-B*1<*15oR1?!t2jR z-VI-7a(h(p>rLsPsaWHKRC%4BWA^tSIIMEt1$DvmC-QsOb|o#X!k^z$oEB_b?CB;2 zT~A~GAx6i=$RD>#)YN8Rc`psf6KrE<v2p#~!4c<)cfEyt<K*@E4nadVdV-$T*9ki+ zhylWxAx(l68I-FRXlDP-t>#s?D*1Tk;n}$ef@f0Ho45JD5$(O>>1w|!L;#q%aoqgy z-qmy|v3R0_)SJ)g(84B{bZ>@8-O#-y;O|^QxPJBM2c6^Xq4!rE?;2bINQ+kA*!)%5 zf6M6oCGIPq?q8v!<NFYiOE(d8$@J40t!j|yT;K=V`|@H@L7BAPFF&wL#nLghd1X?L zf7GIDdYbdurOhIfuqM=%-lvUXfh6R+me!Numv_{ahHhYA1oS_1WlDT+nSr;at0m`< zVe1dDzT<VbA!PbxU0>V^?Nx5QF#lDPrFfF1fRAr)=sss^dGxkbmqjO-3cfa5*BAkQ zdom`M95m>}<ZyS?ik3RO9Aoc&zwss)0yod^!Rt%41;4gke1%*(z~q%9-Ie=u*I7OY ze|Y+W<t^7N!|Y|GXu}7(r(fD=$?sFmPKPmP-(MyH+=tzdyhjmC)j~Z-8~jp(KH&>e z{w>2JmN>1K6E8&MMU>VUuu&49E!ro{Das^;{kxdSJ}b3fYqM%gS+H7o`-JET;S;h1 z?k5plVhQ}uA?9lq(DuEK+nNtqUOg04e8?DH_EqDRuyT!*r<5lf8(RSznq5>Smbva_ zmGXY>I^(#*c%&9%KFe^RNC0a(G<!2cKx0b-HDJvrlgP~BAFHIVQjngKBcAT_Iipjr zji}ve;Zdh{+i)AWqaiBpi{NKmR2pL%moclK!D*s*)BCXZ-`_`GR(kv8#mAp4A17}H zgt*GuwQ{#Aw`zx6d&tEm0eH&tgcZ-?^z~+p8(Rus?Yo()cr9^?it#IyOq0}>HWMoa z%Qco9mbhm$8V;J&uhlh5HG|a?3N*euzsU;q=ehkvI_x%_9L@vhfalyuB&la|WG+m0 z^mwuS0hdprEv{XY-<mI{1<Lo;Fw4j1Wfc@@7HC6qBMOr8)il#G8Vyh0d!4;p42F`7 zlY}x;CwZt54s#C&^~D#L>St)1z1CFXmD2oHBfDE~+4M-JQ<F`_E@R|Lkp!@|s!l)+ zlCiJ1L8eTaO~xCb2e-GpyJEd^Wi80nZM9<cHky3(75dQ%b-z!pT))eJ(#T})Xr|z| z;vz|HKY!oKQ*pv4gv<e20o_+Qu5R54zioCWj$(vdLQsSM=JO80d;u>LW!`=69swv{ z<J%W}PR|tt$1MjOLJ}vEvJ-XUjd*3cDZ4x@C%Z(L?lTFi&8g)lyG|zCZd#;T83Ct( zKT58bJ}b$s^svYSC79Iol(p^@#58Ds8m2Bd8c`h4EWA~SE<%mPPm};z?H$Gj>`#DX zlOyAeRlMc%6F^v<nHnt3wh7tTei|B(5zseVB6IF7v-Ei##H4D6>a1!(GN&*}azhH4 zsGyLatCM3pSa@kCuAs)Q7JX@SIXaxlg?TFhIiHP&J5Mf-EcUpnxuRC57r)Q{*vZ}V zSkGH-#~{)8uFe*=ZuGZNHV_-=J5FH>C&4Lk%ZJ>D2StD~MF~hUHd!}0H_4sWp0b<{ zpAuf$zqCt8PI$xrhd=r<=$g&d(t!N;SF?pw^@Os7<H;$X7*HPzweY=stRYF7B4V-j zDUbNYofr7;m2YX;pV`Zd{c_CMUf)J#-_QA|RuI3>_fy1F`lS+sxU<`Wf7|zGTe<w| zxQy@&*?twC9UflOeA8*fAsiaH5mFwe|Ja@1NIaFyI8I72NMS6ATWAV&n7!J-yKeQc zyPAK{dI^~jXO-965fApNI<_BKpAY`fGS)&EoTm4-P;taW<MqHu=A|lP2=5UiBD(y` zAObuOU6xRCQ!+|B7Hj3OkWn<wm$S98mFx`!^gvP`#aGd9_;~3aHtu~18w;aPSm<i$ z()4EZ6=@PyVzYD532at=&9Ktp);|4Joc8vk&2DLD%cY@3)?XQ_1#P-}(Yd0%;>Az5 zekI2XBbHfv7JGpyRwAIqdMo@XzNrhbT)r&G(Wh79Dvf(l{ITv4U1-!JevT1+gX(H` zh32ReB^IT@xKkq&?UKfssj@K(?8n59N;e_CHxKe^<)QMru8<n^4i(!rX+0^B4G3`1 z!&k;@dS|udXI3oivhL@zN$Q^&?C-X%Eer$gC`as#l?*zKA$BQ<+7mSC=yLJaI5$|P z`_&SBE__R%d)l>T2<nQk?6B-#f|h+QtK~S<A927Nq`vVj|5-QJrW0Po25UsY$46?W zT#ja`5=9l=yeHZxJ*@!E&_u;w9RpJ>Q=WBco5ACQJE4PI+K^#f?D|PrWK*%7U(4wd zD<VIiko?++R>pApT4Mn3-71<LaV__;<83H?7(Juh5B2_jvL>ceFSPD<Y4*G-f;f#^ zs1(a^V(xTDgSXi7n?Pk%0cRt0e(0;F3KoiG_A5UC8V9J#wA#cB+V#Bdd6@b{ILXhg zM7?j!k8{yLZE!vNXnDQ|Wt}>LbfY`?nH73U)(i8fOm0|k%bP9hT+{?4Lx+sO)o%uE zQC>UlM<}%_;fi4cmwKJiO{5Wur)FL`M{c<W-8jlMeZAHRYq`=Lq2CYNM5a2`q3<sD z?AASTH%4{V33~gr6aEaC3%p6JL}MeCfBb79lHTyHVNRV-oj#46L?i0grYD|ZxqW&1 zXHG><R&Pa`wm8glx^EdZdTM$YIvw{u?$?Q|AM0riHU?8b;^%ofEOJk<@952e*Ftwb z%oc=eD2I&lJ(f7Ie&%9*;DfnVNqi(J;$x40c(gjco!pz*YhkS1IOKQd^w5OC#r$RS zgE9uWOSc91grB?<JR<nk`m3C<9-+RFiQ@{U9T3g9;(zub%bhP+h@hmG<lPD*!G~tv z4!5z}wAnv%4i2amZ@ku@#0anow^s=a=xTX{(s@6A;#qKmAdmVT*Uv9sW`Xqd#`{ub z?w72)VyBN<UVN}RPKh-gnm*FKc1(MA`E(HI>!{{GeBLVDaFo|`As~3f`1^NBL4#rY zyo;c)(b9F*RZ$i(0|7bTnuAO&I6Z)l1iue450UdzpoQyOS`VPTgNulV_|t!l5IH~p zeVOYi?Z1Y&+KE5aRe4P-19G;Y<>%z%<bEn~la`iN%-P&hMC0YFzs1l0i9fY=b#)Zs z;&OL)=XB@g1UXxA@dyhGb8$cCdj6c_d<2J!r-SQT4-N+x`oEO?qvxfCi<z^HqpJ<b zf%f<Rx27PltN7EWe~<a=`0GKgHkSYOBnOwjVVwiy`hACshm)J@A~6dOn?H#CzVnxu z#DB?&{Z=NT=4@keZt!ojBzVNQ{>Qcd9IvNg;R3P;|23YE?{A6!e)T^k{_B>ugN>`i z^S?#@<MMw>$$)^4&K52%|J|<te(gWUzqSUsg3c$^*~U!4!PUa~eBj>*{(0b^NBpNQ z-3u}5UX1a#Z$)0)cv#r$zO(^aIQ(TXAOE@7g|{vg)%&meLc-7gyQJR#kQC$kk8t`c zR=NHTR*9QpT>lPyiJK>7{$K(EDFTI;(pnyu)~9YI$1Hk2JG6?wb(cGcmqT94zu81e zwv`G)2?k`q6Lq>{YwaQghBJfv8TjC*b6NWg`|(UmIW;Ef3ic0@)>v%P!xKpg`rDwj zu=qQyZ{(}5Kl`B65p=uj>)X$}MG1PmsKm;pj@vFr#SL-jx_T4@-&F9nyL=k!Eqk_` zHaGJl;L9=dT(jtX2>R)WeV7pL%!^;_`aN2ycLbL%U-`dJn!n!^JJ}oLf$Xn87Im|K zNJb{7uC9)D8Ol{JnoO8aI8hIr_=di5v9Of!&FcoZtnAv0mCt-8x&kFmcujQW!ux%3 zmoJa{<mGYxr`o?xgv>Abqh*-1F8z<k{_A8fOG-g5=KSEFYA?;$jUc(uLIQv2mAlkp zW7=QpcXbSwzX)A8=+b3EmcH2#G{4=5u9Ns@-VES{kGxHIi47X~gMs|=g(khKl?r5o za@BAD{NiAC{4a!r{wn%a{4u_`QcW+%nDqbjz5KlcxL{*{#@i03DSFP27kl|z6Oo94 z(-i7XLE43;UwQRO%FxhoeY~7`+H*PO87HShZIkKwBo3l;)id5~!QzEu$6<3`=Ji}* zQ5R~EdDR?(rsLHXQM}ND-&wdVyW$@UIv9jeiB|n09bF|I(=j0K_8hUh*iHK96ZclM z^6INUsH1fh=UY}Oz7Q_A{dvp;ZVZt>z7XrD?03!BzGT4$rVE3)g!EoDb(N-_$%PU1 zIPpB-WL&2A5-)VaFCD2FuQAmk|N9qBgNgNdte=A({9n-j3;KUS|9=DeoB3EoSM$XL zW%By^vDf^*hdXv%_0XAndZI!^2Ri-`LLTyBrj~>?=MS{jM>NuSXnO33POV;`_j|w# zuPP|^)fdC}shM?8UQ1McNJ{!qi*6%q{lUeoDS4f8j9l_;JOmkn0|lpfZ!u$%48w&H zL{Jx@^*=Ce(~V<9@jUhfSlM(cnHmNJ);YEGBM>wk$6Fd7GnMWC@TjJn>*1(j%Af=} zX1zkx_=B?}LGXPA+s|EQ%GeqV85uQA#;foL)tjTjuZ1t>*-U30nxKhVpJ4e1)zEQD zewL&T6a@{q&MtkH${+nOROMp!ULp3Uzo}JQT*dhuW@c{$qAJDvohTijoOQ4_ySczG z8{EAx49_jT_0S#pqKtYn;9|DBPHE{+n1CG_ms3bS2qZ&5;164+g`wroj4r0n8ONJp zsoM~BO1rs~>{k>S(9-8jYE+Z1E^zh0a{7s<e<%o4F3UBDW@in2Ec9FJ*VT3@S^cU- zH%)&bR$6X?%k%SlgE=jq&hV45Reoe@;*Re1UiRSgYJy<!yTXMy!WjHr1<-rdks|o? zg8)6Vfk0D468Z|%<>jAZAnlg<^Y`b$#V;-wm$ehXpa)eu{uSBcCyK5XdMcdeBTpI? zvwb0lU%Gtq)Nxamto6J~Fk2rhRX0e!Yal2nh+V)T5UMq_Yj$=SvnikMRd2@Gyk@!B z?|WJ%T?ZH*hoNVAFT8H%i2Y$y@w+76{o>+@KNK^8=gU?6ie~b~lY0n|nyK~k8CJa* zg!sdA3+dwLE}n(HrgPmV=mNJtMCA8(&0yjm51B8VasSivG_z@JTzPRFDMfsq!XVeP zh5m@T8GLq_pK>uQuV=K5Q!?DGfAERlx$dJ;z{Ve7$(*NN>h~;v@W~0=x$dS$+dsgf z{#~KpQ+E1;PmIrXpJKH|{{ZXt`E&%Dg#5uLXTNp-Kbz`jt8YCo@Ytc$3|6pePnskD zw+ZFVb&)C03!fEMQ|k=ca9>OjhnLUG)e~X9%m0Gx|4y4jyjkPxKkoh5?5ICA+Uj_; zu~)$&htr>8Ws)*ExMe?42GqSf5Q2UyTy$0TV%B3bX~p)Xh>HLAy}!)8lKjPc+XjCx zz%UR0+1grAiyAw@Z~lCG-a1_CH($AVv8P{NH-L~`yzHC5Jvb*ot-<fS7sm&!<A(Sj zl30M^Ipx1r3GBI8^SkCs+#izcZPxR^kmjcnk-1p&<<V)vKjgyPD~eaOL0-cNpT=r8 zE5}CesgDezJK^wZC%M-C7!otrNUlvAvyMN+l>3!WzB9FNRglizD0uB=SXK1%@@a^o zf!pd&A#?>vdU~|8>K~Zn?B?xIExH&VlZs6MS8JR@Bfo^>Ci8qA7=)D$&%aQH!2iYN zrpfI$?8c>HMm{I*A5{@0*A2)h^@@odf+wLhB8?|I5k{jkFaEH6<V}q0cNUsj%gAC| zo5b<XL!{3Hya`9;RD$&6VqRJJFBc||M9mZNX#`T&&(328!4OTkKT);u^{+9oAq^wS zRw7o)Lt*Hx+pLyG<Z3>+Up%#aHG8F>V5S?LO<|&-Q-p4e#B`a@D8D=WeU2ne^sQu< zpg$xYCPx#H;X2y{RV9{Vba*SGs1mFW{zj*W(1wr2e%mZDbeig;DlW@NKdktONy(uJ z6Xi<Nm<frSyT;|f>4>EJ1MUPV8L^{i8n~p`wza)TpYx(W2d3Qbz}I=*-($wF5LDza zb`{$BCU7hzytH)2%s8|+EyZ{rLv#Avc9&T6#l<l-^>A#WY@oWj@Yz{NdipcP)Yev@ zg3Kr2jELW!Ar(vLu7sydm#wiqw#*|#zY{iT{J6CEJKg>w&1M=shYxbJv(arhuS@sh zHywQx{@UniMNYQRatT)z1IPv`PaQu3yMD0EEcqm@c2g76k5d8VdCA@Gr5tVe(rKV6 zEXkQb;xxMEN@Q`v%ANX7DR@c=vrckGt|qzrrqIjIuSYf}AxXB;UD|s)J#?<HM$@H- zbb6c;)wnw1VbeR7J(y69A%*!e_J~$_N}7VA(vHSGj)R%!R+$A~s?<hh77eP3aQ28S zzZb%F;nlxLj81KcCz*}!s<q5Vic_c+Psc#Coqu%>PD6B(AwP(mM%ocr=qZwX<D&TI z4kOBEj#LVFaQ$jQ24F5IOd5ET6RSH~=q)`Xk`-eg`)Zgc>wdwY^zt3d*5v*xuwAnd zE~IO^M?12WBkk1a2ZflW(rA4po00cUaJE&K!9CRJ&K)Oj3uZdZCqv9Yu^S_}iYOdb z$?i41H;0?MB`Em_T^0lL>#nGD)f?P}#y?0q>)CLcF3gySW35M((5D^-a<u}L1RhGH z2`64zH1^(!Q|aYu{ZPGBl{DYM8;P#2zc8bPS^Jwsx0Vpmj2n#RMe{dJ-p><qTk8s% zVh?qS87J*#`Jh^6UcaX{invyH{Y{Ro?X*D?yM)uYU!<Q=j2<-#Lw`c`GJB}H?33<M zAJ)mjN*Z0iR@DL=HK1~r7*wDYfv9wsRWJRFbf>Q9i3R#hk)rU&;ZE&TXI=*b=@nJL ziwaNwx6Gdxj2~6^Bn&g0z}bLo$w_J|!SkZJz>@)=v@lseRQNkbRSKY}yWioO$G6ZK zu>NWg4bs=gdm(kY5-0Dxk<trP1&lgCT#lzKjMqGdJ(z~uyKbnDZ|1K%bVs8iWX~#| z)}doATp2}|S1HMguHAANYK3=0vTn9lj^9T+@910gP-}A|usvi=4?|<^+Z*a_iupK? zy3(uH!|>|kW#(RL-JrQ~ze6J=w)}Vph2O(E9n<3wEE{nEvfLU=pQCSH10&0)tTyNm zx$K?nl_-kID6vV&Mk^<=D8YyzIf=8pcx=G6`2eEJ7_KRIJF(PJOP3QsvXi1#xSf)n zMjcRA%o#Oz&@+HMEj&DG3QtQ_uRg8Mr@AP^nY3IN+nw-h!IWFMo7J0{9(I-L802IL zh*t?odL$uVV^*r-fl8P=PPp#Qfj9wB6K>#O8R176$|=Ie#LOc1Dvn>WAR?89rv6kP zv%AF}QsW8O2$4m332a%%U0X63LXHsKGTo_G7PV;K&5akp`CtI3V;k?Y5h9|3YIM0| z*hD?AXjGEo($(+u?cqMlk<q0L*qnfo1SPg8i~(K{hrmg?yf9LUltk5$&U%sxU&zKK z_s3vnau2)Ok{cAvyfPK0(QlJjGihIVZEsZBjfy`EZA_(c7012TOx&_fU~R%C(7*@t zPO`hpCC_s?{uhrhSKE|MiRsAEoTy}@uw^Bc?X=ep1T&Dje@%4UZ!4{}w+Y{`I+-uA zymYW?NVW*r86m+O)Hc*0C<G8qFeR8cu2#16TSh%C2LNE~>SDml3(ME;E&PlYiEE+0 zD0+@?a)%OO*UCi4N5A&*Ai62D{n6%GF3gzuhte&L;z{#)N6<)OgWX8=XcwmPa$2ac zm2F)HsFfb&l{Zz&g4v+p>bT_yV;id1uc2-H4Abxghz)GSbnwm{`PFf=-qcBjl&md8 z!eLx#Q4sEN$abk)O>T6|MD%2gh=uBr6O65|LR6sVBs6pmiA#GBcZ_*oy?w&m!bq0f zCm#4>SoorM3e6=CpQQ-#bm+?oi1;>@S>%CF);!k70cPkeUotR9!529-QDFR1wb4nW z(<scXrF!MrqPxw5v1yt~o#LPz08H&me?D27ss^Njc;!{M62@bCZNYB-VDnW+^jePL zww2T7D5y)X@?=k@7v4?QweoxgGGQfge^}faeL(EPXUTz|)EyNl%*BuYD&3E^svI6H z5v<DYu@a!EU;bV_mqfGqTuK685eX+#wR0~u{1+_}`qz%tI@t{|qQn4ND&fH-ua<|$ z$HvB-3mFs@cT`0kb1w&j3b<!vhF!(~y((@F4G;5&H@J4iw;{jVTZ>g8T!_U<DA4ql z972++#ZYqcsgX`;4#y5m&6g3D!N`b%4N%fy{YK2$eMwKobn|_hR%WiQg@VVT%7mls zebjyj!7_=tw<K|u2V3RvrD63WxSc0kIhTS%#8`&hc$ko<DueXyp7v3abNxaf<A6nW zOUyE5oJ1dXzZ#GEf{TN5sAUHnP?!Q$WVEcJ-Q!e(Y!p-q1}ckug`o8|en?Mrnk;w? z9=7_l>UVkmtwc&+s%9JiQ*Q9bGJI@r$F4MEF=;6=r9G~YIfa}=^Gu#^^9>DG(fGK5 zwv%?U^IF&JQKZ+~l2h@CYF?c}UDOV5)tm?JSTmy|j_|||`gi{}Q*zThAWvO{34S}p zdhIR$S}0sc+))WxSBQ5oTilg=WL)EAWUMu5LsjH5X_JSH&T2pUR)O^?k)*~SZ(y{P zY~NdS>bzVfYkH6q(c56zjB_gv4~!Kf@6-W>9m2a%n(bxL3RVa*(3{6*SL<CwUdx+k z)U{U2rR*Uvft6}4n#B$GxA+WSe?|T(-ca;=U#VANuM$MDd8+8`xY<(An?N|JbH=oF zkP2)HR#9;L{yizUvJ=i&&@dTi*z|PT`oMab4Q9m|R5QPmxV6)aywwxpu@fh}XuEHI zd3@ac=TP-}EeqyAT;I9#c&+rHjWMzni8H<z$0%qcb~-kn=pd4y*>?ALoGe^lxboGd z$F+2j^8gtiJ&%@JpQz+wQdN|N*5&rB%8<1kTXR^E-)&Ij|7Q_h{n$LMP28e_<Fs2- z>W{}e9Z>-gCZP&<Z{|v@zO>^zC}HQzQ(D@G$JT79<2uP&sEljM7-#AvZ3odb84|I@ zQ&c&3)7!9{F-mjATM!BUmW9!%gfyj*A=s(ybMU~@H&XdWH&U>2PThVSApuAGa_a5( z)t}eqR>Cfi7CpQl=e@L4Epnqz$6~%F&!s5I0?)kFI18_?tCZRj+_7^202b9Z?z)29 zk<~Xmi6&v%4cklA>uD0Ck`8fK8C_=cnbU$MqpWt#UL+?iluPV}5vhx#tK)SNnphjM zzLEXa&`UANC!Pe>WEu{+D$Di;jD%N$;7!FKy%_Oq)`&D8WxEsc^@(?6G^%D#9F_k~ zN|{88ih=7^EqmPdG__I!Dn<-9R5~W-HdIIfYE;U`K>NsRzMt>Dv8vU5u-G1gKHPEM zT9)x+yDfjGbul9&m&0;uC~zHxARPF9YFELhC++P?Nd>vZ$0I;KePH3eY^6VuB1*?u z_w2?Sm}p{Mo#4o+t<2{4U)6%RhVr^Df5U1~VdH3iQoSlKxu}~KuksIubob7DdFM10 zw!M7T9H*C{9*0(HeBw!}RQ&W3CpBs<j5$>2)$Jnx%y0W&WlK3ZRUl)ZKJimfPU7Vy z7u-<RITnDg&_@R6HQ<Z%cQn6!TJQD0J0w^{O<i`jO`KC2*5zKU{&&X}p#6>Gjj%2x z*EmpymU%{>{1%xH`x=cG-C9(WT>g?F<+8E}Wy*>X#gU*GS%K!(WCszTr3jEJ@nI*> z9h9tC$+1pu^vH!X((V!GI>YB$+NzUvO^kd`u5l<A686-0yA&@hH@Q{OyWM~4y@kUG zELLxxU{ehAz76t2o+}j$p0f{({f3brE^Yqja%>B%>C~}a*8~eTVgmt#>OiVG$u!^> z?59iJP96O^Cd*IGdAPZaRDQs(OUYRc=UwFbLZFt_vS;%cJ;eET^69KXzpF`oC)+h+ z|5?7+A2|hb|E7{(>a+@Hm{x`px#AH;KzAscqy*@7{(7;>=Hv0hcv2dY3Wwpx4iqwO zv)VZ%{jaUFz=t7uPThuEp>hsw-ADBf?Qy2#KWPx}J6y;2_Q!-y8x%@lQ~78m33r*~ zBy-HOdo-%X$W=EP=bSFH$>l9;_tq+Kg7zGuQgkAGs?4ovOP*7YJIAoEwlc9SS7P^< z6JV!M#o4{-xWfgr&f5#0Z&Gx)Ju*IDG-}#U3TU~5^5mA#oym?(F<hfOpXyKLQmXY> zZemxV6MD&HxN|(}Y9jr=Uu)!DZVz0UJrMR%_O#U^jW)f<ag`=-tHPJU-8TEEC|p|4 zskPnj(P)>l#;1kM)-f7CY>{8M)!7m;q;L6&lY;Z^uQh6e{>gNHv>>8!VJ;Plv>S`2 zX`>N@hCcHgP;Ko;wCW`+6VZh0M{yBWHDZzuaDdoWm)_&&sYWSjz6`w3I)}rz$w$$4 z8BfdSrGJ~%KxSPSP9=&?ET%EMPr~df2#_~hpJ?R8Kd)pU-{(U$)aOMJR+a*f_D3dn zVi|>tnYCQ^cub7fk2glfYRapyO5<~L{pvbS=E|vJEO1v>y@9?)L(%ySpYEnfw&KKx z2~7LL4v|37>4=Hit|rrVVs9qp$Z>@0vT=wEO=sgoio&F52B%FO{#9tJx`3s!mU3<g zsyKgT{~CVDj-DJh4Bx8Sl!t4O-BG#5i`8yf$V0qzAN*`}^c5S#prY*g96`dQ8kWDQ zGr+Ja`A_ZtgZ?$lMW)chL9cM4TD&I4csIk_Te~Yam27vZH&lVjH@PTOyAuH4RF41d z>b(=%TEiiDot>}hq|^<+GdBJ(>M@OrT3S+FqQ_Z}ZjCoEYWk_>aF`I-fhjYg#?ppe zDPpS-6k+j|X+x`5lD9{qp>}eWv8vdMGgYtZc@=};85@goPW+;HZT_OT^I{S)z% ztc6WoJd(H6dok7=sgS0qWOjVek*T)alAz+l$+vGrsgyOif*A%UMV|sy_Xc8tmFsFt z5d6f3$~CxJ3YkkZ@>7CYFNcqW4rn^TAdXMMSK7cGn?MvUSnSOi+gS3vin$;sNt`60 zV@+r`xje&5<MeWuyd_v$!`FQ^KG(RRw1~cv!pvqTHCLIE*M~||n`$@zRxe`7{B9bA zGvQaPfKs$DJ55?W*;2|AtDd9@9V=VAqx{9v@2lMj!a@?ND$_0>z2b!HAip|vYZ{<< zP}o3MF{nV)lgkRay`uOnT2j2O)-^Xxl9lranT1KQqwb+<8vr5HBwcj^3qEziE7d-h z(v3LS1+8V&-Mz9bFcjK=wVMk!*K-FGC%wTb@20#T<j{#gubg!aWNA!Vn3?Sq;#GQg z9~n^yj@CbtJRJdIQnI?wGEi@JiWttY6f_aU)RWVBl^^c>i(NiR%}?r^4Q8(w8#1+g z$pP<5TniVS$EqZ~d0(;miQLrAxgPrk3BxtCuYK5$oY+8{0W}>q_N}5MCHL1u5{r`N z+S*-2u8Rr6v-#2U8?j1}%8j-~<E2b)=4Z|}!qeQfNloe^A4>T)y?A{aeC>v;=zH>J zheo%8VeXqj-RMr!on#VI+rUf5>#_=tBKVmGvu?Xm8-On=2|Y=^NMZ%QF?h>Q-XY%x z)uVedaX6-#s|MMB+1*ow@pAI4Kl(tDk)MOou&P`8r>S(TCR!VT6F)+cu~k(Z^^Fci zf-!3$7MPXDr>gZH>fXo4#}<CqaL|aOEx!`sF+)Bk#bxCE9JhN564mY&$T(KWa6PgN z0+1xfiC3rV(JDmqoVd7{Vt_a~l}pjX1%Q?eVrCmAhm+2D!A2?n_3s;<^AxCR$&sv) z59Vq``X{#R`iIsp@rBiE@TM?LQT(&`nruEjmU_sr3<eL0v;0}>8A;li8X1_KMg^NL zDG7y?EE-NMUt1eFdAiyACblbbt=KSSm+{A%+*bHC0AH_X>-(UOi@k^wCBdcrjQZyZ zqsV6LX*XBPTq`jg{sI)IOU0Jz$H%&SW`m5sQtvW-72JNb@FNzdpvtB{*MGDH5{=r! zhHe}t+U%xgc7ur~!`iCPp790>GPnrk73Fu0e99tj3CQ~}(K|Z*STNa`wynWW8;Ko0 z(%7mL=8>5ZAuA_?WOzAsm(-Z=6?V=q;g*P(p~dXMm(L(WTH7lL<-4377=Zpx1h&_I zbneHpAg*xj)99Rkngt=vxRP4XS_k#3rt-L|`Ut2P9rQSf29e^I{8C~<e1G9g1qJ=^ zS7V_;tM_s8u&u_)4Ban*8ml>7JOKar26oT{fefjN3sDJ>5(}=W4Vd8KwIbfu=Yq-W zy>jzVEM_3_r!*Sr7H#6YbFFh}0($5|D^Tp4Wzr{NXnYcZEj3ly&5z#0WN-LPnzgch z3>Xo%h)%L@JniT#&G2;c>R}Q6CkIM1m$++t<KeATSBhL9M{60O^At^EpCR1kfH&le zMRH0a2Hg`{nFVExd9q$uw)qIIM|a=A1OQE(n|0XE(yFP%`gJ@Ez!|KDG7_>*;TYUY z9CA4$lOXH0-~5&y`?C&k`pjXA);guA*lB*?;O8=p?Hm47aRJ(5o6enqdSljDhJu*# z$O#MLrE`ePlTPcZVv-O!Icc;#@IF7A??XXfUxjrC(IIqEN+*rAZF$Bwuw83{aQ(@l zhdHpb*hpVB*>_5Xhq-dyeLe%%vV(l8!kAXabz;O8tOROMy&0{8oCamCK#be_8p_xu zwiDD^;-Cj^oA*W}A4z)P({){UT9EVY(<^4ZAujW?9wOkS)ncv)HqL`L#5ymw!qZSr zc48+ZW4UeY%F{_mB1|SRf=uG8x9o81{OaTx4^()0DIO_Xv%adL#vV*oe%_6j_ja}C zH0%dM=D&cC^nE2#GfDHjjSZsrvP450RE<2;TY67<^veOiL%^E(vz`G&_pFp7FT`C< zX|wM0v3Dt*9=INCwLjTn4#rfNCF<NguUU1z)KQwF_W3bhcH>LZVFiig(abswFtFG? z&{o^faMjE2Z<h~sdEXjzZ7vPW>@e^nKJ1hU_4VCr)y5lp3BblSn;OWKfX7}c4zC;R z4YZYg0oq|~ofXCu`Y0qNC@0nwWLPd7Ap!Pc-gTv2(+@PFjET;v%G?wBoT=r>Ypa18 zqaLed(K)Mnx>V2BAi<y)+$iEs>OKA;m<PDC@EBl3c?Sz(_E8)i{9I^o22>Wq7;Z@Y z`&0SV=;j|DOIur^dm4>V9l{v@TfGs&2}4i7qGtF3#C#qpg}!LRX6cdH@Hng$spVaR zHBSQ#$@z31e&`UkLj2q%YsthMnf<z@G(Vf8Q<2RZ9H2kvA2<RB#sQZ1W@aY2TFB1Z znPpu|?^|T4G=pqP>6W`49!vc>8f>NL`B~9Nh`l;cP{bzdh_3!%*@p~<rDP|k<c4n| z`HE<>#ep<LM(0RnrFJ==Z^h2fYA>ThUW>`qRC{pc%M5)m_FGiQDl_~&ULhoGYSIjM z;0Y|KaBsQ?gY6b3ySy5#H}@sbt8>z0_dLK?eaz(VMQljMQ~YjZUC0n!!3EITr)$w# zbmxmfjM^yHXIUj!srXQ8K=lEm+Q7%Js)|{W<9Gw4?^#(gU97S&&m-TNV+JY(joy82 zOeiBUVr^u&ARIF^H)*y;<rnt`E6D=YcQx`pEKsW)(xkwljzWd7pLX@pMf#Ntz7@4t z;!p9;)9FH18fY7eKw3xLvsj4_zWb;wxwE%O{OMM!v3SA}e_tf1T96ZRxQo9uSN6nd ze34{sm2p+Oiy{g+)(fW}O&c!q9ceuNbubWJgL<yxc66tK-2p#RcJPCl%yoRE5qL%( z+IafLsD_PG@mdyz=?1S_3w@I!*(BvMr@=jhyOp}zcZ#=`W(=#W!1ETx<ipL(5fvIH z|EPHGJUmSde9lmzq=qp_-{8KSTK*cXP#srHEW==TS-jgoI}Z=`j-_nthj<Y@4AWtk zq`zy_)Zpa8r_;UuttWQ&ky;QgnXisz6x@5sizk*L2kevo-APle?aoudMOf;?gyF>^ z|3g9rqfPj#`tWd0`en0(&sP?5m{zrQnAnEPBgK=VAsY2;F%wys4SB1_ENMcb3M>PU z>bVpeU&ady-dHczqb}a+@E-mmw&u=6Gl5!6z28lKs`U3qv{(KCXw&i9svyhNWXbSi zBX`UEoM_Xvuo|cRJmQujT;&yF;zrU=ozYgL#Pzmp@-_2vhMva#DqSHM2U%ODl4Z;4 zatgU|V;;xK>4;KiI_C`o*vDXEc-b|Y9=w6@VpzdkcBdK;Xty@R(1cx$YsnAX41wrt zn%jpN*O%~0_<C(V{W22zoMO?%w4V$bx>g0BJ7zn3e#2DqL7M)t78*nXIDN{K<gVJ2 zB|fbnfr`Z)q)!{YeiG-q4;Qj}Wowd`Z{$Hc>heR|IEZbqM%$7hbvgNoWc6Z%ZvO*$ zsBtNS&Z$ileM4Rc4-al=Fv%8a+?dbdXvibpBL+755p&opzWutuYU!umvLS_^XFGDl zNJa6~Azw8tjtlRMJo6T~XG9@+*uNu$U8|~zcoNrAX;l~mNh`K#beqq>OfBA;o6oVF z229SMx=J<9h3S5+M~EH1`c@#>f0!L3ZPfW*?NnP!0-vQtov0jW93o0HdC%SO>zSpf z@2p&gbGxDNqMffBz+kF`?GegDJ;%>{b8_GQc=(RmLa>2b{|!%sh)BuiEEgk?Bcye- zsrXlw?Wp)efYENGu#Y`-%g3p`T`nu1GgOmPh;a_Ul@$RD*55oBJy>2~iph(YUGsKx zkvl#>6I;2zF=B4P?C8UIOO@U=2a(EOPG^g=k^om;p%;DsOvwT1WNO9cD_UCuirAWL z%;V<*XTv+jnHR1U>FYn)g?jW>h%0=qTI`%O_tv+~X|1^H@-j{qTpTb`RJ3oOVQQ<@ z+jI3}sF}ev!OB8Koivc5PPmm-w#06hT~1nv2zBR*0`I&y7K}lUm`~T4PD0`F0^hTK zMwOWldrg}CT(Cczh_I;2e}J3YfXqoPmCcpiJqzz`==kS-vB|qDA^G!bvZGbVXFR4F zV0|g>sSJ9xV^HZgQ$2ROo3E&q8`FC2AKrDyE=GrLbnrquZ@htx2)h{>cw+Xd=ljD| z0`HE1BEs9f;OmOp0U&128cjB9B`d?k^B%j1c|5*u+l=R|rYVAygXb6!R}{X&?P&Ob zjH~0$8!I$xQ6s~n9tCF(SjA+ukC|qEn6h=n=sDM8@cL1w6}{tMG~W(j@_D1`C*mjv z3X`3H2x;_KgBYTGCrq|R8a;BV99{sbeX4T?7Kj4_kHr+Yc#92bJ<d+6xRldNOKn`U ziog~2>)v$KDn6we63ZdU-@vs8d2y(R{QA&HIYEI@{U%czd-=<wt3fl!PEZgL+ga_R z4<%;p1lRgW6BGnz#J$wNxgJt|zTSx2d8W7~@6(GQz-S5+<okoV&YX%(OF^UK!xYTc zM;&57Dybii48J%kj&C?<u1O2?^Tkx=cGp1Z+!{-tp5pD&!git6Y&sScZH+zk&o~oe z+Mf)ZAZpV%B8ZRMi!ej^=GuU@vWY}gi(0gs#A|MADyMNnzgSp^_YMR_7LzCPJc++u zg|+u+XwG9boNA+oZ)?*4XOF~VA`$L7Fj1eOV<9(#Iy1K$_h`A_6Wyh>4kEmE*Y(t1 zzK8gm`blbb)6+!A>)6bawyOrW_H6btZJf;44jOACAVy-d@hh46S{yz#355fx+}{`V z`kmNoGlfW%CGLT-t9~lGN16u1cwN?P%Yl*#akov6I$%yI6ddEVG!wy3k>U7eqrcr2 zpP!qrm`cJr0fqgubK-I4<pdKfvZlK?zrO8l)u5TPL^SZcn}($O8Hd6Vtz-cAF?h@B zpysk|hOghG!&EF7$ikNX?9^md7|6U^1xLidrXPns;;{9a_E^mGWPC&XwKtSVQy;e@ zu#_gu3}%-sc3m@v3ED;PF;rGorih_4+#tZ7js*umDn~r>`tDo}mERL}m?yZyMe*3C zu7Z8sHqi)?Mjh8<qt9$q-oUi%>h8W)RjgDL&lS8&CQv-GxpG*}CBX}}H4|$p^LdIk zPX!$e4&B@jFFlCWpG#e5U0+z!i#xSQ_LWERW!9RMD|{QQl%;Q9Igo4;SmLayG<@x; zg!Dv(FmND_#X{yK_hPC&r${kbSsQA=;5twv|EB6)0JZkS!+S<Joi)Fc39?9*(t`q; zjj8;6m{I7Y#7SN~xu^&?dVnITerk1igo6>0LhA0j6nr3mRPnUH?@1{1)I!7hMe_dX z6CUCAI};^Va?S|k9U>iP!BH$8<ZIfz<vrPdK*jufAIW)Enk2-x1&=fN@59_T!U(Ba zoH`ZPOx5zsA=9e+OyJX_WG&3Eri8-gvC-EwcM`a+Jy`w(_vxNgfTEMP;_Ft%zi6*I z`uP83oHu>(pk`V<cYpza`_h_}o^6pxJhT;LTs(H)Vljc>=!<&7!ZGwQZ_u4vw@3fk zMIhDKd^*-p&g8Z=O;s07@nL8Ss$>-X&N>P$ROuni9F$@#hoWBPj!os$6e$u39%l!J zgEBie$EV%&o6~u6T7*-sB=L%Ks%+lTG#mz_I<2ytCCFG)8|h5H@1B6!+wb_uM{=fz zR`LT=zZBA=8lAQIm<qCY^;Mj;m<8V(G}Lh5jZbQa+eve(7CSaA<y<D%CHWumS!u3s zuMMnuDtvITvFq7CZe)zpNqG{=X*5!+(Zqv)@eRwfSYNGbiq?r}oLHGF8U}RV_V?;g z4bqq3rH3ASIc%;fzlpFSI~D2?sXciNhhIBg`tgjdj@7{~jz(0!jOm81`)Nbp*XrFL z#jPw;2H(9WtQ;cMzH$UddNWFbz*XH5M$1ONF6^gc?;}*@u(B}3955|RR;lXYvvM{g z@8>CsnNnXC`bgb<czZ-e8m0>!h2?%PZRaa+#=Pg2uk--^s|*}1%^x{%j0NGE{=0;A zb69?kJgHCHFNYmakBdRm_Z8}EiK$z8-WmXC5)|j!LdwRzH2ko5zzu?YZRsM(ZcPOU zEMDoPSaWZU=yE}4XQwAf?YEdQA<PSkCRgnL-f<9MWOBB&hzVeb+b+=8kgk_Tp?gF; zxT~0P&Ne;_KNg@8H>zScOfxe1sHnHn9gUMY6?SY;hdDeF%jGuyAxf-Xl#hGz7*F~I zmtXGo>{qh%nr~o#;imMzX<Z9^a6EmmTrplGlHIbmAQw3fb2{1VIuiCH#SiV0wR(0+ zlBod|h`kgIk}}^2ca=|G8rv2TW7qhY3GlVZ$?1EavtAQnlw(-&jI&F$M$(~Xt2Eh_ z5-1CYdkUTkHJ;T(5dH*OxWH8Fj!7_sh$hloUiVg}%5(VgxvIq*{m@6wY-rbFJ}7=b za9&iQueRV@8w<^mj`vyBt(}2Su5Wyt%bqLnpI5cl=1G{{F{I`IQen08#(0+LwU`Jz zoSMokisG`{A>~w3q^Zxxn4U)Dt_U&ZMC47#v`HL*55A<`IX{|o$Z9=h5kPc{G8Yxi z#_Oe#%;%@773+RX1Y-K!;Mu))Fx-jOl+0q+Z3y^x=S^2KONMK)+N$<@OjMMl=W@Ag z^<d%K>n&;K4g}&W!yUsVrVl9+1v`Wl;?`N6>B6aou?_&*_Su0XmNuJmGE)0Z?kp9X zWY48Nq-v~k$ZGmX4U<oW;AcM;T=%^WIJ_b=JGs6;Ms9H-Vcl1TcW#Y~BM1R9iiNZf z1ey+G$-vdmYY*Qi&5!d6Aj;LmD2c@|_JwbZx33YY3%k5B@aWHSY8SR@U2uSw^=!zy zGz>4ZD^Aq$#foEez0XRSqxPMZ__tJol%PkB22TA)Q4eW8_K->F_$*ao+6HMND!ESW zjt^!La~NZA#hSwl0}mVL48%vWR*W2(yrf38*Y8-DGAX&mAQ)1ZIvtJ@W}0uyoPI_z zDtj~hm)P`#AOJBUUej5ar0M*XxhYD~AxihTh$n}t&X27yKV!`UiMt<bkrmdBp=v63 z@?x;93aK0QbM1<;3CyXKywQ=<l?o!Ui76n#Me;&W6MOwztK-APIibY`|GKwUbcBe1 zJ|@`s2PFC3H}-J_AHM#omO#3@+!dauO{#7r!PJ2Oyc|9_^qAR)n3<`z(^Y6j;qn|- zTpP(QO`bkBaM1Y7fWTJXik6N3Xl5n6VWkrSP+ncM-PSspO8g1WRrBml5oF6@D-s2> znPDPFDmMjye9#~Wjj*VLwL3{W^2NRveP2-?TBS8`EAfd_=b&V`{$cKq_8dm(l^lrr zcy*rB$WK|7UU}c^26a}TC>h=(KZYzG2c$Yr?X^n_oRHT7{ErM=frBo_GTB94yf(sk zHN63y;p)_>bsktlsk+a^&uYfqE(#?EzwOBI5Se^Q7(e7++loG4ZtuR$7Ls8JP%42H z)~~`p5sqg}!=@gKx((%Uaz(D;ncW-%+89=-+w<48RwD$7TY3zSOigoY>T#{m39V+a z$^>JOf|hdp(4M`-=;OL7P{e4o_FPdM|GK<ywh(`|_U(X3TRcI;-)@#MnlULfI#jlO zxac%p34=4b+(IU7n#d^Ug^i7Qat>=5rU0oUdSA)%0FA&cWlOT**X#u0aE5x`(U6HA zrtCqN!6Y#NUmQzbn6OL1(aEW`<{)r{DfCs;h^QgJ2qrL+efo7QZDFRzZ#`1(5emS~ zu?^4J47XA}Q<Qf}DRz4%_enPYv&^NHG`r5IW`_r2(B!e5_4#k$I@L&rn+$?5e*8*a z;NuDhfai{t&!#TZ%{MUSvfrtIj`OuavLaa&@`Jn8_g-rm)3A1xcW>yM?#rnrO-c8O zJn3qzt)g`jgjZRiM|zZoH-ccAz&LQ!1BRybh0XwlL9^2v(JrbRc1;gNmkX)>*$E+a zb3Kw{ax&f9O!av1r!+d7voQu)Qkvu=J{FJcE1fR`qjetLCU^6e-Rk)o8wWG=a8x>; ztJwe^5mgC@l{0MCEZ1SCAe+IAy^GVLMN*ji?z#00i{l5jVvYGw)E(!EFfe9!F{SAS zj0?gU11)CAR_#7}V0pxgW2`AEH{=QqEk4ohvN_?*lAu0?6Sjvlh#zW5&D3)75C2u( zT`g$#_o0GvrgDQ#^GENLu3}Xs;sqTd0Y=_DzQa4n3Oj;yWJ(w#>3cQbk6%L=a$Y@F z$d6Dd5X3!mq-wvp!as>y92%&K9)dAZjd4Z<M@Ng+RfyT545B?aB1t>rnDGUpu8yd% zOvmwfd7LDq0q{>n(R8!o>a^E@qVunx3)vsX5vPX{zrc1hzO+Ug>-1)2iNZ$^Y*4Mo zF(%o(WSr^g-OX?WwMQeci3ZkTc_N)0A5sZDilcdnC>_yuI{Vd&SQ{>e7Zd;xA=*A= z74<Z7?gs^&DG*iG<|KB@rZc(H@?Q??5sYa~5)wWqSf`U5Nh)JsYhWOwsAzv<H-N^2 zR>0l$$Eh}^`4@VkCpL}z7E|Sh0C2;Xt`W1nHWEO(TO78#+!I;=HR|(Xw~cERZ&(NE zGgb{;zC3DkXY#LJOz1|YGpF2o@Tj1hBkFxWiJ2*D%CNs-(p(HbXo*Od0__I3E4Ei8 zYVMqCb80wL%31E1B3Ft+h>+roP_-fgqg6+2Hpak0KWxlce*-0*@QF8Mkgas7+wD`h zf)7`5TT!tXM!A$BuQD3ppPf9@U&7|wU<vW3=o(`Du@|0a;^m|)R8}y_y6oC}_n*z& zfXmk?aB@H<k9t49<=)y_t#`svNhg)EZn$EIP~(yEQ4G9p{v)G%>s%Iv=mwxaK7j|e zA$m5}u-<qeeWcx4Hwq_oN0RrBy1mgxrLZ41R4@G017aBqpj!=?P7LxBGUg|E642@{ z=?Cgz-Nr9>+0^yugf?eZZ?CTc$+2v6w_x6aBUNXOW@q~z3luQKE`Ph#0YejbDf)QN zQ*#1}?jOml7Mil0U#p%!1hwpJ0F9%~^9v@A4ZQK?HNs=d23~LL>L<XZ3(#wtY-Luh z2&hD5o}k&1;gdL3(9w32#i}?av|D^F_h-uWigq`RHkQAe<CPm<!zkhkXQqb9Zx^Ay z6dq3{Amh28D2}&`^DM`&8((MS0rpgkC0xlWxBE)r1`LnkatPmXB1tb~s8LtgNVRTy zSK~d`6`|?0#{<B@H6CbdTc{6`$4K1M2QW)7GJxD&r0VF_25Vk=^&?;~rce5zBykJG zm4pe06LQU=W)tgX&bHKs{5%~38@6{21R0EP*YC|OJyUa-(f#6TZ#)I{fT-1Z!56PK zxv*CJvtxTj$-kD=>BvfdhuB>m)E`fTSrmmTI}?$$7HTfbiZxYWLjW|Vw%&)Bj(7<h z?=o_TpS=Mrt2qu^)H*2;0*B+5dqXUW*o-L5S|c0D*{F-c^c0-e;fWgxzU#k8OC8W7 znJ%YKdyL#P*?}r|N*R6khAHOzJ678tE1BY!!rR3aCOD$veQgYkrfirNtFFEp8wpc_ zhTuCJ@3EC>>K)m#pQ6>|7WedcveLzD?V=3k^vjs_9kY$S<x@4I1;`kHoSiz8)tsA6 zC*_#Fudx&oBcm;`iEcGEti2Hhs>K}%DR&}~Nmm9Z?{=S!4fA9G1$%1t*A804ag|r9 z&P{1Wh2xF!9!<*_Rq)#}hc`~*_BkWXf3Gof!VaqNycvA|R!BSW*4sob6&+4NhTi&j z=oJNph{Ze==?zy3EF|jN8ua)Z7*pMjNnIUpc0Ua9o!DH`Wm1-;v%-303tl6SLXKh+ ztdcawKLk6O+s1f)H_A~&4B13$+K4@95{K;EiGC2hocxevlItsH!ae401!L4uK`yG2 zw<f_nilWY^ueOkNsarhzbsXhC-}Y};O9^P{>ojmb$^ukadc|J3Ea-rIj2@6ici^3- zk2_S4#8;CG=GOOb*+tim6zRv2R6q?Jo!H|Cs;=_7Z`k{ihzq9~yV<kXukL3W12_1I zoy?*hnH&1{)jCTfy?zPfQ-nUy>!D?G(|b9)x0Il|r}%vpK<ludyV?I?@4bVX3fG50 zMX;fQ0@91pyNF0H7C=BidM^TkbRvdcL`6C%ARtndUPFh_5)eoP5u}#@!Gs<H(rd^U z?{Dwy?){zI`M#aqo!OoH&l#9=&U>Es>F?808!9~PX31CqJ9HsE9;6fGGjM<x7KEZf zC?n83dYXlLvX$V{;1(tN$*K7Z_+Wbr6Vo8t+Zu)4b+X$qV6{MrYQQp}0W<rfgn~GU zElg94QyqJ$?(0pOGB;Gii0kPvob^!S`+sbdjW29&A*%Qi6BR3d>3EKA5!uYI^BoTR zMP)z3!2eU10!}9vzjQrS`;jqyHvLvoo6DN|{({HHycJQMMZCZ`E{lD2#x!vR%io{i z9FCY8wlp);$ztdKnZ>cZzqz!1S?F`me0r*`9N&di-I&ec{lQjov5M%uUS+8QV|slJ zO=F(1{_Ldjl*NA4`W(z=nvA<n%ii24+29{pyZ`K@S`rT9c>rE7k;~y(>{$ty?u;|Z zWH;!c9x=IAbKR1~cghFc%Zjc~&$(GQJxW{do&L{R08!jYTpK3XlA6W2VRQg2@8*I{ zko%NR7w1F&;Jc5_uDP4lf7V)<GL#Uq3p%1GXK=hbIA-$DzrFfXNU$iR^<~J*ZHbD! zAkB>6E+_073KF~P{6Vrj@5s>H{JWq*$-xJ27|)oTMM3FUMx*x15`i1+{-UO5*xKOZ zJVUWj_s98xyB(QzGExwj=%>Xkoz==9jjruZZ@nqPN1UBnyR63Jq4@5=ieU7Mz*~Zl z7W^7?7vpfnTelYfY~fD{D^^(Aa!^e5QKz>Shc@BGm)j6n{hw4igMPSN-y^E;t|^N2 zr7!G{-0>4D^(q6z<3bs~KemZjC4UY-eml=Zh|^C*q%J{uf_P)e$Liv4zDh?l^za*8 zdo6Hsx2WZq7_Y8$7mj}=`j7UQe>BSPEKDPHm>;(GtoPtN-JIoQ+<OKN_#+NJAb4~w zx3~|y#tsUb^Gxj%zvX;&2K#JDX#~V>N=!o``B5Pu%WI~)BO`qF-zmQ)?F?!3yqCyr zX7fu`^qguCUtwjrnba(2_B}K2a&csqakHn5Ro_qUABoCm)qE8Nt#-BlnIWfq*W(25 zm>)p-yc=>FA~ZK3cc;6Zat8@|*>8FIwM%-aMSS~<#p*rBIhvCaAfFP{?GYwjc_lu= zmdz%5*{LO{R(Y2sR=v>?DRmyCiFRB`UoJLyCgQi@@3qWsg)#odq0cf}_Q!b|dQt^% zo`X3r2krG`k}MfQK;tG}N~$@x<%Q<sa+bqot9Ly_zECVHI&z}M2{~S6pDSagU}$JK ze8?u{Vu<ru@N*>oA_m}crQ=;DFC=Hu+CYyMik!cnaIT&(`EG;o7bkfCtFMAlU|G+$ zmPai?BWt?iq%vi7&6M=_>z?4Ln#6(J+?)Q69HQci9#6NIBwAth$hgLTmf?CaQEDP} zql<&D*>KP$Ira)b0}gIo${pfE#Byd+4jwtY&#af!*NLx4Pj2|u2uCWxN=oW}mgEH| zw2N|iDL!8;6e;*=MLTrXo%k{qxO<J83kfDdOMvU%DFXz#yr#8eQpt7voIh{5mr!a> zrUC8me2Lb#-ppj0+Y<iv?EUA{|7)L4-qx*i;U&{=_LBk(23I-tXZbB=`sP5PGSSh| z=GnPwaW0d6$-Qj-s}>-9CYg@1H=1qH<U7v7e)Ip!5Q+(-ze6bC2hulz8`%6$7vFz( zOwR(m&v&V>+IIe=>*n47Eb@QPNDJlIG<bdru>Fb2nuOvGSEaajfQvt{R+$a>uKV>g zAbo88E}XZdsW`a9LI&=z#2d;KXa4K|R@(8}XBOg+7Z?6z87~>iGN=+;&m@_)HV<l3 z(6qY{)jvWfGUr>4#sxc`G9msC?Lw5tEM8371z%~oemPMXTkbLEM*}uaseBP9eQJ$b z75v|sMPPR9)jv8s!>;n$cI`x_d%OW;jkejp_&oN`ivY%_9toe^E=`wHfH}j4gwH?y zA2<LT=WHL6@R?AweAg5hpCKfFqg`1&;1M96uJV%fR89fP7I<*MJ{2Y89FcAL1|Sou zC6k!wKb!vl%BG*(&QWu%1cZz07L;<Op=*n{3&;8r&FDW$E_5B~1pAUC6(Tsu3i!QP zfw0sQcy?#B`&Cs{)hhojM3Ky{<PD?mkpa|9B7nHN0&goZD#dg$rXX1ZQ4Ou)KI`3z z#x;QzZD6q|MZmAnF1d#7;Kq=yrPfh4o~5oPJ4-Up+Ckc-<&wgX7(^?-&L;`ulJ`EE zK4i>6Hf2vw^p*>U^5XIS@YG(z*$Q=D|NC>$KKmEIikR~7f$dnz<*M?a`*+xw*pZJj z$JxF>h*o82Lsr%N?r2<M)yA5c0VU+<j7=smHs6a^;^*@>#Dygrtl8KZL*~To7SbYv zEo|bmm3KZDFpOPQ@8q=Ex*!YLT4n>(z^B4G_?~3wa1OSJ8hw8{G)4=|i}h_w8Y2?E zn*MiMB$YxuUm~wljIpC+$e5U5fm>L320L+ayE=tc!p9QC_bKumu$iP?@(nu^chofU zt_|FfMh`qCBCLZXNWsv&Ix^pzzD5gOyPk9(7)c~wlM+IcTI&PMkQl1yX43N0qI}`N zdU^H<)y)1*MefFI`=gW4!h}SfemM<tBz<IyE+8`O1s{c~gAN8j1KGj13Q`y#<I%Wp zV)5i=hn#1NJhS831w+IOGeXzK5zJ&zbta6?>2d4;uj+?`&`;`mdUDK<K-Jk9&H?cW z+=+L_murH5wFm)k;*|=dZJX|T=aEx?eAP4chshsRH9&k%rY#+}Yn3B)gI88ZXLpJm z8tWLw8bfx;7$`WUW=t-WRd3mYez}69Bo!D3=jW);TP}W<A=7<)Mu4OgU+t#@4xu>} z7DQ4mL3HZC5ZIpjt1@YAhRBHnmsh4I<~%T1m%fk`>M4vX@BkaiP14d^+T^6<G(Ab( zssw41>86K~oIO|+xv3?uNXqz3WQ8*@S-+Dsd7m`sEihPTpO94bsSPP@U~C?cmOkK% z2gKH^wo`v+4ROH=fK?V3$qLA!JFfzR#iT-_#OcnlJO3f_|0I!l&y3fTLA5RAc{fzO zXuJ$2Qb1fh0fWH^2no5cfEU2SMS9vt6ZW5ig(2!~pTE%py9&u9*N{WACcgrhRIe%M z_;q574GIyY<Ew><rIWE~gAFKix&ae#UZ+|Na6h&(B-d3j!)a_Bct4N+&hulMaB9-} zWWTKLh>ph9MgouPqh<2?%PQFvfbGa6yw;KsXWns_48@?Y*v8H%QON<n`&;z=Pxs7V z?F8d^T<tq@03=iBhhOS(9uNffAS_8|6t%S}R^ZV~SDID64s$K*IP_V7GOt&Wk+d^n zB$l2v_(EnJ$NTHFP#xECG7Nv3@jW)6tx)A0Fs@suZu^(k^xx;!UTp1i^JRjH9ZbRL zn`R{bar?;=TY}9ACsl&{fAhGOieDMtP-HO3B4dt>RA!rO{Ef)XeqmU;W%Ni_Sf9-6 z=U?)?{|U<MbIKI_JRvS5)YDit*PyO2m`;Dx7Ur9ClG!wFwj0n1%Xk57TS*$|>D5R2 z;cSmtgtiq#@UCQZ-1)il$!vrpc&a%lm}_@U@um;{I3aS9{IV()l-0}ks+aE%est)6 zmhfzMIzyuLH<_dMSxeh7h}G|f*fUC(ftl<y1#{S#b)YCm;HpHJtLHf~Oy(E%IQsoL z4nM9Ftn$f&*?`%?2Q=j9S>0G(Q?WeY82^kTE-r3k)WTEB{Re2eb5<FceQv#{_;hNw zNblzj*DzdI#szmWIw*@IN*qySc+d+<6&)Ro$@HCZb}^nk^uoC&0PdFi3D@Tza+2F_ z5Ztya2n1sDpZlPFn{;6KbJ^}Y@ZQ}hJ~51O9{!53>&uYUyFD&fNNyvysdVI)^U`F! z9ZBlt_9D6nP@{Q`Qw|E=8x(vn$o@U0xTxs66^Jk|9x6K%wDnU!R5VUzZ**I#p3FE@ z5?2X8F#&sP(-HZgIN)bah3!(v%0fJwmJ7z4eLasiQ{k}{_2SNCW_zAzI~(>|7*eQ{ z8Nif2N(uZ-EKisl2kw4_SwwH+>oA<#X<&8ycNQASI&yk|04Io$s8~p{+L@a&WW2}- z3$De5*obCwuebeSe4afdr-<oo+|Dg3dK8blLsm2Uofd}FczeABA8#iLg53N&)5oL{ z^9dfkSsP>qm__K>GEqX1$m|T$0sCqzq8Y1h`SkRQ=}x}|@dbpl#xJ=onYBIL$RqR= zlS%7vi?ZoSAVzS@Zlf{DenwBd^Xi1o$XI7K`o!&+r+FP%CLdVZem@5xI{Xfe3Qa?A zwSiYF;*^Qs#4RXb`5=e*hoFqRM`@9%Gi-N;0=vG|V4JrRde?O|oMZcxSAY%w*^erB zQ^C7ZsK)z8xz+sY7*~rn-_VxnG~r4|9IEl$*_Rb^Crv894wWT?U8XpX&enRe08a8! zL0_CJlUzfUobz{=J&k6sTI!a@aGv1SrSfOTVPNl|Kj>=bhi60B7K3M((o$9s5VSi9 z_QRMB!<97P8GV-+!+tYBbp}I&6f}q%w&IS9BaAlD2jaV!ZyjFUZ#M@Gg^A2)x>_Co zaULK;T}kaQ6y{(vL~suksZm}fSvq7bGyH%!(Y)o?ymDy0kCx2NxFIWhqx-^z3!gO3 zKd7X<`t_nf&Xc0oT`@b8i0i1E3|Mb=Nb1e`tE&cVDi)1YP8@pg&WX`Kq%^;2bf5S9 zjrXVCz0G6h!hTwG!b`3NzqoeIc5&4K-msP-bv(M>FnZKLJp2<FY!Wy&t5Dy7$bA!7 z53GT{UtlvAhM;@5*(Akbp>AN^;`b>j_>B#D>+ehWUR7!gU5#)+JU$5gz;ZL@@&`Ge z<!=`xoZK|}!2{KjC!4Hr=7P7#CFsh7Eo{c}h@QdJ9{QqOlbyPjfk^OS_&!R#!69~} zSyI-c#qUL|hGu%Q?h1RuqMwGU$U#y=mwHT00Ak7v&MS7HEKcJcyq>nMfyfw_cGSA< zs5OXgGP#Q+Henn69Mejbw!SuW<!t7_B=Mjj(H{~1Su;b7@X)80X$pa!<@gjRp-^|P zb@fGBJUif_v`y*adC1Whu{23Ru?(B(1``GvzIJdx_Xlb;$RR@>CjHCZUn<A#@HN!S z#h=gHKk#v{!ZjzDuio*x@8jsG<q@UB$;YwLY4XdJ(Al>?HySi%g98uiki%V6Tl_m` zG0VtY9vyif&B+fXes?ZFhStHJ_61@Y@*$5~7SoDBs1A610!{IJ>+{288Q)dgy_o9_ zow1*@SrvZ4r2?NGcL*Bf7KAFN+fC@6^Kk=KQkSXOUgY1OseE`Cj=$QR%El}*rl+KI zp)um!XfZD0?GR(=k`-u=^9rYVA&rS-h~4q5)_Qcz5Dlyy-xd1eP$`a?cOLZHY&~B6 z<oOH4BSr$Y$Mmz0119#<2El&t%C`FqcxJBlmmH@397jS0ex?`rr17xCV<!tnP*`51 zX=E6CM$q+tby7bp-8ICD%gt|5=t<JQp}UvR?4@TJ`Yr9GH483ZzaATC0>3UVchd#I zFI>JD%WSEq=<?W-xEv1pA)T^kz13R)4Gz&u=FL}hiBF?nXGUj7Hz42Wdd9LBZ_a5n zz8}T2o-?r!4+yl(PL}W9za!oCrr$kQ-Nrr68H?l<F6T$oo<I`c#pswbp>1kzC@DRW zo(tbkLatz>3x{{X2K0;}v&qo4Psp>HF_!NsH`kd_Haa|Z$fi`x@eSby$+h+?fNE;@ z!R&i#i1a$L1KwDm@#=Vd9dmqi_Y&%7xzl5&OZiFHOS4X_GX4yuN={nqON(b6&t;^c z7<p0?bXUwdYZSzmFMLRnn^eZ*k9w6gH3NC(6$6y;+8gEBS8RL_Aw!bXAKk1Q#2lx_ z8Q<<%9^da|&&3|4!X(8qhO@01yBeKZL@}SxSEf*sd!lii{eGcAwQ%j7ryE1cvNsoq z+aL3Ou0n+r-+Q8&Lj$qVVXp4Lhnb=_h*h&4s@{EIYKl!&RaNiFlV3wTI}MeUl}>P? zsY~eiYyjbKr(0G15?+39Ppbr5XaZAi>>n$Bl~@)Fo14u4B$dCnwVW05qW>#cB*<bR zdM?h@hq^rQ9ctS$!^;=!*7^mW0@lmeil@?u%wVP*OU_f)eX14}ABM8770}VPaGOpn z>+HK!eq^y0oe+vMk=WQ;j~_amOyw_y!_65t8np@TH^mM{B|(^v{FmOY48>=1+GxMV zZE86oYr`BfLH*Oj-2%3AP1W}Rod>0`*xAEL*NQk3YyW)yop@!XgD($-#FuR}S{hK| zQPM{Gd96y2=3HN?ZLeI*TioT8k7|*v4K(z$6RiiE&o*Y67kR`Vu8OwmSrZUztFO6B zZX5fFTkIaM*<WUxU>GZ(x?Y$$Y;z?~VaB^>Zr>6i*?NtCN?Nu)OS-B8y$Rj!@lKSR zdBc1EZiO`iW4`zj#}fK1u;rs#Sy{1L87|f{Gn1{v$klxdSc=A-5MpPW;Gb7kYV(^3 z=V<cbM~Uw6sKrckDW<go<4|3NXHTcn9<6g|Fsiw#oAhe9+E_~!Eb_)RtS;^|+w-*_ zCfF1%Y>TJjW7##ltZEuSDFi-PaIaaFgPOl*DM_f)8@g;xxC9k3z-gogQ!Z}k$?>8x zC&~S-3fNiM?>%hr%R4h@Wia(}kGiV<7@WAAQqa!G;`kf35U-t36oXOZe>`2GXTDbo z_Qdu|a9cMdXj|A@9c>pa=L%JnF!>A%dsuT6hAhvS-Vq|a3_RX1)WW7NN4NpH%Cn-^ zzMqGnbClE}pLhFAn^x!9iW;XrGUZh?&Cn$BJkm*M-6Ql!OE}*C-dSZ7$mF7Ry#F!9 z^iHAY2w1l?#qXCLPSH>HF_7l}%pg<y8Yf-4kz$p7a=UBS?@#wmmA}oK)djq#mz3XO z+R-LgIP>X)Nt60Zp#u`s*pk>^awBDOC%+S^Ku2+(#6PgX&Zq<Www0k2uW^K}$->bD z*dRS8JKBc7MRBbWyA1Wuh6G{bZX+IBKk;`P9Ki?T*3vFWh_>cvZg{otz4e=GDef3; z&yv~s4#m|nfKGA)SvzF`_3bLW&C7ZIWDgU4DeUJ5A=Ch|I1+yFYwjeojPR3<q-6G! zxOe47opfYG24h0qW}w~;yV(cp$Y;a#A=};HDxWV#`prk%LxI*jvR>bTnR15Wbo-9Q zE1B9Do0+N`qO);nfxT0v3bg}mCs#Lc;+c$bMBjDa4&LIr!6PEG+(NB=LUifM?yvsU zaFBDrLBj6g{zh)|ZB}thdZKsVEH$fzwH2omx=I1!R~=GmrBUMWowXU=uHy#iA#)k1 zcx5hcT*tT4?v=SRuL@uAtAKARZu|_-J(rMQ@7N!&t`us?Chzj+Pg9)5Ip1AZTsTxQ zxVI>hH(O2^7CQMh)>_PO9cABvEJSqH=DOPK6W%vXCSk`o(~|3NHuHKMB0K{jP(nO0 z_S{f4F1>gNd$M=MA5sf*2hOO3QVm0AY^s9Yh>ff!U4ak<v4!2S4`RiUx|V;|ptEHu z;}Zi6^YhOnK!$pbo;wvJ*~-5B3At;(9_`TUJ&1gqvq;@9C)=l3t{7my{jG>u&T*?A zib+Y8R6B6l#B^=n3LZ%k#(JL-_31hwHi^|+-vM)tE8*GsyD&BiX*+T=XBun)=j}Z( zZ;Qq$KK7jOKuQ+-C@XKjPQ|`mFN-(&`3dP-^22^|JbL;8Znt26ls%zK^3%_VY1Gzu zcbW-g%Ds0}k5|Js^U(3^yyy-JBVJ*hzHtp{uM-$(DJNBa2qrA-ulu$n`g8V+BzO{) zf>r%hEq9i~Ke?|0Qf>C~MTdea&&s3^EpF<F7}_D5XeiwGqmR3KVC|L0Aa(Df*$;Ea z3+=6np6&r+I?%&05UQyF#?aq!$K5mPnebRAsv_u?(%!dQi%AdUCx_O{T^j;_w5)_X z^r~Z!@Cx*gG<?<S@`%LRWc~xqw-1jA@`Evvwa5hGj&#SnWs|9v+gUo)^R5WpXjUhu z88UgImaAc}Z3rtS)7|{~=)S(b=WcGXBc&!tr%}!gwL|Zp98_w^t{6VVRC=`lPVm<t zbE(Y)i?njhvjmft1G-`fS9?2cjn%2EAh+qF@kVD?%c|A5RBr#Ry}WZ2lvj+xQcrg0 zveZ9IfH%J$MrOtQ3zq!eP@s<&r0xG6!p+Q>|I7B?`XeeL!ZxnMu8S`P5zc<yBUW31 zepFi>g-(2Kvg1Jn8Az|%0lQus1ttx<W%X-TplODmKeelZofLu7<)nlCO^S2Dak#5` zk^;b|V+ZXoP>*A1EyGwb%h<CjdspyV)iJXNV-moRubTa3JhC|?Zmutgo%3H<fqzMZ za#zH*YbVP+gG?m%Dy@K05N7{|6ol1&Y`5ISGNH|ZiOf<r%b>f$WMT*z*97{Cn?YnI z0+UWVwO}xOO%g2ao`5Ef6+HLAUu@sOy>KQIX7W^<4GRtCTKU0;_(Uxfv0T7ytQ6#{ z(DK5dzwz~Jiv0WU^j?seFgv3kw(Ga{K^}YJ)IhUbC&+QM?2Gy8Bz=WVTtJ{66QI%o ztclM%7}??nBkVg~(;$;`W}en7@5Gp%xDeknfHwU(W0MLv9lOBFQE=cLzGn~f?PErb zZIo`HoDP##@Ef1eZcFmk9P7tR7#Wbcdw<ANACCv*;vip4zBn%Q7A<x7;p+}($`|le z#WlV)em$I>-%i}*WqF`$9h(ur`>p2oLKBG0+QC+PMi-)%+~QzUas_NslJ>Uk;Ik3z zfLo>YE2U~0lyk#tm0H+L)0PJ#g@t+s&EKX<IzAsK!zm4xv$aDyG0c*V4@uILY|Jq_ z6l!Kw%~_f&JAr~ZTXcSipow+u+Bp?|8Tgyu-?gPl*xOmUyT`Ihiy@3J(^E4uxnNh& zG|87W*y$~4evOl1uCnv1L4qDf-9%P2eEDdjZ3`6`!6YTRFuWaCkL~tbYP34@fEsd6 z0QmU!O64wP$i`Ank*9OqXkWa{YGqaM1Ntt`3^`9*s1f}5-qfdB)abA0T|2L$$$=i- z)~3a@n8ECc69r96>P!p|VKeAf&LS*{!{S(VX*3U%gSHCLK|W1kc2z)xot0WgkzdK@ zaC`btd6S*7Q`L!sm7$AD@0V}AUxV=#a-q3~C$ndqS|t~Hvnr7s$o``aQw5^cz{nt* zcBcCc=nVHqIx+&sMHQ`P)S328DF6Nyo~9}?(YGC{i#G76>*RuSZ5LLn3?Cttk2k`a zsk#5!qPBbDl|CH>Z%&vM{+k4_QW#q<A{3z1z&Ko@qqRH|Bts#c3+Ex;E^<?sfJO5> zgm4xZMy^6i$}w3fb`RjnC(_Lja(M^?k_VZQenpy$UVZHf2L^`ryWr_|u#R@bXJAP= z-Cl<V2Il-+@~c_7!h(*Uz-V|iJLw4w4CM<=lBZ@c^xF{_4JuxEX)>x*mX{0KSG?>+ zZdf~XmzAter?p%hehDR$WfwT9_*tRm>+9R!P*WqE{`s>VZa32b7`|63qg3fD4eAz7 z_vjN!;v^VaI~bgT4bPC{``?u5p_~oJvx@`i8Nz8^FD!RIs4A96;}8j27NBY7xVXP& zbH~d{2JqKk{#pUKFuftW5be%Qc8$~uNNg(VdROe`c_|25&Q6g`v^eAfeV2r%eD!*? zRn=yfl_Dzqv-LE~8?<}XGu-YttR@8BG@3?+vLtV3pyqn#TNt&CWmSpOk7%6q&1Etk zf}bm;W_;|yP|_h+aeskf<NHWV2Y)=LKDJ51#~nS1`cB5isBrzD*h<KzBc5zZb_>X3 zml=IaK$*`xr-4%-ZMgIF+Ol`!MONHv9lKme=GIS^Ov=uTk%<*4!Za=4gK(l6Gu!JM zJXL<V6a$kFVNz~h{B4SQpMUSA79ge0@OaHhAk{$qrt(K89ACm{dT+&5?RGJ2tgah( zHo0pstPdBK+$k9S88xwWy>qpxsug)<C3LJ)YB5-hV<qq%Ye*&ET5~YSkaM_yZUN}5 z_uVzDYRf)kqyqB^F*hF@apj@C2z+q?y2(m|tZ!8u?xorY*A2Zrqa4~ZV?MvzSdSP_ z3yDCbBAV*EKrfvS@1X$EDU(LogBcGuz<jcCmwEUaSI@BVu?9}RxBi2zrS>M|U^su{ z7e6Etr}W|*%yNTovbGCLe4%~pW)Rr95V-|^shVNlu=uhOJTwShVD(iq<a;n0d<*u6 zu~2QoD>v0x%?Pp4Se5D_X+8<4CR897hdIEOh8!&IVEf}$$>xaBEi^bFV{a{7LQuo6 z0akr;jo5ys%I#?OrAYH~$-d@v114s@Z=nabYkJhVX}YVw4y9(D#14;pd$C`3#eC%- z-M*XED3`J-2#sF`&Bvv7iPDs5PNpC<IGY3zmzB~*0ojo)gCf@vaY3D)^H><tAl9tp z;V0&P#W9N>-Rh&!3(=;IOi-5UQ`oDp!y5Q@GNv92Sg*Q<5J$$k!V7~G9Sfzjam%6; zBEcQOsjH%x_!YB4B!5x`4WO7@VGk?t+o_8eP#EWYj?%&naXftyv}j@T{Zjc*pN`zg zgN={k;*aI4`BEyhgo2&$28jdS&JJr%8IOH>60dQc$==3?y}1i)@ro|KM5fHcV;4Wu z9HvV0i8}<jb+n0$g#59uIC}j}W4%S-x~e`bcfI6e1<%d{$9yWpnbsZmJ7u~EKbaJz zIzE=f`JrN};d~=HyWdfT$Q*1Tjm4WLFe=@&(IYT9Wi7IB(D;q=NoR%KQw!}owfS<z zu?Jg=d}Gpx$&aOpjG8HGDDNNV)OG7q%QHCYG*E_HB~6VI%^rW0ETqe$KYk8)uvbz{ z{qF6KdlhItdOW%5mSCD9aer9m>JBa|Ha|fz%d&wRoU_Q`$iCMngU#fB2wwj%Mvxvs zK1d*xtRGxU=(IZlQQQCC;O~Ue>!4EneC7|c0>#QRIn;I8n~_R5>GDWqwx2>)07%R8 zbEkvLrU<pJWtsvms{&;op#z9C+KVp{k~A|6Kcw9ftS*<6&PZN=QZII=h1X~0-NpV| zllR67@1d^|w6#jlcFgwHyH_1&xnin4^TNBGFMBlaWI1@=JI0FIL?#VV%o`?wX@X?M znv2ERbebI}w8v;D7p_WeWFEme)sZF8O#_q5$>Pjzu$!>`Vumx#b&OV5eTiMOKX}Fz z6Q?ZDOb_~1Q7dzkCrbQC-}RIG3V}QMplP}@)0aJ_4!kT=r+zSc90#<7j#_`i)bDK6 zR9JIJA6snZbbrm}h>6sl_R`8Q+1c8kOPr%hD()Zm#==mH>m1S2Wsx{#;ye`J`1CM3 zBCtaHW6*(lb%4^AXmab~F_2PgyTS8|h1F(?sacNtFspdhR-8efIVqk=1YU)o!C@eb zHt=or5*~H%HPb>^@yGAYq4h|sP~vaJccX9cCY?^=Fu!aBTg!szq!9b1Pq-2v@jNT} zTfOi0dz{2Lm1;Sj*Kk7`=lU@)aNzk9lyR3yAMEA+uYfNJk*rEP8_?hJBX87K-W3l` z|8cN<F_XGWYffX$BCg008Zt9q)p7$5oISg8FRVJvf3tgIH;EB(A!dew(=2GB9gYb& zX-+cw4)+VPt%fwuVN3%C_^~ydvWk3{>6WhCnfig)4Apo&6RPETOEJZ=LB`C?Dk=Hf z_|*jTMn7n}^$o8k>8;St)g!p#lLChovrxvdeiVn1Q5@(8?^xG^U@Or>9PdUqRw&Ro zu%T-_Z6rxrJW|*bnp1d5qhsA8uK&b<D1>v6+PloCYE-hMwn-c;_8#(l4zITfD)xQm z?XEvF7n3a`?KqOsSq~P*q?E$xXm~&BA1aR>51j!a>K3nD*g|1o!b*&Ld(tZh7IdjW z%hfXWGszC(f|p<Pmv78l80<}R_@Ysv#O^f@S--)t5tFW-ETsUV*~<aU{#@gFY;pIG zJFJP<gtgY8vXEwPZJQV=&^%m$!`CK6f0E%Ykkyf?rHr;)*a-b)aFfS~FYlJWr2R(w z$t&!2f^!C=2K3V|*AEYZPLRyOXy0cJr;HZ?8R^51v!uY9hU>6fviK6%&v!`dp~X;7 zPzz2M3nT7)t$o30fI0pFXD@^uEy#pwlvqAmsks4xJE>0Xf2C3ke5T>P7~U=Yaf(A( z9P<?>H^$HItKYk(T^cyKb7H_Uw6K?Q%30JZjctWGWKlF0yC}|d?Pj4>efDQ3VnPLi zv7hA<966#BCG4pzb)7&!V$)AHIdzW}M(Z+JYlbrKD$<VSr80f;4>;bpNbRZ(yGv&` zXk*D<n04e8w28q*2>K`b<Z4_<iWoeUJJPaA5QoXn4<8AZTF@>Me~w|7CgD-a@Zvq? zOK#13i&YXAApAShn?R+FVGpdix*;^X{mJ{Q1e>_6v%*f76n@n&j&{0BPqU?3y>M<J zu5Mxb6PtQ`2`k-2Xm{Q}ZM@wpzc~xSE2uHe*;+K^=TLF-At1|8y=sc)^_tD>wa7Yx z{FzWmSD6N0;l#Z|XDwmxL|E%s%<k{Gs2F<<^XH0ws?S=8;wM6bKcW>-d*6^JcN2)S z5rog(=xz{UZ14fD-QXFx5b5i2JUbiqyI#}PZmMk~Q3l)D{wrYCt6JiS+XU(B`3NRm z0E-D9U6uhVs+bFFyFqKoUt=gItrU193L+Hh>QX=T&2DAPHsu&2OdDxL20uMsE#7IC zjzswFR<&Q_icxBn@!r{ZFMK^@uEK7#txB}2{HZN};a#zV@#R44Myu4aE4t07cd<|4 z5_e&@nd<uwXECPG)KuP-pNCI^gv_48kh-XpS}(XFYzrS~XOHkBn8e3Tbh~U#)aauP zWv_7pse?_8*)QS@w`I&eR{fd!fmxfgfIAzN9ZzF7esL!t3A&fg4!m(kVc+qlBCw&s zs+N0SXKu5%F0$C83fhfPcgqtP6H^uIFEc_?_{2G;>TkM(ci%lKH@223eNp+wa)Lzw zCoy$d`@4Ws;)I=6*(!+|av_My()yu_M+;m=humh%N~`<_G?$$C+kHZ_#ZNE``(B%h z*bHxMW}!%IuG7yrjXK#S>D3Mypz3&)dde$bX9M0BHF<b!-t3wS97SScx`kHCaig7B znkkmC?G_cU%IWIRCZRRC4JXjaFw8;P>}rbw{#m&AOn}w#LHQf}mWQyQNp;{sQme3` z5nj{}61!E=dNU=<*GNPQx9~M^J!-gNFDaQ;b}<+<)9A!YyxQi1yTkVx2%BoNzXTYn z$CgWCK?aOGbr}`$`M#lwVoDM<8+&Vh3fMMlp{EYDtRDO|y$CPS%~{jxYrz%SC3Kjk zBRGRrA2SRF<^i`E-0&$8J1EX3K6RUNb<zO}fqMyDWJ?r=?8)dE4PleULWEiRpm)~R zTx;=-BYK>LYG8Coz^4_}P(nC#wKM&<R`?~!N7KWt<##z2US}v9UR%C*Vl5oMedLbX zIMg+g<L!eV<GQ7bzqWc9DI7J=SFKj%YnY|p7*hf{1?_LyV^hbnnipB7E0og#!vJg! z6z6=srYn_FDlF*~d5g4?%zq;Lrz2i@Yg+CvFN5}^4{^8n>q?IJ%U=d$NJtj9AM3A& zIZG~f))w0z^)H~&Jhn=L#Tu<;6@5E|gtBOwe$9#tO36I_jq`K_$b<gN4K~b41zEqg z6t||j6rWj*D(!d$J?s8iRSiF&lSU3|J9T{mpQ#xRMc4pZJ-x6uO@@zfO?i2pjF6cA z0+^N(qi()<>dcR~?g1de?8FWK=gyNS?$U~E<!?mM+s5W&73i@LsSv{2jA;yysghmg zHZrE+M8KM9P4#1NW&`BN-*T^$m9==Uq$kbixDkYP*UGtD{#pAn-Z>E1R18yHS($AT zF)NoBc7LZ7xWle7k<c2d|8&o3o&C~%C-w#|_m4i$GB%=y&dK|&sc*Cv4$h3q_!T&n zo^){{{GBp57p=UWW&|Ko?eW(4r-!L<EG!Y*m8sL(@^+lw`>iiG7j#7rzpFZDmPIKO zdw+I}WzOt61a0((B#-*+{fzr@B3pInXStcmnXsi4x|Ow9;^H=p4`~Ffz@3X~yT@*+ zKJq$ikmHQ^PG<s!kZR4@@4+I*<q^Y}GR?+$QuFy-dg0x^kiDr`!U|TI$*GXN@mY6v zmv0K*`os<wQ_OgNh8dMukE-Xtw;#pd=`|uUIrwe0xdJ9@J?_e)$W(;fjld%E?jRq9 z_7uRxQ+Vd@pH=FgrsGt?ZbH|KjjE(BU~moP3CQ(EKAqM-C8l?OJ>QQjabP&8$IB<` zi^$ud==M54D*L}kW58QrU=>8HZSnh}sPG6&{GZ>!Y(SkpUrc6aAt3gTpx;KRUG9uF zXgaPvg+Xr`B)@owjNQVv%z7u4L|r{keYpi)0=ikjn(a2OZc#+T<t|O|S4{H$@a07W zA-l=x%Z{iGRKbJ!^S1A3Mv)8Z+7C`M4&exq&XZ<cnmvm4p0r>~?T6QfcZ2Gc|GH!c z62#8#fzeyiu+6$3cKYTT@2i`rx-V`9o?Y8IDOG0NBRaeg5ps`pX0&2YZT0SHQ)Gw6 z^~ew>OR>dUFnXHHmzww>8k#k$>xBU)N0?YY+b`MAq^%g7W(?^TtzHK7>bgXE25xLX z@qG+$ygyxfa@0;b)}{}f#1||6ciVfK;#_vyJq}Ct<dIAc<s)m0>cm5N<}jz0TD~<M zSm5C>%olXLziAMmXr&kmngUyO9%!BIz>Q~Z`{Mo(toG+UdBthi>Pt=cKXmB@E`pi& z>Nle<E5;d=*74`t7=!gKeRMP|Q;d6ftS5ifB>JO-i~j_o-{4xsR&_WfCv+_6mF6C! zJ*uk-Jx6d3aJB};F^o}aZKjeZWojR9x<9zHF%W86b+kPEVQxOvWTu*D)H-NdMTWDA z8`LVf#<3Pnr_7{$^7;4TbLc`mP@u-^`FXbOcCZVJ{=CQ<Eb!jcUeaeQ!Xnk_ZRdl+ zVxJj}jR{@xcmpSGrT`)P(5a0WY-)pO?0WFgA#@&nX#CizRv@ZI{Ls|$_=C5-xe+3& zH*?Ye>(mezhdP<h#v*LC&yEr<zq5GM@@LZm(~KkvoNS=>9LiR7LY*D@cbpkbj4s1e zs`e~56FVI2pP^OioZXMEJUbTDZYI|LjJ;d@>mUi;B-|GWau(4x&Zux5=P14{Ksr_? zGRzesijm@xD-IcqA*t2{`K|o);#%v)Ys339gduFI@3DYK<MKxBslZA-d`tL7G2EKX zsSmyPCFGBb1)y?XrJy2ia1sYHgKqBNS65>Z2!v^C0N65MIse>pO<mWhwyWKA)8(o< ziMkY-3%aPrxCi_HoCTn1H`OU90Uq5>GnA^m^Ib{7(ZXK8zfrmf?`&nxTvum5WW55V z3EsZr9CP??S3p!Ws(LzcY5M57HUdvD<iq<aXUC|I&UpI=ZL_ut54ob7dDc#*W=tNB zNxMb8d)F?7HmajbJax?FKW>?EYVV;fCDo|M_^{+*Y;ltMAF)gS8j70BX_JN@{7jQ{ z(lInPR@2kdqo=386huu;eXiaBX>b(L8I9|W5{LtVy#ryNkmye9YlaD>!DqtuJRYQ| zfmbevAMFcjA=o!`JCZ=b)rZZZ7m`quE|_mWh(eC*8&~T)r<IvR3iVTm%R^dq!PR!n z0SP}^Y}Q>C0d+b()s^<y!zUR9SAz=b*+D4r6q>0vY`!<vDK#5*<gzuF|8Xyv5ZdYP zEM9IY(_ixAv<xc{jaF-3%?4x_Z`MA=Yg9Q{cY=e(pH2C!?|>Fsl^?GJW^)u~$w-&v zNLc&XIZxfLt>15<L3APEC($?sqn&ZU6;)NdS{d02^(j7rPR3v?!bH>}<|J%nSRQj? zvHlnqNXycE3wBhOpt{4MBM(%VaVo6!0{t33&zmxUGI5j3riBo=@liK}zAlirI4TDI zQuTOq7mm_mUv2f7<pB=lbfrqBkF1`LjWbZ*44*??w~%&^)c#!0BkoofJ6Mk&cwg27 zDgS)U0LQm#eIzF@oofQP%+u5P_pki!{@IuN5dm#lRz$CER{%b_X{A#9K8Q%=7Xlnu zPkS{hhve(T1IJC#RFq=}C)9tAf#dlSr`y5t+L0*WKpl+wJY<W&IC}tCi1OZ^;x&%# zGi?KKc~1}{t>xm8c-t0WjFt=eH+ymSh6iwN??8+T+P7!(Y7w{qH~w$Z#O?kRa0ML+ zV_uo-@KgP|fPk^lkpLTi3k6OP&NZumU}wl6oAx_I#lXPe&Ye3CO-xMa85mUW-D_|A zM^T$R_*^lzI9M1`BhMK?<_CZY^p%(Z<@P(|ZqpSN6-AbmloXYfO<|*PCx6@O*R#t< zfrH{+rzn#z%AWfEj!Y&Ym_&f}=8q|4-=-WpcWQzb_;%$wiMYWHgJcroS6;oEJv_z5 z`WpE5E{OuI>&E85-HdIgX=yDvPdPjQ&VjW3WxKs;O)X#&$ebcUcIK7adEndQzNg!F zU>43~3g^$MeAy=+j+xwSYEB~h@`uXj=GMuwNVl@2S_hm`lO|KuPs?=Ewrhu$wiy^% zx2j1Xeb|wf1AhC`Ra#4$(^Y_3gwqt<!dy@ev(Q{JsSH}ucK+Rm!>QGMg2=plD(q6& zxA<5qdEmEIY#peQFEamM|902VVnUoGGF8p!sW1IYUjzg%k6lcFDOCGDdr3xqEW$8! z{Hf}`zP_7rORFN0n8C!fz`5}js*PE)pHa-eFPDzOM1i%dV6qw&fl5@|fhKBXgs6o< zVC}hEd?^QNre;MhQUAswyA8V?u7#lJ=LHB;EL7!pPpXf@R3|%b^7byU9{ro{5qz?L zyl|t#-7W4N<OXsTn799?g?<@e<-E)C`gU%qOQOcP0UtX}F>#gYZq8aQMoxY*0C<Q; z*cgL=LXOL$&l1n{q}(zT^D?b~vC8$HD(sut&=1KbMMq5y`e$raWHP&yS29$7?>D9I z51F<8-WjNI#Rf-2mD8}nKagRNA{EfXd%amocOi1sd~)*gxy4oX&smSi@YC$83-lhI z_!;-gcZVs{@qj<t`41@Gs%(sLOw%JDL!zVRGxbbqH*8p?krl?$T@2^!UfPo*!3_$H z;`fnGqhrXS>FyrfTHn%h_Q7vrWMtNljzWAjHm!zpjB!ofLYrKpPzd#~^g24)xqT;u zu9*zLyXv+Joz(<qj@LK>W{^xKbl1f8@n%RD;b40hI+IOZOKvjD5%({tUr@=r<z}q% zO&4>%)Nt|rOlQVwPTFH9jj94VAOhmJ*mnzwB&G3cf($0y&bxWU$Ow&qel$VX7irW= zFyMRl?)5%b6up=#9+#RPxM!fPkE9wCyZ{&?BMBl*MekwBB$!yr5=tD;RlK+JD=dbX zO~ZC|dU{&%f3I3&ji|2yG^3<Hs&C$Ux_be%`r%{MZ(kyFskLhzMozd#jtn;kUrRfJ zC3FQkB`lly2X7zK*^P>aGKC+#%vU4FPvzHTR%tMbHEK@Va=2besxju9WcvL`tT+5K zz3Rv`97{FUTuQF#_}qQl)&1U)QG&e?!=U(YabVVAdlFVB?#|?+(7sbCa)nGwemzyX zad|BM!MTauGW{D5v{%U}(bLzKELj`SC#I__tI-h1Tr(~oy2Y=RyMOAkCleWYuKcWm zE12JS6Kc-U)zvjHF~LklMMd%j3g&<*ah{DfEJsiE3^wmR?j(U_jBxFQ4AjPyn!E2G z_ABG;K_^iLIhD6+!t`&LeL9;-Zty_c)4)eL78WsfJsOKhw8%>I!a~8)s*Ywjy>TgM znr4w43ZI9;Ho3x8_4K5g8erh+Lpg84P8f_I3tWNlSGHf{Zg7#AoWT`HQSNNz`!XM& z=f3u}`jI&`P^j|1ScX>M69=Q!%X@dg4BN?6#U;f|^(Oz0j&~`A5b+5;uV-fE4kTCA zi{C#rV*~23BEk6K8m(nQatnw|1GnkvfAgKTM<kzBU2_IX#>|zG4ojxj&yiU=kL0Xz z^Lkp6@lK3Yyc9)Z-jG>Z|F3tFC{0FBUi#~Qq;%aQv$P;-Q;)h?$qaIM$3W6jKQLUt zOUEXYHkCIQN5=E%xOg5C@eK4Hcxg3F(x&t`5oEN<Q_{hvqZ%-TPWpqJm$WHCe=HeV zRFW|AA2R>nM`o3cN0;5mK>eL2Y;A3AiRc3c|8J)yCx7rg3cWk8Za_J{RFWwjoS=pN zj*v#KXNQV8_I~CZD&XMwd3mR5cYe`+3R)sFpB%2?FwIfp$i`@46SI%?R-%86bL)Mr zL<X@cw%bbsdQYr5KHqhZov0~L?@n_F2J7j$S;CdFY|J?5kS54=8<_NHxqEa3kudNC z8}O=+T(#_jFGWSSG=FI36j$B2>oHDS;XZNA$|_UCFOyANFp62yNzLEPdDGXtrF!ET z={zWL;gAfY-3u!yKrk8Uadd@uRe6uar`>kG|G1<yW(Vh^8fc;QSkdl9Z<>U#bzr$7 z3yV4B*qfKYEtM)<tQ72ccL_d0#zCtI29$N66e6xTHhOcg=(Cq8Tkv*En!@s*B1N~L zI}IraR}}8!#cl-8QW7w+&r)5?kr$-W=a|pWADEdKHNZ8M*YP_3%wk^;MIYG>K26Fg zt>Jc2GwRaYax@1iK63ik67+xi2RD9wdOO&~8$K{H%`BOa!BPHmM=xc#*2C3VNAt}c zp07UlYHRCNLHH#Z%%2Xbv57RwU@}tmMa8wcsp*d3Wqngawp_K3T`P+we5DoK(bPgo zO`{d6Pw%<bHuyf&@YjxIwc>|z<khH><E!V+9`T8ZIXtzH$V_>khfYopgM))_8+sof zj=|%@k(>-a-Q715(EDf*B2bA7+V}4e)g<4XQ&c37Xnv!+XJxktB9>5&@_7i-Gb%GD z+&4@ROfX4Gy$h=j@ty*YS-r;HlLHK9lKl6}VJQU#&pnGH`*Qjm>cCF)*RQL(sz0=^ zzSdmQ%40q`nJX&Dpl@zXE3N?7_R5UY_{C2~%rD-Nx{K_~Y_>C0eU?nmpysXRnjE)s zxeRwDn{6c5HSt%Ih@(`!y56!}`wmwoaADNng5{-^5&=<-8AKY%Q5s>k>PE-!LIgx~ z)Px@y+wkv{TTG&IU{BTAWP>&79kG1dWTzcb38@*W-SfRC)S&Zi`EZUmE;pw*U%017 z)9%M;d6lABTq|g+Aj@dnd+{f|<zB}D8Cx-NmE?~`9v&V>l61-HQvA0Z%%c-djTClw zcDzO$ZgkF6uQwyuflb!FTK~qxr?ai({27&d8YYIu$*Rdb;<jZg(WATXikJ-Oo6}MD zF8&&|z75E<Dto)>$-05b$>&{Q<qYyw@9Et}Rexv_qE|Yoa|2%JwGd(t^rXJtnw00} z(_yCz&!5)Qw`QutB6iDqbUwm%$&}1en9-%(cGst;_wD*^a3#jXW}5zE?hm`&4Cf6S zoONtNc96cp0Sb+1$z4Dc%@N|JyMM5@W=Oaie6<Ir-J=U-q5i?i3?J3Zo;tt0Q?Krv z+*!31A17gSbv}IlDxOMD&zc2`NQmwzG%5k%oyZ&&Cm4!^Dq>&PNA@j1c&f$X#_oE= z?IK1U<S}T@<Gtt4pT|P#*Pa)l8FFK^NTQp0rIn2TTQ7>r#iSib_~>hw?c<~OI~w4^ z(bUw~4G0>M!qdqi-^91J-%VtcOel#-)SK1}-|q(0aj#T-s4mJ~%*ksON%yH$^9QNA z&HOQ+I;d&3d;CmWB+dKrOa4XlPT!uI>csx|pBHZ!{vA|vO@g4o9N*3YZC3kbI8n~= zaW*@9Is3rGz}24`KXH9L(2(Wu9nk*o2z3xrOc+9NAftJkDGUnOm?Pp!V^sOG65kF_ zgL+W9F}$gvN_`<{Sv^zJYoXg=TR8<ycMI5+xMv9Ql4a1owU<ko!18i}gWpAl9wV!n zBpqKSr^H1g3PuHlU85Vl7rVCl6*<+}rNpz2@pM&xpa)m2tX{h+lc`bu4r!|q&Q2JO zuP4zea>vy=rXpy5Qb15FvOZ<uxkpJt!Mj6KxQCU(c1*VVe9?<`uutKGbzo-yRaq(+ zvNs%^rZE2}P0~~Cak?qv{4>?6ryaso!LC}>EP>9ee(r&86P03WCdTLg9kPsaOLNLw zMM-9p9_vzqbw{$(8C=PxO~N6N-162j%m#&sg~UXe<xaXl>v7YxY1Du`u%er5R`E4? zxKk9JcIWARda(Lq7HP37rNvP_n4Bfeo^X*gNlApE5psfaA1h;bIACnKctnFB6N^Ss z;6=*^1_rOiHT$TVfjU#PS#xt6m3-V#Y`ID4qcsKEF$}uOto;f#w>d(#t12;aD9M~q zV6YlhjH)M_a?82Zc;{6LbU&q+ReQvtE3Db;MvNpp9)k_(8P)Y(BKwn4CB;G)oZG=! zL~8{lVEZZdM6pRuGv;DWW0e%bFa<Hb5-lLQ8oieR3K-VTV2aZg)w8kT)IITecFjv# zm?3e8Spt}=HZ8w=Ef&oAB45&TQ!_`jX)-bKhH7RN<`Y^~Ps2HA=d<)fbtfKVqGLBY zFFg{tf|bNlSt_cks;iStq8F1eBUbF?63dlUddB0-x{5mv3WQbfs#2v3rCK-56N8TC zk_rSE5?hOZNdhmHM|m;vaD=KG-4h+Dm(NR*yX((*y9TD7aEiuR4UDE!j&-}>au>%C zU7UoX*~xw~O%Bz<zb0m8=+qL}73KJ}nK-p~nsajNq^@u(OYm_RGvs&w!6HXG<!3;e z$*CsiAvN;s<YM!qc?htoJ~Y4%4=rMsloQhYk<*gLbFsN85#A*Mexcf%CBaQ{(4?}o zH6w~ZcyhfHW(?2EJR>E#t5>)Sb)uG*BK30BRDJcHx&^ui#+H{vQz84JN~-FrTt-Sr zwlMQGuB`7}ADKh1ONnp}-vtOi&+nJ_)a{dbzJgt~T=O&|=;;}{R=EpR1NEE@<C*EE zyTVCIlT2d;NomHXD+=?Cji{Pz>LWUmSjKXNg-BO-J&PpD5%$c1%2K7C7%jV(*DRIy zj)jE(9gf^B8W3-LFaiRR&)uF!_6+7QSy?euz;?}(Q&ZHm?Dfwy7btT0&HWzF$}quB zdXl4=&=XTrrpuS(s=QJ00%bx`ucNDZI@jW(qobExoD&Xt%4RkOwFX9~2E92+_|b_V zgP$+O#e&f>a`wo0c8L<GoSmUFJ%9ea=ospp=4M4R|5mBH>*EYo`Mi2&)=#_YvdJ{q zIGEUOEtC&fb5!LP+(a0qs+!z;TI&l|v#_wJ<*S3BCe4%JqM#`dQr&42qxNsoJ1R5O zwP5w(Sax>N^75)un3A=y;3H#OMs-)Ghrar1c|nHH3>(y2n*6=*fM1@6Y@INkA;Ut~ zAI)?#c`x)vts&S4Mn>3CiRNRf#UDpB%-*kIs`D%#`R1K8gb)skJUy;kI{7QT1kQ7{ zFh0^WQ76fFEW5H&^yKH<(i&cWS$m;AvB$<w8~D-nOG~S<eGmwfk+B%G@5tuTDPRPd z*$#Gg<TT|dXy!`wX#U78;u7@BoEy~^#Scu(Od5ze7(O#93*D&`5ai^A_H70&0gnpv z7rzzq(x`UCQ`gu)ebWwMsP{gy&!G!!@>GMKPq>QJ7ay&Ss#gy-(26ZDqqkfnh@U0H zKO#@eEt#zFq61Si%<NrO-FCQ~B^?(_UwR*Pb$zisXr7E3ulREjSLe7y2UQ<X%DVa< z87FR$qFjR=$1abudu%3Dwidl47P;G*m)|U#F30V2w@%$&f3fM-h04PIbWv#E7CHtA zO!-l&bPJ1|@-G6D7pW6(-<VdMzi%$zoWwA0RaIIp$s&Kz4wLK*8gzE*JYYPLZU>J# zbplVb{_Y(XqfAi#NAK>Z;R-P!q3G9nFfg&9veL^|9xSpW*y}BxKqek5%SSq`R9yf8 zXM4W;o^A)jh!hISfJlAuSj8*To(=;XUVZ;J8~C3b^#2L4|3`DsBz&SnPiFy7BKr@a z|6e9F{o*)*45?^kIw{lB({sLlz0uUv^fwrA@#4j^u<-D3MO3l+-+p@wP;eySlmalD zT=6+A458U&en|vI87Pco6^lwrqI-IJ6d}+xn{f9oaJ+5-3NWjvqI8kubS2cReFDZ| z$6p*~u{8j;4u%EMlW>SF3v>h~eI<$X5&Xz<;Bgw9e@QQc%lZV&u_7c4|Lz940`F3t z#289_O-_K5F;%XR7{lA|#S{y$py`qL`9E9!&zAqQ<^LaS`HKuE=cFW=m`xb{Qan4( z1ewHY9f#QcCLk6iP*D`8q23qkZ@{mnr?=309wMm-JUQl7n}x`qY?>KX(OiU@hK2_H z_1)_ff&!*={fb*CzdXBujKG0LiPiwGC;9i!iUQ9JdZlum@^1ZV{?I}yHfx=5$J&F{ zjT_2QTS+d~OfSH~$=`BR=7$c{jqd)qe8xQrt<YGtu3}G8(;oJp0pFsm=6>?>q2-^b zEqgoA-%8NV-ia;jhxK6PtaXbx!b-H!K)~j2y`~e5cCe453YobY@5Q`G$6k&IhCI&V zNQ0B5)gu3VrD*D=oV?xd0$MtrC&Y<n&hetYz~5W&)1PgVn4)XiC(@24gDc8Ai)2Jo zTy|gIbp&fqJ`#sDIT$^;A^J#4`pa3vL{{$hW@^1J;bH|B8$kKLu0zDE?(KXl<<*9o zM^YwE3m?}nSY?z=2jeX>qzf7f#zo)RcC4<;O7?$}lynM0?C#rs+Y{)^Q1187S`6y* z?z;u|Uy#iX(VU(9(WyXjp6k^qfJ>X<d4-!FsTFl?Vi`BSV{MYt`5k2xE49VlB&XR} zt|6fDXEt5~z4-TX%ZNf!bsO$hpn&((o|R)290dLd>GJsgZ2c5dkH_9XbM7UEM0SQ^ zT9s3$DS<A0VqUsREt^%xx}ka>le^$`M4J~2J(s)tn}rh;HW&_U;JXY5oSIo*kl@5? z)MWN`io)RLt>b2*h0=Z~k!vqwYQ6hA=Lx5O1>T<dWb6H<8K@x92P^6HV@muaFu+o` zo0-c15E{}Y>`quhUv@HaeUR?9GEsLkqFugkcbuD9^@NaEGJb13LF}eiCLi)5+4lwM zpn+R7o1W=`Ja!L8Z`S-s{U7YSXH=70w>G?0l&vU;D2P;1Ksr(-5YP=s2L+@Tl_p(E zXdxgrL@@N;1VV4pLJgqw&_fM@&}#@02!s$IALkj*KJRzNd3pYQf4;GQ<VVI><(k)h z&9&xS_dQq7gwWS%iQQ>A`!i{{o^(FM&iasUolKCmyU$BtC4buKvo4LJ+HL=WiO`hA zJ~BD8Yj;g63$kdrcrX4&y|3}p93J02>EQhwiIz9ezNCluN*|q{aJ*k~_RLp8esz7d zUFl065WkDf`b)o8lff=O?<MOQ?N3d-e(_I>&@VdA&wLy|&(oBB_@*9mmX@w({}F<_ zULkPhtU0(%-nD{$FbbSW*k3of-*WKCsNOwGgEVy4>*!^8E}rEJkH4H^RBq3EaHf?n z&z+z6`4o00aeqEP#rS3N=BG2Q6n;DhnEZ0{Oq%XqImO7Bnti5~?@x)QWs5$4CQT}* z81KF|xOt|PKTe5$c~AdLSN-_l6r+mE*T2rRlKGTq7nQU1{*M^`5yL-X_(u%?h~XbG z{3C{c#PE+8{t?4JV)#c4|A^rqG5jNj|38bN^V{{ZzwZM0M;QMI<DXUH|3fkKosU*; zM?Y#Cu+>E}pVjIdji=Dd*CW`2YTpdbiTWBo*)zw}IDPaP_qiMIodtQx=+tO8V9&L) zSa}(9-amFabB6KnAsxkrMglZNy%~Dm7cEy-<^@ho_*UKuoP_#TT5T#xpRaB!^xz0C z`+y4Ai121u)*9Pkf#o&5Ju>~#MP$6qn(%X;u~e_QFP*}j(aXrn&hDc?w>mJE^D^KK z4d($ICubn57|Ukwv9FyhoBAU~?XxM3r)cY~1TTFFm473!pu0-+?s-Q}%UCuvG!x+6 z9^CaUV~;=XntBa}ADh|!d}UfM-W$Q$YRiDxR(zMgmQ^5u7q89tUm&#>SjaUPLu;<d z-EyLUBC+SKV=4Z0?3)eTYS4_BEnMw_I%DBXll8b*3g45-`JnZ+wS*A!doh`rV*VF* zbDRE}HCR~@Z4anfe4plyxDSC`kgza$@F|90byo|P9S}A;Djc&Ap{km@xTfpqDC;xQ zC(_FoT(wvrRZ}frxH|5ZfWWcX)${jox`fcS;LWISh<Qi-EL+`<mW=*BpRZEw%lhDK z{;Ge3q@8MMKu&;_=iky1y_oF_Sn59(d9BQjUP^DNdrt3K<P!sp;8SY?mtFfRoR+F1 zBc~&&z>a&BQ2yj=#KSOQ&8tX<26lJm(7$46O<t;Cs=Vx$orn7Kp9H&2W$j=02Gnl6 zFkkciemAYH2YVsbJ)|YkIY7wFFY|S~tkj$O9NrVv>@GKx5ACGjJ5i)rx9E{XN?@_R zp^?xx^YLC=KuILA7HLk2)Tkw0!ykg`-846G@dLfCo`*^59hIO;JG}lZ>1)%`c^&p% z?mfV6>4CR-@@oC7hzQ-<DZ3Y$-znBc$=b0h^?(GI9sfB@*=kyU)vle-XJeY{NrI<q zjsdS$^S{L!B^lD*MRcjsrg?HD^T9;33w|L`0os?C`(mE9)ZM9^V9e0<Uiy>Po#oa} zlV?CoPQ`j<j{|_cyi}|_Q|}y;`b<4SRhtW|{;G6S>4z0Kf=@3q+@}Ds0c}1hs+LPP zU)5YZLFlIkeD4Vb+G#Ph&^}!XL+VHG>*l*fXP2vYKmeDX5Bf%eKa8tZ!ra1cz8MO5 z?teg9hQ;1O2)ZLGjR9R>a_INqJtxK#JLg?z{q-;e-?C)qul!OqyU63c!Q1P7d0XLK zwzyE>&Pqm&XQthGr^DZ_11l$_?*&U6CZ6$w9~Ke}2QeC2!rbp#Z~l4ey5|im|5kk= zQ$c~bh;+vd9Dd!Pue<w8oZ*Xla~{32C@v0@Y$Xb3d{g%8p80abj6|oTWQbp=`+o9H zvRfC<+}}v?_xY{RFITT^@1p3_2ePo(ijld#ZzRrxr5zE^m)q~wM4o;98V&((fA%mL zj-J(UaB07B+-Xx*0`@8wPG^2@%Avb#qNP97;O&7ZF{@YkS}jKWB+0+@I)8-U?EaKc z=zfb>sBZ~7OEMYtQ2LD}+%~>x@`nX7oX*bH?{S0oLDWdspr*BgA16oM1Noq55Bkfc zr)#}r%02{sxj{Qa<-GsZf<vop$3JSbK<IS0xHpHj{v`m_|3B;4pDJH-PdaW%Y%xBh zTm9O3X$upVNg(ql`Ua&*BLSI|z@|k7;TWYi=QUg(iFrN4hq#Ag3!1FjupJc80G}U& zaGH7AxR4@I`FC}y`fwu5-i)U7#gh-i4pR#uj+PdcuOeNfW}$$Qzf2o*&75?PAEylN z1Dvxnz11U2;!3!7*^Ui^Qlu0#Lq^?ac(27@es}ciwP|(r6Kb<)DPc3g248Wg0;Zbk zdLy`<`B5G6K7Sl3O`Om05k3T$t-m!-`h9ohUr+cW!$%Ir$8)>FbL5+Q{)*brzZYIb zuJbt(PM^PWI$Up<^{>lOd{g}0P%yT$mNPCx2qIC!1q|=CVen>OTaVI8>}%t$Nws@b zv;U=7m;4gI1LR1A<rMSF?3XGw6{~PvGJWx)l!2gW#K~GG2)vLZF*>~Jc6$>SRmKVY zgG1gJwXw*jmBQ+-xG0DHS<HbNw}%>s8uv`hY3O`2OvHTuR`_&hdj*%&nfs!q()+oF zJ_m&5>7^yqCpy$v{*3T0@j|oNtwdujSDj@)y)5_rY_e~)WsDGTBJD^O2mjIZS5Z+{ zK%FU1@nn57&jitM)p26#*DoG{(t?;2)nqP9*~!^^kPB0<rG^Ym-L8Jl#pyS~LyNbP z2I+(nyLUFU{b9BB^CzN?gte&RZT=``X0f;pGkjPwD&vN<Uf;K?-Wr&T*I?IXP&VS7 z9r{+KA#kMdK%~8-#Lzw0L{W`Mo<|g%M||;<nme$Iwxf;3T7%1_^bSea4Z_!6W?G<} zvrHm`RIb1(B`T~}d>)`?Z#jE?>R8ry%YYRzv^S2HO>~Z(Tb=9kFdQFsGQaxt_ErlI z%V=vx*TSb|{hB(n(8`H>Z#SmPLA{A6BvLro;~|gnUeeQD+IA^Rhp+U=c&Mm=AgX91 zH|Ak^oQz{xVs?yvsh$q>^LS=A@U2Mz(XWr!>Y2U(U2MitB9`+5A>=cN9j`m+Y8+{0 zYYI=Tt7}dI>!n&WpmOd3Ry8uPN>{>(=RUs(w|kC)D8SW95bLhm4AljJ(Uf;sl^}av z5vdl&{$BWm0v=!D8#Q^eFp6dRdyQqGjV^W1vuC6gR3b^_QguIP8VQ2r99!zSZ+#KQ zG^u?UPsX;}_n@v}avQzWT)x~1Lk7$FYFwDmVv64$Snk+)xLTr&acGgz9a;IR)tejO zSYws=bEIw{SI=j$A@pFAP>WnbkGVrTn#AJQ5HiQ=s9up#(!v$f5{BA7zlq<|44TBC zC~pBjL5UI)nbRv~H~a>v+5<~fKwlitT{7uwp=&tYyR=-Iqo=X*v+OuPXNjd?@mHNq z8PraKy!0JU?`;`FcSxwYixBSz`!%0r!x|cl1o0#F5QR!>kXisnF%}-V71jssZt_1g zmN9V3gj#yZR`#!T{y1TCHdNe*M7s1l!0Dlu`Vs~iK|avBMcc^ai7&(;Z}T7urXWe8 zUzvL~zCX$#Ge|{qB^RNUzht|AtgVQ$sq>JBR~f*o#Ijm%3Nz<dJciZONCyzGz_6z| zo}?|ydjH+LlMmHea2K@1w_=^Ke>rhpYHL>}QU1l@g0+J5Owm&a=i74*o9(3{6`{uK zgS}ny110F-#x3_CJXeo3k2~koT2KK3y$x-eLT&wd%TOeCV_wD)_l>HH;fGLjnNWdC zO>EU#x#=x_HJg*wJe+agG`r+6xw$iOn@YLkT}opIJ3ae;;Y5dxn%aS0Q&KG@47H2g zupM+3(|kTChpwmE_9<4NlY50M`Q&{{;<e|8h4Qg6Z4UAV`<3CU`YrVucbM(2icNlG zwQj@)n_~eGIZky=JtMfwhbB0j5AwlO(oYpTP8(#^obhNv<1!u6cBU9(>!^VY{fi@q zlx}Pl@8eKQt_*1Nl=EGxE|0uv*t243et+*e!nN#8k5gfym!|}_QKFE(;o0*RQ@FJ4 zA>`+~v;f@qj20EWVc2na^-&&ihsp8M-V<-i>5p}Pf}2<gDo0M`hDmOgf_b<GEnv@N zHkG)g59@<Ud~PEOCzgu0Y0H?$kPU~7ay}A1908tQ_ThpXxsK)^!2Nvg6E=R%<!Sql zZG4udGe%@xQ0nFznMFZ0+wIS?b_UEdfjP2bj>pi5?Z+n6rn0mEbIj55l3+jr(rKax zzIVbfy?b9PHGLB}1jg>LxDU}z@RiXK;4WJsJd3WrKS^R74`y6t_vdKK(qcY@4jx*Y zrxbj5Np^v_meyG_sJeF#<7Fn<*ucj+9AF@so+-X8cuJt3Wzkhpzi5zia-NvBwf<)8 zd%3-ZiJ%sw*?R}>AlcV*iGwg*z1u1fpr*SyEx76$ZCAYX+xcf(#B?1Iy7}lvBVWuc zzqd(jj{Nf5rcgh8!!;fUsAehwp$+zNAJ3R6l)YPvS_CF;LAR5)XO;V)SO@98F$cv> z9siZK{xSp9Xy7=aRt?ohyqgk0kWXL7=99{%K<0MG`n90CTYA;LROd;JH=XcVw=TF| zb$@%an@^9VBL0zF$Sg`Fvct<#b*Bc%x#Jp%^})HSoknci%du_nV#2&T9+-AJ;K3(& zf#$3%+%{lVU1PJ#uXt5&$Jd%YK9k}SuAroRf{9i@la#R0%rkBYp~2D<mml!+Q?;?q z&AiqaW*sZM>7gU;-cIRMpKJ^pA~>dW`D9NVU2;T8-l>A9HdE<wRD6`n;f|#oUSLq3 zf{NT-!s|qmM=_~i{b}-^&JATLALhQy?Ms$avmZzkh*npz?@O9*N+FLfvl<v&^Hlvi zp~;JU=l>&F@|II1yS%$q`Z<?9RR?#FmG%`gaBMPJ=?(WQ((NbCu`7qmu{#?K*olll zlJ6COl|f_H{z&r^=PK7~Qq$(i&nJ$^>(xFeqGcSARxAk}w+>AM<G?mFr8+xz<-m0s zSjTUW`S_S8t*?ctD-Yj~^L@aEt1ZQUSVawVq-T(p!8)Omw59z6wE@eMTX@f+UX{w2 z{PQHq6_8xAz#CVe`mw^rxn^GDSYKaEnkjHJNWx}l%7vf^HlfeZ>V1;)3%D~*^0B8k zlTUUg>*%2F;96bA@AElO^ZskHb&+~Mms<9~7XFIaN2?NWWyGK9t}DOToO*9p%XC}= zWyW&^aE|1yaV@1!?A?|)MSY0f?XS#Vj%h6RsqFVe^1RZIk>5FaGO}`tQs*bawab>m zpzD}98<l?m8Hh7W`YH|uS2*9CwXg{#LOD!n4U*Yx0w2&(8t@^^1^s;g~AiL)7# zvvC8k$oemMnx<Rhuu@uLt;>*EOLqapzgT`+&3{kdw84-X_<lUEY0Gz(6d1i77uP^K zR|Sf2gc&!?5I*zljIks{Mn9@>wCaC~u5wP?M77K`8eI4t=Iz=Awf)m9RjQV#*r+u? zp0Uqg2QKMq4gp$T$3wUAmx;6MF&}1U<em-ze5PHy_K^&_Al~nrX{%<pi%t1ra*tAf zuEd5<XmDy-H6z-X`KXP2xo$G?R!25@T4+}!3;&c4!2-D26dLJ)OUxRmLX8rk2hzvi zFHjakmGzVEzH#0E*6gc?TzrD-^Ph=>4AMukR?AR=!0Qe>hhSMq)jIX%vu5$9LsOf? z6A}R#J4mnTu1PN&B>zAU%2+Ma6MW*EqyPIbQ-9x<F=Sn!m2e?%)j!MV-|5br(08gg ztM%3Uax831>Q=b@O^ISU%|!JNmsm9Eo=UaC7`&u}a*UTvnn<apeL}_YB5cN5xvY=O zgYB_JKrA$!Ad~7{H%b+DC@YKm{E4y9s!G{MdZ}k9_Z}(`00-(ReIZPK2XeYQ+Fe;7 z%Y*F?XYcRyyluk96m7_MryM%<ux-SQs7d{aV!_=FDz261EJzmHW0TQ@fC?jszR2wa z-|6q}L|=zo8{2wA@IX&KOArsgJQJcXyl4aFp@R^9(4Cmo>?1ejX%VoPilIIShrJ-g zZ@7GTY_>gmWOwo!{bO6TP*h~-sByXPG9GeU>?Mo>tFAWcO~~EORKxizG*P{e>LUKi z5H_uOekZ|L<9RbZdDzDc%I+TS&J|r1nv$ytwlxa)slU3bX*bphs%+8(^D*r8pch5L z#Ave9J$L?UaWT(Wt4V8UG!-4g5^%)3uDq%|5Do`e$L>W9()tLh<#l+z+6zNbDXyCg z6^3J_vC?9O&O>f0heWzCX436T%UlfX@f!#nP`L_5P_pJysom}f$nPhCYJ0<S_-DLE zk24vxobl&Y?*@1kO}ybQeG<7F(}WHL_{=Q5=w6}LS$*w)bkpp@to0iQr_c;~f`7n_ ztHlKOi?8Cawsm%QxrP0_aG%WaIm{K)c?qXM^kP5CEp%I)7bji+>R50!MT(N?xB3Nc zfavREy4)qFx?<Q%f9<v=_8t3dDdI3qc*omffuqu5Fq+i|HYq7Ol)p;fyS}B8>KkeI zDjNC@mCNxuvRf6y2OiYi4HHCfFC>*ZMcmQb;Y_;gP#!}7J_{{LGHDF&&X(4xEVk0> zo^<oB%RK;cAFj)xxmt_?FZL{~$pPiA@(@F4?OrF8XG$d0Co^URSP{zdl+#+&+}Jt> z!QYsUM^KNL981HM{?G>xbGj?8V{vpW!RF&)$gR#1kA?5mX_1MAaxByr>8k+|FL+0& zIRUaBsgAbIh7RmJ_kp1cH)?<8yK9@}03(dc6Iq=06!UUHX+Tl6Y3s&_wF_Kg-Ctd? z@5m~Hxgt^!ste(+3~kGVJTTw3F+acNvKiMT9JQOk74H=~8{?*D1KLV2-oq9?L5Gyd z$OYWrK0$%^qtXhT5?H*X6c0WUf`e#_Ck)oQ7U~&RH%$042OnX|pe)o_1V4~4uc}|0 z^?ak4dF}cWWmFlJSw5&jmQQg~G!#1Cjolk-c4&3ClL83OmN($sP|!@zr5RJyGv{CS z&(|G~wVQW9901!sM?=L)U$qp#jj%hxDg0FP53E!7c#Z*^YP;jl$tRQw{48~fqYytV zfmEPIHEi?yHxHQWss!z&n(j<jkv%D$Uyk-iISMI0P5i!HK*u*HRYyL!obB_W%Xl&V z{n8T(tLMhvd4W_}ttB`;WCtr^dMLXMX;Bg+I9g_i-4#xHWZtKvb}qm|udC{>^na(( zt=8Otxd=({i!K)_<y7+V-lG=M{w(l~tLd>3c^>)=py-hsXDk|{y6y2k=P;xjUzgHi za<b@*vpL-nv!Iuoh#jSsuX+MyDf3x=nVK_3`U=KKO{PV!0RhpmiXR}vC0@<G+f8Wg zdL)0Y@b2|Wk!#Y2bI8DC^Gfw`S$u+BSliHSE3?*Oh%78CZ+g8@&i7S~%hYa>;pE_> zVH^Nnl}|0$e-DIYkBH<}yH#yscCzD&pS;R~Dw)+=Sjqn|V8)2P1i1Z9mQ+M6Otb6T z6P1f)sefH_VGpp09bG%fAE+x^9;-a5xey>K)o?pgF;I3GcQ_KB&&!OGU|U6|SSrPQ z69TcDj4+7=mkFCSThVV~xkaB;>**p0Ba3MJ3~OE;rK!6@HHmraJx-m@Zj+V9<A&%9 zH_0$uiVmJ)R@0#2<6=>`Nbg)O$B_zeS~=bC<cGZspDIN+-(Lv#M1GrAfw}FTL+>o; z13&*IogoxI@bLbAB>jomK;4Y~UJi+?iGq83zt}2XRz`YF4z&ZK?rhu&fck`M6>u%h z0-Xn=GumQan?5rtI#)S)GdaiRHLfmO7ram71!0hBL;fln+qs9>DgqsiO+H$auCyzM zGhqg#rYF5z#VdTPjdkmR4tv_7ru<5y&YsZ;?xb1b)2fmp^|a9T0d#-z_g5Ys$$hmI zIvkwY7F|-ZxNjlgWvA4mWdXfnvnD<d;S{8Wv9nHU3CKL22zjf?wI%y=J!s}a>{S0F zOuCi1O)VQZI0D&WouScsQ#8Rc11A*h7A9;>P1(dg!{vq1A5{fCUlT?Cx|N#SEY(~> zN(@#AM4BEDkMufRB?4xe7g$AkD}0gD-{{FdeXYm8gBFgSeofREnbK|}!8YBQ)5W}B z<L;^6(w~=M&#Y!L%_Xf}0|!6A8MhN`4y~S#{805NH{D#3L1CgtccsXj;saiV^?U>+ zEclCgDU6l>4MORmf_lIZ05RR+?9;K8?$wVlXgM;m#ajDlE$D|MY4Zno<0b1qP0vvE zuW?P=B!BFoncCta_S%uGZ%0d@17Bt~6;KtEow3xu<5zg+%8`+M+F%IZc5#HTZV;8$ zcZss?&G!bfb?R)h0ajhv8Kf^K{Rv{hu4PxLwaF6p4~{xT&{J^_HoHnM?(Elcj(o4V z1l<E>Ev<Li&VoPfj3nN0JXyhG!Y-yeQ_ux<9)t~66jM6?pptn(TfmYt@XB(%dw;Cb z2_GX8Hz~8R4&sQ9ba87S&{BxA-*wRqp8NOoG2(hby9U6z1MkJBJl(Dn+h1F~nbfQI z*Nr4MKKy;QfAFV;0!kQ6lGXC6qRxgOy7-9(N8QtAjxOEVEK6&9lO_ckpm6p6PT3`{ zlX)&8;YW$ide7?m8Z6|ho^J(A;XR9Ie561R&C79^;zwZ#HSl9hL1gDrOSK?Ewi-%j zZXNsQuWu22P9U}53^1D0YW{{};4ptHlfS-<l&BZOeynw^9pp5TIPu~MJ|3drMX*>u z87&|SZd_yRh^%i0us)eFfY<Kn$OU&EcMIi$W*J+cL(yH%w!0fwQj-IZetx>TH}X)w zCXM*qaBtqZ_y&T_{kZI2+lf6pmbcRFlOBDfSnOe?->3}We)^1zCrA81RoGp+D=fhV zR@#ovc?)@~j*Ajt&YT?_-F_V?crc1K@0yFL=@w_PJd?l0xXTdd<gV79d$U6PK8++e z1{B%8?(54n5pn4w)o11_(Xu+d=|{G3v!Y-NZVfatz1b9X5XC7FOK>5A-_8i*@8Zcf ze$9ZhB?I~tyPT$MOVr>i#S@*ivb+P3?E52pY#pvIh9j4M-2&?}6;`IxQ8^!>eH<cP zHhq{7UZw+eO1$Fd#&nv2sa)lz{KfdaEChEj<m9W!V{3<=BI7$VVwu?xhviZx{-u0= zy!7>9pW!vHnSe_1DnLXVgHN@3c|LL%G(9~79uEjYL{&x(F8n3{n1E%FsmMXmMY9+C z6Kw77llxtXr7?n(4n0(&bu2Kkz9F=oUb6iAV{I`C{@fGi5zN?h<L3I8xba>-DqCF% zrU}V<(i?aE_#pd4@Qnq`^gg_12*!k@?0O3)I3MvXx-}jahgAVolG2%jy>bqkj(cJc z1H%Cny|^`g&#aN%-253d;YC*tb?#Xce`P1g`j8(#pLUo=H&gz-Ngc|y-OCN%$}#X| zda~M?Tv_M?*L%%@39z=}`J+rZsP3nIy@0#B)~4r?VOAV3^Gv<}Aai#){Zm-QLmsj9 zOu{H*{K-;MUF@dmwLrBT>$fM(+trr~B=3qNE^cDb#4_F*<-e1?&b#8#gE6Xu!W#Zj z#@Vf3_CHDkwaZgqOwo~k?-Mk}Dp_Dwp-B&{O=8v{$&+?dgSTE7QZBvBC=$FSH=Dl~ z*=;>umjy3@I<#LCTEptaY5nZ}ag{zl<6B^l&;yV2bSpV-hDzkrC(JHg<0V%l)-%Zs z!pKpu$2bpqr;{zY3KjZhY>YzVvIvd~1l8YMe|tf>ft{mag$UOxwuY%E7|C7efhAUb z|LcOoHf?V%XEQ%&SW=o5W8qi`ud~YUD2(D~(hHose5~5q{rfwNiA6Jn-e6ug!zyzN zknX>N3kso{eEo&Igx>y4Pbbk~09#`%9Oy1^-F9&=xx{&%kjVSV+H4+bkY+Zf4%56- zjXPi@B=Ho6dDdARXj`tlvXd%6{Dni|M|lM=Kn~gHTMD$G8;kQuKv%_9NQRa<A7-nw zD2g&KMb)b0S>(MFUH*n)F?M@C^)scv{LT&QnB*)gxVuRSgKWgbdca_&Z@944ex+2L zLxabp?eltXl@H@S&qG@aXNwr*O8SPL&3La%lKr<Bb=;DQi6tN%6-`0r12;xUmuHa3 zOSjhmUXE?4hS00k9MO1|(CL*ICN-M-he3B)<>@I@u`x2_$xX~10dkQcOB(ZPefMF9 zbql?B+N(9s)ENlmSb;-pKZ?nv(d`_gfLMR*{Ld$Z#+)kY7ID4c^}LDn-B$f$mQES~ zU6T0Qoc-znDPXB`Yw5JO;P$Yh1aB-?FfKX*1G7zVv6K^>^^pkEbf*?5qyub2_mhH} zh1WOsmSnXuW{ZL|q$^BoKohFV$?uhrKNtN`zb%^M;twtk&$Rb(i@RP_Aizf8P{XT# zzd(I^v1ntW`vzVGN8ZG{NzP>MtQgx}y%caGZxFgS&!;bn8#nC9ScFetMb?}A^r^4W zH~Y(@I(nV$I(BlmOiI@;YFA0yaJV-Wt*lO<^$vd)x6un^otwqRRvyR4{%o8*Oeels zHITG8n2cSS&FEHY>1Ime0INATd&4F;B+(HaB{?5#(|A4|{+2#A_AKGY6P8oP-Cw;t zZbFl5b=|+V`nL#sPeP$(CgPaQS+Hk|t=hD}hwLYwRl)f)N<6BnOkA4xew?8BZr}U0 zam;f++R{*QYt4s+?)}u0&)*TLKVkMUn4?KoiR^Q;`qBH7z@=D4FHRH~<6w|JL<os> z^+mJC<*{xx-=KItTfO&5H6Y$TV?{C7IzppyH+N!<0Ir6l{tUh`(v<SlbOde*Z3Nco zyf;Iq^ow%=+ST*r?duiWD?DC5aW+Uj`l@=!JFdD~mwl*;RcVH4vA;M>BWa}(OBJ2@ zz@n!i5-W#hgmH<D<PrY!RqH(7F?pU(HZzSxWA^yvDL|T+k|1QF1|&>`({m+?8$&Xn zb~oG>T^oA{^UviF##{rbs$?!-Vi@eCq0d2Sm-mq3_L*@w`iX?zuD##;Hmt4hQY}|I z*cG>d2IPTO9P<=hvj?`<e5v0WdG6FT9}gECO>Y@856?g8l)r@>A7><=pxUo<W5y$p zGOO18wYFngjO0$)ou&F!d#xUqUm=TQyvN6k>Q04>l2Hsyf4`U)x4h`>_XPm?Vwvr3 z>30j_NoGbHcx#$LGvW_+>1KX~mihLoLcULSjC9#<Zy4JdtdzaqQe^1tyZv0X<-+Z~ zaQGoFv8=Z_;`!jjExjbpp2cLTXM}N4f`F;GJ$J(+FZYh^IJt|C{7=)weXdmxf*pU? zUNm@1BiAkA@o2|nN}R8UJbOn|LF%Eu7BoSDf2q(@-l!@V+d;QUm@o)vJ>(}@gELQ; zh&Ez*;_TFRkmH;HY)*hf7AvOLSmqbPH0d)?7W6aW1Q<t;HZaZ&!TB_XE>Yz<Xs0ai zI6w80WKHSYOT0Cf9Ax^?h}kC<{(_X!xaW~zjY6mAuZ*>&LC$4(t#j&?5$>Kcx|orp zpUV)tM<>a@VL2Dkqhz$q(kE*T*50mBGP-yke)<%7=bm}hqA8q;P>YeE=r~7f4*kW? zGe#WO>&88@X67nq_)h{b{VGe2*WNm0R6F>Eg|+aWpDA=KcILlPH-6xYw;(TuD(@VQ zH=<%tB1gnQ={2g?E+2qLNs;=+CBUsu-qk7I<SBRld35LZ*z*%|rRS3W`zsJRmZ7<v z{U8qc?C9OUX0C=8gAP7&$#i$my;yIW7DxmDV2#DbpKoL?E${SP*wNiit$a9gK<nm~ zS<5;?H$bzp(4r$&8f!c;*4-_l7dK3Z+6{+E6c6g;g}&vX&XOX^yPRM@T3Jcsg)?hi zx?&qK5zG6U?nmO<@fV=2gn~SK%lp>Xh?#`#OU6Yu{$=K7!nF!dcw64@hHKh{aL)w) z3~X%ipUbk+PG&r+Ou2-sUiI`Z#CVY-AsI}|290FEKs|?Nhr{lDW8PZ-)hB5|i(8#q zWLS=G%yRM!p$+)95--}Dv%hcBGKR^qX%idtE9N4@M)2vbqC?frhFmG=8(f<0%u1f* zFHOOFQ6*P5*2*eiJWK~tjOC_!5$IjaO8UCA{v&JVwWs;<PI_B(uE+XSJlo1A+7vn5 zUV}`RbhCAHL~_ohg?tQ9rRA}ZP)zf|5B1@nGU#2OPwbP`Qsl=m8xXAqBDO|h5#g)? zSS0g0Na!Tw&6%L4s8VvH7Do5hffkZh@K?pc6YkmXPr{xXrgT(kX{**a?~WWUcsFd- z@ykj@rF+<3yQba(a~%0F0niRz-8oUeFkO>jXQ2K1PIROKq6!}{qSa`|0_dBiB`xja zbjLPVN~~9bmiOIT_;>cdy&|vWG@{0RjCGH-KaBG&9uR#&nLV2f4#?UJP8)Tm)Ffk? zt(-qXaFj24!~b^X-!HE$4O%`J>+PS_T>aw`SX90D=i)Z4zv^<E76MR^M_${0tD|SQ z#$R297<j_6@!=TBlCXNSHI@3zJ@FE#2ohjsFQ^|%9nziBeQeeR#MkG66Z1(UQeZU- z1*Vjt1Dg}e<*|7uZ(wRrqi8Ki<Q@RDX{*=<`F|1?CgD<(3XcK>q<?1Ies6)>81YG2 z4n5R1#fI*w(%nGdX_Z{Y9(GF-Vc+(9$uheayGC_1TzAYOnd8<QA~mfuF-1#a#l3lD z`f`K*r!r`~vW)x9wbGZu?M^gmu^5@q_KgbRbZy)&oJ$^^&&o!5Z2qv&#l4m1$!9=_ zNYlz(BsOK-yH<Yu%v0i5Bh<Bdnge68<V(ni{&|ZH0=|h^d{{19&K_^fP%Br=^QmTM z<s8+j8w;sS&D^Z-!vkS&w*$}>g-;uFj~=HCk^rINf#f811!F->45tOI)Yq_V?+vbC zU<i<XA*OD$x+^ew7Kl>#JvL1}g4^-SZ5zrdGVlH|oAIh}n?sVidvj~MDHP`=h!hg^ z0-V=Yp-MkTZ0IU@itIe6eo?Sop}NzoBXCUBG9o<I$m+!E>h^%=wR=#fXOBkO81_OU zDzv5@H3t*gKXma*=4vl6_yt;r=AcUT<OPmS9Kbpe9vQ2*kRvrIp(haM;(bBFaqOn^ z?RY}hg~^sTlA!x<@%g<C>-WUR-C6SVL<%qez1+W5y7-y0jEol=u#QwT5CNr_H(S7E zHuB#e#LegEx;UTQ<`Q?ggl<|9%ydB_C3Id5pI^-i=Oh0PKF+PCx1aKO1~4;UM&%lD zRH135+T8eVyX|FP;Ob^&;wL6&XJ*6_nvW`*N`g~Up-zK3>BJ9iVe77&+Rsn3uHCSQ z&Esy)!6cW3)#Hn*tY8Qqo*DUmA7K5GR{jez_;^{v!Nqzun-&bK*^9BzUoAU_;ToiA ztf}=3+@Q?G*>cC}4I-8gSljY)GDOXM94G*Lo7yl>ikXSgGR>oOi%_xNZMx&;i^R1d zV1)+~A{*(I3+KqR*@Khc%&N*IX343!!+Vq6*ldTMkB0|JusMADrKO1WNwn0tN3Ov3 z=x)3zPwRPW#T%fE1&-kD&Av|*_%@7y^vyO|nD0EoHU;MkKfI@wq=C`eHNndz2qqYE z9j#2uE8sen*rIv&!bqRj-Zru;df08c5D$Vp?t26y!Gb5@VHG5#C(d@z&W&&vF6+M> zUXCof0uE+gSFG351)(Vka#HRH)x&{Ij}{AU;BPiOA)t)X1><gGiEL9ov363W73*ED z2=0!4;Q3dgM_DAVpz_2>bFRn6Bfol)?cR?nrN^s$-olEe%YvDsCH>%o_kL`{9>0S9 zkMy0c`1=3IZ}X=*yW+2t@Pjicj!#2r!_>a$Op=4C9j?@m!_WN*6aXjav!j*9Yvo?t zy=2U~yHc#{mU%J#Wr@KpS%VC(7HR}?5Zmj`(jd}5c%s3>xa+H|SUHA(n1fAby-xz% z?_<4Owsw)6v5*$^kLMgP*P3|5zg@f`;&aD1rs%&nFOtFB#;1Fp2ftsfx>L7mYeF41 zZpQD!+do{eQTn|P+Ya=(jbeylU98Wr40P~{k91#&wPrnyZxV3bR|jBR!jX80T3LV% z!@y^G&-v0Bl;>s=yPT(Xkmu%KfuVDW-Las`?9se%B>LDLnL8TGc>IA~DG+r{VHJ`k z#pyTx&>a-$E&t7%Gx0+{>Vi6O)oe+<@tc{-l2Ebr?{MQOm%oBVN`rs0?zG=@dH)hT z+dL<!{p*E4cr{4QXY&jD^VL|E!|4FU`pt{@{#%*Zh)QaIu%`Q<tZ0v(p3juw&PP_a zHu-hA8l8s#VwSgd-4n26e~_YtLs-+Z_&+^CoU^5?m2HdS4@%X7xhabXYSo||Fc+vB zW;Kx&f?|*=>~~JuT}q{0)^tjn*Nv>+l)J$u`d9duzT+Y(TUkZjfKOW^DLwGUk|GY% z2V$f3EOp+Tv*kZ~4R=#L%j`0%F^?>5%SzmSA31Rcyr7poO^}KYFxM*I48&HJRSa0l z4(&6^jm7%dc-Dqzl-D+sDqY;2V(^C@{pJLR!vOw@UK6kAPu7Wt?XMh%_I@<^SC5TY z0l^H`@l5^T8(sP5Fy+n9a2n!dbWcWa+O#r?{vMA|txV5rQsp>>l68!luTNm!Kn&Wk zug4wJ>g6I5vFmdD6b0q>zT*wL$_L8aAlPnoQ|1(X^)b8r+dhQRNRgw_(%ea6s*MLh z7v;ZG2jfJh>zOaV>v~-T?dXxE<!j#4GAks^XE?ty2|e+r{2GJZw7(m$m$r$WU1*|m z$nP`t5RZ+gpn#9PUSb_>Hh1c`CLan?u#L$vE`~w7;Yz&|=K4lpX043D#HWoV%FsaP z*=MgeT^g;xz+hZ&SSWwlp<{Et@t%w0WIh7EI6`XKPd@tV!*t<@+8q-;n&u8jk}Z|C zb~)K$>rwFX;EcAIxulb`WEOeSTiz}L4`rfVv^EQ#n3&k=5<36tN}c<)SInBGe}D4Y z`r-bw29pc4`Ffp23ZAAuK_s1P@5eQC{KF!MzK(<$NtFLg(3gnrg{iNwHlaYCaV9iO z{AXw0M5rzL#<hY3L#;MXy&+!5a^fe8<=6}_=(vh~PthL86MG5zS?b53X1;J4_=%HX zxNSkPfs%NQKc^dObj!(rUr-cR^b4F(Pdy@kF=Rwhu5#C|{+YR0&8-g4(njU3C_GUi zMu-O_#`k`#O3>KxkM$<{8b*2SR#oV7V`7nQ$5%mt+r#t9Q)1nAgR!#ryr`Pvh7N0G ziT5hE?U}+1kpb7Xq%$Kq+J}}GcaS8r+^tW``c|+-BVV6_iY{(_KIc0~rVbUPUH`@v zG`Lb8t_!|Q2qagIj!$TPqVL4aVEJ6rJ-B0e^!cu7D4}K3Ct|zsz;R-O_qa%O_R)>P z2{GEdlP(gY=?VU6{qK!e71DS`3{QDl|H#8uI=eUBLEA6sU*3q_|1Bg9JW6}mvDaI8 zPu{K|$0#&SAa3LEQlS*B)6`LCfLsgJrR2N$jHe&PH`fV$rBHBKrkoT?$0EjG(^DSg zwI{XFk(oXS!&v%ss4s7f>H9RJ$^K3Lby)NYU%g?CwvpjF!UtwOHE2bgR#I6B+Dnb8 zQ^`S1p@g>+O0BO8$95k0p-w66ZRl|I>|<3@`H<Z&q7Qx(9(OQ`TM1o-ja=#kQ9=nB zu|MN~wt)|9Z&^!g-LXOoTTWSl7o88Mpglr~1M2v%@%okzt)G^WG#u2xJ2m-^bS%LJ z<0}VRP>sx9_G#sXt36`T{J9<^fa4S+1G^f9NSB#Ysm3+Fb~K<ufH-gTPK&|ZK$-D* z1gjW3p@eWNC)DhiD2o_I{=I!EgT!&CQ!TE@U_7k|P#6XGV`EJip;$*lc|nzin2E<z z6gAJiO?}<1;8?|kFNS05i4R@#ZN?-*j*P7mc|m&tv%?fWH6&!(NO4)3zbo7SG&qRc z$Q4P!)io2dDV#y%11qvsaZq%9liAm&w5YNyb#!pl=TDAkTZ`wvi7s-LP9`!BiWP+n zQ<{C$PELK%j*youp|{mThWOg4r776(NvK&-$G%htiZHVWwXBx~&a=oa9W*BoB%zN1 zSYk?x77g@;-af=eSKr5Oa4-h3lPuLSQAXbRarBztiawmy=D;nM9c7cPP|7US6XU9B zuxU?KN@q|_Nyx64Lb09fs)j52YW+;GF%}FqgdZzBpO$q3&Td9{cW>|R(*pz(_0r>i zF2~lBc#*H@Lwf#PYiUpV?=M0fh3D3LY@7<i7gPBfTN0T4JwLgW5~5bBwu6Tv_j@{G zyOy%`biO7+)W*d$>1R|m6Et*&9UZH-tFzqd3%KZc$jbWpA-JVc#pF(7yLdf%sI1qu z_qBaRfzN%)*kXWPQ;T8lJ<GfNdt#7Tl$}^4PC2*dZsptDO*i%^4w1{pTktAW`hgw7 z{8>j49u*}8t+^DHB6U#b6*(DA^R(O-X{twf?Yo-YQ3)YURsWH59PkUqRxDzlIw0cC zE*UQ-)6<ZZ?pXpnF(8>EJWpUJxyxC=Q7boXHh#bPudb*`YF@QP^^=Udj`CprHn~EB ztdgl_5!c}1d6o_5@X=}4Aykl+*2H6X|6|X>hZQFkQ}ZSm{o*J`{{bHKwtWu!^cYVV z<D;js@5e8`D2BZXYGn6~lr*qU9(Q)1IJ_gbE>rgW+NSmBcVm@HNF1z^&u4i+&^>B~ z?Xzv7d{bM2x0QlWm?AFhh@~7`Mhf)^VvV6ISGmQfAdB{qwNL#~gL;Q8zSA^ak4uto z|G761z7QN%mN0{3K?9ecc2)SjoGL*kwm>?-$4_k?ZF16Pr`ai$$`>G^*!ufm+3`Ax zL)vybNFwj@)OY+|&2efCf-}L5?IstZY+}aacz3p59YZJ^4ZV5Dzh@~w4t!I&>WLy< zpS^<<vBm16>+99JNYL5Yy;tABvx12i%wJnSPLOR9WFumI?|WQG40kx@2~({Mpok78 z-q}81V@#F(*Ew5QaaHYc6LG3mh~G3MNKTpuvK=~?H?vw*PqllbNZ9D%)UthrC@BO8 zb<Mb&ekLjg>c=qHHQ)SZQ9HP+6Fi6<uCU$9m;)ZXBlo$=?sF;*!CExGv>Z>PVtpmZ zG@YIkHk5&c_;b9uE>H!YSw%&`V=Y2A6gml?Jvqt<)S)(wAX_r;Qg_uz)7<;6Giw~4 zIh$m)Wm%=;sz5Sk`wx(s;do#_*f4B*fYitMEiqsF)6O9mC=e$$&4{U|c#i-fZ*4t+ zeY!%Vm7eBRAVGjPQe&{(P2FGNt!Un6L$%Rn90|2;Y7^;>Z!y=jG*x-Iaq+gG?Z!8O zbN@b*<hy&lN9=9r)9e1)U=UQS3U&;#cthACr_`qJT-n(yAvoK$$)KzJ;|=@tHWzhF z#9K6t+_Cq-<9wvwo+y=-?n9uCzVVBV8P&#-W&SaK|C~X6X0rB)9}_*<-%7-s3-U4A zVQA=lrj(xO%mdn#aSheyJYtQt{vv{w!Z@oLA^CB>_qtg8lil5-38d1dQ(Q;#z^7R1 zIW!zKGBRmjgg6{;@lcl;brf@M6kV@*%sk;9rA(30(C@>*hBI&Qe;ygDFgW(pmf#4( zaDZyRbFZ^IOstGP65D=K&0WfU?U!qya>}>}Q}BX<fTab0`4&*v*`QgaBGe4w6T0bC zlBgg2aq@(gz8fh;L;DwV>1@vDaD%H%c>fZg+rv2V`Pe|6sl()nz`;jb%@eClPU!ud z3#hsV-6BCGth(BeiiA0BOPJPzB9Go`A%t)5MM%%}EA*1(!pF5nJ~v3^|2kTVrTX;; z$W=RkFtl@u-DT<hY#C}hawSuS^;zQm-pkV$cIlY-<pyn>zV?>^r>^Lh&G2TDmT<ok zURvFY6pNRoPo^vf5;occLxMaivo!Wy&7$kz*|N(si(%zfntOEZeh#?ypgT9I0}Z@e zJ9EM0T#Fq?POp<nBjmIpj~*mf1}DY>Y|I^W`W=8_AR$xYte0SXeW}*-O^KT$-^~|9 z=QNhFMtgvr>2RPx8oJ#)WftM&xr(|ez775Y{$t1FdA94+;h<@?QOg6-s&I*EGM(H! z^aEpb%AR|-D1vWBjk!+1Mlv@Xm%BcsXgUuj-0=UeW6B(oV$1Qj;|5C#ksaN95JbvX zpF0-I)nsMn2MZte#)>G#bslzXRdF?4>@PRrYYdvazm)|$qVOlk_;%eOX3WK{W*ll% zTS6FS>j>{k%#G&3(=o=dmK`&GFatrIy6}rG&awF=RO%T17<;V5<0!z>urU{mOeF1Z zTwuT_jq(B%L1st=|9$h_rIFdbxWvE{jW;o}Cw_T>caGmH7$+QAE!a!DLz_56qO6Y} zAvkqY;u*<$rIFp>a;256*AB>xO#a{_alQR!+ll)vWuteW4+NV$P|{jo7a_mUw~nvl z>or<h!zNlNX#E*s&W)Oyx`Xf~WSrdO5nS0D3_hvy27!7KM9e$WS>^u~bSgBR=L$v< z*pFDK3x%O9A@_p)Xr5lOdpVbIH8N@I0a@SBg2xMT?`qKfdlCvI6vsIs>4W7&z;457 zfLZ_1!iANUbJXgGhY)b(bq&f7vXvM8igh&W?&pX?ITqdk(aM2fl}ogry&s>yrn~m+ zZrdF`K>-0>nl?}4UV(l`zqgM+yRCO`OmXh+(&hT4bwve2JKe=kCjyeIfvd#!mG{De z#!#7_SNRTgiucR6b<ig1cmf-$H<BYCUis@+1?CH!e9m=uCH31pZmNhmPJO$&N<*o6 zyDZtIvA0M8(M;PnB<6on;<XiBcrNS_F4fgY^?)BmLC$?SnX@98qGzX%t9Hzb33q{( zGpKTgv0gDjlnvX^e&u7NkYMh83R{x(0F#+4+Di@%?*1rPD&Mi;Dq6!htfj-eb{wpb zIQ5eHf>pwuW98(9g+dli%9zyB!_oVLXwC6uuOOqH;!+0XH73*4h97|Iu>5^WT{~Vu z!3WxhlpG1Lj|wq4^pNmD?S1i5?85%H!KKezN?@N+e-VLXJk#brde~B$N7ik61TYO6 z@5@LR+g-7vFmQ;NN6y1X%)y@(X(aTz+I(7`ywy@qd9J;ik+E~^qJM+=dQwDdmU1Yp zvQnQDLVTY5(B`w^OR0tC6mqp)ODo9Nx7G#Q<S()J()wS)N~rd`);(pPUvd_wf9IMn zPscI2%V@YHxpUCl?ONeYGdTMquub>nt${bVJb8Hbbov2OI&iLi0_Nv)@xPCWe%IeR z7>*3Of9uvQQ`)lhtiQCSQZN6HV!fo3^HW08tj_HbtN<Psh86*Svqly9?#}#I>rTM= z%VxNZBL`T*_nM0fxBj~e^Z6$a*Wb<lsU2?f{l@>SR<w8wHVwA<mNra#(2+3+vK-)Y z9#@)iQJjGRFPx?-scaokGrD{K-M*E`^h5cRpYzkXsp6mi<90%A@VVVTS|H$^<+)Tf zn0aWdPyXn4(DP3vjxKS_r|MqW>bm-`5tIeKM}kMTLDYk1oQ=S>0>uY0mqXScygZMl zDa&6>&eHvV0~Cip_W0&PdG+n86@mwkPe+X?-M`pzQNr6*{mN>h)*k9kp{N+AJOiBP z{{S&RcYb1IfArbI|51B-BdPIibjgqs-@jiQ3%%qdKaE`6E{f(1`Aw4+D*4%%o%hVD z&r=|Ogy1S5lV8s)J*|9fHaB%Ou>a#(E&i*%uagO^OJ}iK$+L83sqed1zl-*h4{9MC z?w4R{XVua^<~Bda77i~Dq6{xi>3ss7Su$%N8YSSDezR^M?hVpe?cAB|GQlAguZQeY zXEJWqolF<MeRpQd5vx<7S1YL+UOxkyUmZ>0g$cO)ew*sgVV<)n)&A7#XEUHX7tkcH zquSBKbe5rW^Vk3UszKSW3wreCk>;6IuoRIwmUh0kke0zK%V$->GSokI`VA0yo1QXv zm$dMk@&7*5IT}yyDA!Fi%<IAgdMob3Vf2~BzOBlFQ98l_Pi4Y5^_A$^&aAKfO4IpO zrx94DgSO#K%WjAkIeS2!s5>8YE#X%+LYx~V3|=>;8=qYwTzRXTZ^Z>Q>D?THbD_J( zan`7RoUdnodwxRZYdWs4hv6)ge}ou@d{6S0OPT%o#~**9|LZOQvq;=`4t=`+bb};! zh<1fTl_JR8Y!2|i3w~x1GPijAdAB)$bT%;lQ;h7H_O}UKzZouraqwgEU**!3fZjQi z(;}Lthi@bamir0o`*r(eeQ}eipZ)&>SB$4zZR#x2lp%yF1wKlhN!6d)hTI0)Q)PNM z4_8_3>c{)aXN-92gD+kxR5-}K1!kn{)7kz9l3Zx?ZHDdTK<R`wRs$wGgWHa0;=KNw z>BmC{iWACj)qvyyw!mED+wM!2#PgK@2gI7K?P<s7$CAf$foUF{5v(zpnM#G4KP1l< zgwbgaolUfE^7(NeFi&pT!?6B=NQIp*GXp|rcZ$6s{?LI5yiaEWmV{$wT5Bv{HMp?c zyxC0%rh?rAR?c*&>$hv)g-NF-RdHlbb!NLhJ*C2Os*P1=wDHG}XJwX+_N2vIXR~+t zGLb}*f4DlzIT3Wu+58=5amq3)1c$D2=;hB0d~Lja=A!(r^&?H06=LJm);U0G4^4G? z9M)~p9(y$|Ju#7=E9l^r3_0r3*)vOp3=HV<kGs4cDD+qxZMSdKS^QiVYvi<qiICgb z?&9igZGF6PBK#jjpZ6|IghV7hs<6jkrr1K^@|04oJBw5ItHZP-acW!;!;@v}6IE@) zw9EfVJ!Ka4Jf)?jx)JF16xV5VWBDwg5jfbFL^J$mw9Lz@9}qil6A9#lKp?udO{dvQ zM&OQy|3Vml465=>XusdmSv30SC>|3H$P>ZG#tx61n9Si%aE7c*!2?oq6^@O=e8fvX z`WuoZ9RPZP?5wOFoRgDdW4vu`ZJv~U*Lts2=rjUsyfxFfO4HomoP45vN78P}ZNfn_ zwgKCi2FPr1*@5HISdXnY0F7xWq9AmtC@9rb#=t3M(u_)t<ac$Vk44K$izP57(Vq`) zmfJL39G3euk_8w&_rG}Hync=i!(QBgKp^xD4dZUAOH<HFjpedp@&riDt_*_Xe4D!* zC>1@iMIfa(ru!-xKz-5f*wo0v4?2sM1j|H#J5qf{O!}LtjHC9E-*}1XKpP7k9i81k znw+izI>ONvp6re7Sy{AnSVcIdb58ht@ULOhc{XbQnofM!Lvnv_ZLNT*MCOTetY~U$ zjRp(R0ZGz2HB=O1+!$#&umUQPvQJIcZpQXBZl>2d9*v`2_oY*%_*~)ZF3n9mzx}V* zDLz_a?>wqk%?xduzx}@#v^$pr_t6eJ2aA#NPmI_u?15_@J~!C2aI5u42TI1<jG&F# zj^MpmV@X2oOo^V3!-Sn#rq1`N)X?NwO430^vh23auEPo*KDu+1^09wnDrrKY3MHoQ zGy#^B`Gi)lM|TkhFIDKQ1nt6wcT);k;HTUZMnTx+QSzvrd7h=xcrn_ZuLYt%A%EEb zH3ixqOO3Q#g<PB3(n$p<B|{8$U$cg+bHBw^G3MV{!N~Fb--D7icA?{YkqQgMD>8@= zIsuK5*M6ix@Bl)w4$jh{_aP;KB)OZsqct<z=+gVcpX^$N(;tB)tR@-{0b)Z*CfWf6 z&yA*jvAr>vmZbyE*~)-FRR)AG)%`E8>AQJV8nd~SUW?l-E==obJF-iuwVTBISerM` zxQ*wR?TTXjV+Rr(SNn_6Tb448n~Fi0wDv<KcR<xZp7buZ0c}U{X&h)u5dfLHxGqo& z$-HoyK^^<qxoM4%#|P(EGG6jg?gU+X!1%ufs1ox1cA6YtY-c-rU*;+0laD@H?z`=l zN%~Jh`kRtn%u)wRs>o<O79@l4O`Qd#s%^-aLw%1;91TXmq^ezmJtyd}`_6ced!wlX zs!sV+(nYo((rox9>$ju!Zm3*c8ASh}i(b0kj6;c?dk|lGX`(MSwX+c@{jD^#v_%I8 zk)}-I?XmJ`Z~OFQS%bXlfv1^N^zmk%HYGo=Y8_FYyuX+CiZg^(qZRH*IpiKoZ}?xq zS1XZOeEajLQp+7o-A5f~l-~qd1U%t?y46Tx`r=O299h$!S5aQ*h!5CxT6MkCIM8fw zmf4W0;gC1FCzClkVY0DA#XwxAMvt2QpPjyE63H)`)XmMc;#Sv;l9|tP<L-q|HZ#rN zz29^Ctof1Y-#5P8ley>jl6CyIp54s@#)<CnGrxVe{kvCEHrMz4-L&gB!}D)#yma#m zD0>KRczbVO-Mzm4$Bq~U;7i4XWd3JYt>1@R=S%IjEtLn7XP11P{e9WjWg9d1-u`>- zX6>HaXRM5uzIz?pxAez<cE!Z1iANK1QfznJFxYw{V}_grZxC}*GV_ls3=BfSCDqPP RAF?q3fv2mV%Q~loCIB(Hxa0r;
new file mode 100644 index 0000000000000000000000000000000000000000..dd05f51b2fbfed7523fdeb8bf27f919f64eca0ec GIT binary patch literal 98895 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
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/bin/dev-server.js @@ -0,0 +1,25 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const path = require("path"); +const toolbox = require("devtools-launchpad/index"); +const serve = require("express-static"); +const config = require("../config"); + +let webpackConfig = require("../webpack.config"); + +let { app } = toolbox.startDevServer(config, webpackConfig, __dirname); + +// Serve devtools-reps images +app.use( + "/devtools-reps/images/", + serve(path.join(__dirname, "../src/shared/images")) +); + +// As well as devtools-components ones, with a different path, which we are going to +// write in the postCSS config in development mode. +app.use( + "/devtools-components/images/", + serve(path.join(__dirname, "../../../node_modules/devtools-components/src/images")) +);
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/config.js @@ -0,0 +1,16 @@ +module.exports = { + "title": "Reps", + "hotReloading": true, + "defaultURL": "https://nchevobbe.github.io/demo/console-test-app.html", + "environment": "development", + "theme": "light", + "firefox": { + "webSocketConnection": false, + "host": "localhost", + "webSocketPort": 9000, + "tcpPort": 6080, + }, + "development": { + "serverPort": 8000 + } +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/jest.config.js @@ -0,0 +1,26 @@ +const { resolve } = require("path"); +const rootDir = resolve(__dirname, "src"); +module.exports = { + rootDir, + displayName: "devtools-reps test", + setupFiles: [ + "<rootDir>/../../../src/test/__mocks__/request-animation-frame.js", + "<rootDir>/test/__mocks__/selection.js", + "<rootDir>/test/setup.js" + ], + setupTestFrameworkScriptFile: "<rootDir>/test/setup-file.js", + testMatch: ["**/tests/**/*.js"], + testPathIgnorePatterns: [ + "/node_modules/", + "<rootDir>/test/", + "<rootDir>/reps/tests/test-helpers", + "<rootDir>/utils/tests/fixtures/", + "<rootDir>/object-inspector/tests/__mocks__/", + "<rootDir>/object-inspector/tests/test-utils" + ], + testURL: "http://localhost/", + transformIgnorePatterns: ["node_modules/(?!devtools-)"], + moduleNameMapper: { + "\\.css$": "<rootDir>/../../../src/test/__mocks__/styleMock.js" + } +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/package.json @@ -0,0 +1,56 @@ +{ + "name": "devtools-reps", + "version": "0.23.0", + "description": "Devtools Reps", + "main": "src/index.js", + "scripts": { + "start": "node bin/dev-server.js", + "lint-js": "eslint src", + "firefox": "./node_modules/.bin/start-firefox --start --location https://devtools-html.github.io/debugger-examples/", + "chrome": "./node_modules/.bin/start-chrome", + "license-check": "devtools-license-check", + "test": "jest --projects jest.config.js" + }, + "author": "", + "license": "MPL-2.0", + "repository": { + "url": "git://github.com/devtools-html/reps.git", + "type": "git" + }, + "engineStrict": true, + "engines": { + "node": ">=8.9.4" + }, + "dependencies": { + "classnames": "^2.2.5", + "devtools-components": "^0.6.0", + "lodash": "^4.17.2", + "prop-types": "^15.6.0", + "react": "^16.4.1", + "react-dom": "^16.4.1", + "react-dom-factories": "^1.0.2", + "react-redux": "^5.0.7", + "redux": "^3.7.2" + }, + "devDependencies": { + "@sucrase/webpack-object-rest-spread-plugin": "^1.0.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "babel-preset-react": "^6.24.1", + "devtools-config": "^0.0.16", + "devtools-launchpad": "^0.0.141", + "devtools-license-check": "^0.7.0", + "devtools-modules": "~1.1.0", + "devtools-services": "^0.0.1", + "enzyme": "^3.3.0", + "enzyme-adapter-react-16": "^1.1.1", + "enzyme-to-json": "^3.3.1", + "eslint": "^5.0.0", + "eslint-plugin-mozilla": "1.0.4", + "fs-extra": "^7.0.0", + "immutable": "^3.8.2", + "postcss-url-mapper": "^1.2.0", + "react-immutable-proptypes": "^2.1.0", + "redux-logger": "=3.0.6" + } +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/postcss.config.js @@ -0,0 +1,35 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const mapUrl = require("postcss-url-mapper"); +const MC_PATH = "resource://devtools/client/shared/components/reps/images/"; +const EXPRESS_PATH = "/devtools-reps/images/"; +const IMAGES = ["open-inspector.svg", "jump-definition.svg", "input.svg"]; + + +function mapUrlProduction(url, type) { + for (const img of IMAGES) { + url = url.replace(`/images/${img}`, `${MC_PATH}${img}`); + } + return url; +} + +function mapUrlDevelopment(url) { + for (const img of IMAGES) { + url = url.replace(`/images/${img}`, `${EXPRESS_PATH}${img}`); + } + return url; +} + +module.exports = ({ file, options, env }) => { + if (env === "production") { + return { + plugins: [mapUrl(mapUrlProduction)] + }; + } + + return { + plugins: [mapUrl(mapUrlDevelopment)] + }; +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/index.js @@ -0,0 +1,25 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const { MODE } = require("./reps/constants"); +const { REPS, getRep } = require("./reps/rep"); +const objectInspector = require("./object-inspector"); + +const { + parseURLEncodedText, + parseURLParams, + maybeEscapePropertyName, + getGripPreviewItems +} = require("./reps/rep-utils"); + +module.exports = { + REPS, + getRep, + MODE, + maybeEscapePropertyName, + parseURLEncodedText, + parseURLParams, + getGripPreviewItems, + objectInspector +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/actions/expressions.js @@ -0,0 +1,76 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const constants = require("../constants"); +const { generateKey } = require("../utils/utils"); + +function evaluateInput(input) { + return async function({ dispatch, client }) { + try { + const packet = await client.clientCommands.evaluate(input); + dispatch(addExpression(input, packet)); + } catch (err) { + console.warn("Error when evaluating expression", err); + } + }; +} + +function addExpression(input, packet) { + return { + key: generateKey(), + type: constants.ADD_EXPRESSION, + value: { + input, + packet + } + }; +} + +function clearExpressions() { + return { + type: constants.CLEAR_EXPRESSIONS + }; +} + +function showResultPacket(key) { + return { + key, + type: constants.SHOW_RESULT_PACKET + }; +} + +function hideResultPacket(key) { + return { + key, + type: constants.HIDE_RESULT_PACKET + }; +} + +function createObjectClient(grip) { + return function({ dispatch, client }) { + return client.getObjectClient(grip); + }; +} + +function createLongStringClient(grip) { + return function({ dispatch, client }) { + return client.getLongStringClient(grip); + }; +} + +function releaseActor(actor) { + return function({ dispatch, client }) { + client.releaseActor(actor); + }; +} +module.exports = { + addExpression, + clearExpressions, + evaluateInput, + showResultPacket, + hideResultPacket, + createObjectClient, + createLongStringClient, + releaseActor +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/actions/index.js @@ -0,0 +1,11 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const expressions = require("./expressions"); +const input = require("./input"); + +module.exports = { + ...expressions, + ...input +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/actions/input.js @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const constants = require("../constants"); +const expressionsActions = require("./expressions"); +const { generateKey } = require("../utils/utils"); + +function addInput(input) { + return ({ dispatch }) => { + dispatch(expressionsActions.evaluateInput(input)); + + dispatch({ + key: generateKey(), + type: constants.ADD_INPUT, + value: input + }); + }; +} + +function changeCurrentInput(input) { + return { + type: constants.CHANGE_CURRENT_INPUT, + value: input + }; +} + +function navigateInputHistory(dir) { + return { + type: constants.NAVIGATE_INPUT_HISTORY, + value: dir + }; +} + +module.exports = { + addInput, + changeCurrentInput, + navigateInputHistory +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/components/Console.css @@ -0,0 +1,89 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +main { + --default-border: 1px solid var(--theme-splitter-color); + height: 100vh; + display: flex; + flex-direction: column; +} + +.expressions { + padding: 2em 1em; + flex: 1; + overflow-y: auto; +} + +.rep-row { + border: var(--default-border); + margin-bottom: 1em; +} + +.rep-input { + font-family: monospace; + background-color: var(--theme-toolbar-background-alt); + color: var(--theme-body-color); + padding: 0.5rem; +} + +.rep-input:before { + content: "➜ "; +} + +.reps { + display: flex; + flex-wrap: wrap; + padding: 1rem; + margin-bottom: 0.5rem; +} + +.rep-element { + white-space: pre-wrap; + word-wrap: break-word; +} + +.rep-element + .rep-element { + margin-left: 0.5rem; +} + +.rep-element[data-mode]::before { + content: attr(data-mode)":"; + background-color: var(--theme-toolbar-background); + font-family: monospace; + display: inline-block; + font-size: 0.75rem; + padding: 0.1rem 0.25rem; + margin-right: 0.25rem; + border-radius: 0.25rem; +} + +.packet header { + display: flex; + background-color: var(--theme-toolbar-background-alt); + border-top: var(--default-border); + color: var(--theme-body-color); + padding: 0.5rem; +} + +.packet header::before { + display: inline-block; + padding-right: 0.5rem; +} + +.packet header.packet-expanded::before { + content: "−"; +} + +.packet header.packet-collapsed::before { + content: "+"; +} + +.copy-packet-button { + margin-left: auto; + margin-right: 0.5rem; +} + +.packet .packet-rep { + padding: 1rem; +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/components/Console.js @@ -0,0 +1,90 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const React = require("react"); +const { Component, createFactory } = React; +const PropTypes = require("prop-types"); +const dom = require("react-dom-factories"); +const { KeyShortcuts } = require("devtools-modules"); +const shortcuts = new KeyShortcuts({ window }); + +const { connect } = require("react-redux"); +const { bindActionCreators } = require("redux"); +const selectors = require("../selectors"); + +const Header = createFactory(require("./Header")); +const ResultsList = createFactory(require("./ResultsList")); + +require("./Console.css"); + +class Console extends Component { + static get propTypes() { + return { + addInput: PropTypes.func.isRequired, + changeCurrentInput: PropTypes.func.isRequired, + clearExpressions: PropTypes.func.isRequired, + currentInputValue: PropTypes.string.isRequired, + evaluateInput: PropTypes.func.isRequired, + expressions: PropTypes.object.isRequired, + hideResultPacket: PropTypes.func.isRequired, + navigateInputHistory: PropTypes.func.isRequired, + showResultPacket: PropTypes.func.isRequired + }; + } + + componentDidMount() { + shortcuts.on("CmdOrCtrl+Shift+L", this.props.clearExpressions); + } + + componentWillUnmount() { + shortcuts.off("CmdOrCtrl+Shift+L"); + } + + render() { + const { + addInput, + changeCurrentInput, + clearExpressions, + currentInputValue, + evaluateInput, + expressions, + hideResultPacket, + navigateInputHistory, + showResultPacket + } = this.props; + + return dom.main( + {}, + Header({ + addInput, + changeCurrentInput, + clearResultsList: clearExpressions, + currentInputValue, + evaluate: evaluateInput, + navigateInputHistory + }), + ResultsList({ + expressions: expressions.reverse(), + hideResultPacket, + showResultPacket + }) + ); + } +} + +function mapStateToProps(state) { + return { + expressions: selectors.getExpressions(state), + currentInputValue: selectors.getCurrentInputValue(state) + }; +} + +function mapDispatchToProps(dispatch) { + return bindActionCreators(require("../actions"), dispatch); +} + +module.exports = connect( + mapStateToProps, + mapDispatchToProps +)(Console);
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/components/Header.css @@ -0,0 +1,46 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +.console-header { + background: var(--theme-highlight-pink); + color: white; + margin: 0; +} + +.console-header form { + display: flex; + padding: 1rem; +} + +.console-header h1 { + font-size: 14px; + font-weight: 100; + color: white; +} + +.console-header input { + background-color: var(--theme-highlight-pink); + flex: 1; + border: 1px solid white; + color: white; + font-size: 1.25rem; + padding: 0.25rem; + line-height: 2rem; + padding-left: 1rem; + margin: 0 1rem; +} + +.console-header ::-webkit-input-placeholder { + color: white; + font-size: 1rem; + line-height: 2rem; + margin: 0; +} + +.console-header .clear-button { + background: rgba(255, 255, 255, 0.25); + border: 1px solid rgba(255, 255, 255, 0.25); + color: white; + font-size: 1.2rem; +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/components/Header.js @@ -0,0 +1,87 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const React = require("react"); +const { Component, createFactory } = React; +const PropTypes = require("prop-types"); +const dom = require("react-dom-factories"); +const constants = require("../constants"); +const QuickLinks = createFactory(require("./QuickLinks")); +require("./Header.css"); + +class Header extends Component { + static get propTypes() { + return { + addInput: PropTypes.func.isRequired, + changeCurrentInput: PropTypes.func.isRequired, + clearResultsList: PropTypes.func.isRequired, + currentInputValue: PropTypes.string, + evaluate: PropTypes.func.isRequired, + navigateInputHistory: PropTypes.func.isRequired + }; + } + + constructor(props) { + super(props); + this.onSubmitForm = this.onSubmitForm.bind(this); + this.onInputChange = this.onInputChange.bind(this); + this.onInputKeyDown = this.onInputKeyDown.bind(this); + this.onClearButtonClick = this.onClearButtonClick.bind(this); + } + + onSubmitForm(e) { + e.preventDefault(); + const data = new FormData(e.target); + const expression = data.get("expression"); + this.props.addInput(expression); + } + + onInputChange(e) { + this.props.changeCurrentInput(e.target.value); + } + + onInputKeyDown(e) { + if (["ArrowUp", "ArrowDown"].includes(e.key)) { + this.props.navigateInputHistory( + e.key === "ArrowUp" ? constants.DIR_BACKWARD : constants.DIR_FORWARD + ); + } + } + + onClearButtonClick(e) { + this.props.clearResultsList(); + } + + render() { + const { currentInputValue, evaluate } = this.props; + + return dom.header( + { className: "console-header" }, + dom.form( + { onSubmit: this.onSubmitForm }, + dom.h1({}, "Reps"), + dom.input({ + type: "text", + placeholder: "Enter an expression", + name: "expression", + value: currentInputValue || "", + autoFocus: true, + onChange: this.onInputChange, + onKeyDown: this.onInputKeyDown + }), + dom.button( + { + className: "clear-button", + type: "button", + onClick: this.onClearButtonClick + }, + "Clear" + ) + ), + QuickLinks({ evaluate }) + ); + } +} + +module.exports = Header;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/components/QuickLinks.css @@ -0,0 +1,20 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +.quick-links { + display: flex; + justify-content: center; + flex-wrap: wrap; + background: rgba(255, 255, 255, 0.25); + padding: 0.5rem 1rem; +} + +.quick-links button { + font-size: 1.2rem; + background: none; + border: none; + color: white; + margin: 0.5rem 0.25rem; + cursor: pointer; +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/components/QuickLinks.js @@ -0,0 +1,54 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const React = require("react"); +const { Component } = React; +const PropTypes = require("prop-types"); +const dom = require("react-dom-factories"); +require("./QuickLinks.css"); +const samples = require("../samples.js"); + +class QuickLinks extends Component { + static get propTypes() { + return { + evaluate: PropTypes.func.isRequired + }; + } + + constructor(props) { + super(props); + this.evaluateExpressions = this.evaluateExpressions.bind(this); + this.renderLinks = this.renderLinks.bind(this); + } + + evaluateExpressions(expressions) { + expressions.forEach(expression => this.props.evaluate(expression)); + } + + renderLinks() { + return Object.keys(samples).map(label => { + const expressions = samples[label]; + const length = expressions.length; + return dom.button( + { + key: label, + title: + label === "yolo" + ? "Add all sample expressions" + : `Add ${length} ${label} sample expression${ + length > 1 ? "s" : "" + }`, + onClick: () => this.evaluateExpressions(expressions) + }, + label + ); + }); + } + + render() { + return dom.div({ className: "quick-links" }, this.renderLinks()); + } +} + +module.exports = QuickLinks;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/components/Result.js @@ -0,0 +1,145 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const React = require("react"); +const { Component } = React; +const PropTypes = require("prop-types"); +const dom = require("react-dom-factories"); +const { MODE } = require("../../reps/constants"); +const { ObjectInspector } = require("../../index").objectInspector; +const { Rep } = require("../../reps/rep"); + +class Result extends Component { + static get propTypes() { + return { + expression: PropTypes.object.isRequired, + showResultPacket: PropTypes.func.isRequired, + hideResultPacket: PropTypes.func.isRequired + }; + } + + constructor(props) { + super(props); + this.copyPacketToClipboard = this.copyPacketToClipboard.bind(this); + this.onHeaderClick = this.onHeaderClick.bind(this); + this.renderRepInAllModes = this.renderRepInAllModes.bind(this); + this.renderRep = this.renderRep.bind(this); + this.renderPacket = this.renderPacket.bind(this); + } + + copyPacketToClipboard(e, packet) { + e.stopPropagation(); + + const textField = document.createElement("textarea"); + textField.innerHTML = JSON.stringify(packet, null, " "); + document.body.appendChild(textField); + textField.select(); + document.execCommand("copy"); + textField.remove(); + } + + onHeaderClick() { + const { expression } = this.props; + if (expression.showPacket === true) { + this.props.hideResultPacket(); + } else { + this.props.showResultPacket(); + } + } + + renderRepInAllModes({ object }) { + return Object.keys(MODE).map(modeKey => + this.renderRep({ object, modeKey }) + ); + } + + renderRep({ object, modeKey }) { + const path = Symbol(modeKey + object.actor); + + return dom.div( + { + className: "rep-element", + key: path.toString(), + "data-mode": modeKey + }, + ObjectInspector({ + roots: [ + { + path, + contents: { + value: object + } + } + ], + autoExpandDepth: 0, + mode: MODE[modeKey], + // The following properties are optional function props called by the + // objectInspector on some occasions. Here we pass dull functions that + // only logs the parameters with which the callback was called. + onCmdCtrlClick: (node, { depth, event, focused, expanded }) => + console.log("CmdCtrlClick", { + node, + depth, + event, + focused, + expanded + }), + onInspectIconClick: nodeFront => + console.log("inspectIcon click", { nodeFront }), + onViewSourceInDebugger: location => + console.log("onViewSourceInDebugger", { location }), + recordTelemetryEvent: (eventName, extra = {}) => { + console.log("📊", eventName, "📊", extra); + } + }) + ); + } + + renderPacket(expression) { + const { packet, showPacket } = expression; + const headerClassName = showPacket ? "packet-expanded" : "packet-collapsed"; + const headerLabel = showPacket + ? "Hide expression packet" + : "Show expression packet"; + + return dom.div( + { className: "packet" }, + dom.header( + { + className: headerClassName, + onClick: this.onHeaderClick + }, + headerLabel, + showPacket && + dom.button( + { + className: "copy-packet-button", + onClick: e => this.copyPacketToClipboard(e, packet) + }, + "Copy as JSON" + ) + ), + showPacket && + dom.div({ className: "packet-rep" }, Rep({ object: packet })) + ); + } + + render() { + const { expression } = this.props; + const { input, packet } = expression; + return dom.div( + { className: "rep-row" }, + dom.div({ className: "rep-input" }, input), + dom.div( + { className: "reps" }, + this.renderRepInAllModes({ + object: packet.exception || packet.result + }) + ), + this.renderPacket(expression) + ); + } +} + +module.exports = Result;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/components/ResultsList.js @@ -0,0 +1,42 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const React = require("react"); +const { Component, createFactory } = React; +const PropTypes = require("prop-types"); +const dom = require("react-dom-factories"); +const ImPropTypes = require("react-immutable-proptypes"); + +const Result = createFactory(require("./Result")); + +class ResultsList extends Component { + static get propTypes() { + return { + expressions: ImPropTypes.map.isRequired, + showResultPacket: PropTypes.func.isRequired, + hideResultPacket: PropTypes.func.isRequired + }; + } + + render() { + const { expressions, showResultPacket, hideResultPacket } = this.props; + + return dom.div( + { className: "expressions" }, + expressions + .entrySeq() + .toJS() + .map(([key, expression]) => + Result({ + key, + expression: expression.toJS(), + showResultPacket: () => showResultPacket(key), + hideResultPacket: () => hideResultPacket(key) + }) + ) + ); + } +} + +module.exports = ResultsList;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/constants.js @@ -0,0 +1,19 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +module.exports = { + ADD_EXPRESSION: Symbol("ADD_EXPRESSION"), + LOAD_PROPERTIES: Symbol("LOAD_PROPERTIES"), + LOAD_ENTRIES: Symbol("LOAD_ENTRIES"), + EVALUATE_EXPRESSION: Symbol("EVALUATE_EXPRESSION"), + CLEAR_EXPRESSIONS: Symbol("CLEAR_EXPRESSIONS"), + SHOW_RESULT_PACKET: Symbol("SHOW_RESULT_PACKET"), + HIDE_RESULT_PACKET: Symbol("HIDE_RESULT_PACKET"), + ADD_INPUT: Symbol("ADD_INPUT"), + CHANGE_CURRENT_INPUT: Symbol("CHANGE_CURRENT_INPUT"), + NAVIGATE_INPUT_HISTORY: Symbol("NAVIGATE_INPUT_HISTORY"), + DIR_FORWARD: Symbol("DIR_FORWARD "), + DIR_BACKWARD: Symbol("DIR_BACKWARD"), + LS_EXPRESSIONS_KEY: "LS_EXPRESSIONS_KEY" +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/index.js @@ -0,0 +1,62 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +// globals window, document + +require("../reps/reps.css"); + +const React = require("react"); +const ReactDOM = require("react-dom"); + +const { bootstrap, renderRoot } = require("devtools-launchpad"); + +const RepsConsole = require("./components/Console"); +const { configureStore } = require("./store"); + +require("./launchpad.css"); + +function onConnect(connection) { + if (!connection) { + return; + } + + const client = { + clientCommands: { + evaluate: input => + new Promise(resolve => { + connection.tabConnection.tabTarget.activeConsole.evaluateJS( + input, + result => resolve(result) + ); + }) + }, + + createObjectClient: function(grip) { + return connection.tabConnection.threadClient.pauseGrip(grip); + }, + createLongStringClient: function(grip) { + return connection.tabConnection.tabTarget.activeConsole.longString(grip); + }, + releaseActor: function(actor) { + return connection.tabConnection.debuggerClient.release(actor); + } + }; + + const store = configureStore({ + makeThunkArgs: (args, state) => ({ ...args, client }), + client + }); + renderRoot(React, ReactDOM, RepsConsole, store); +} + +function onConnectionError(e) { + const h1 = document.createElement("h1"); + h1.innerText = `An error occured during the connection: «${e.message}»`; + console.warn("An error occured during the connection", e); + renderRoot(React, ReactDOM, h1); +} + +bootstrap(React, ReactDOM) + .then(onConnect, onConnectionError) + .catch(onConnectionError);
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/launchpad.css @@ -0,0 +1,13 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +* { + box-sizing: border-box; +} + +html, +body { + margin: 0; + padding: 0; +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/reducers/expressions.js @@ -0,0 +1,36 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const constants = require("../constants"); +const Immutable = require("immutable"); + +const initialState = Immutable.Map(); + +function update(state = initialState, action) { + const { type, value, key } = action; + + switch (type) { + case constants.ADD_EXPRESSION: + const newState = state.set(key, Immutable.Map(value)); + window.localStorage.setItem( + constants.LS_EXPRESSIONS_KEY, + JSON.stringify(newState.toJS()) + ); + return newState; + + case constants.CLEAR_EXPRESSIONS: + window.localStorage.removeItem(constants.LS_EXPRESSIONS_KEY); + return state.clear(); + + case constants.SHOW_RESULT_PACKET: + return state.mergeIn([key], { showPacket: true }); + + case constants.HIDE_RESULT_PACKET: + return state.mergeIn([key], { showPacket: false }); + } + + return state; +} + +module.exports = update;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/reducers/index.js @@ -0,0 +1,13 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const expressions = require("./expressions"); +const input = require("./input"); +const { objectInspector } = require("../../index"); + +module.exports = { + expressions, + input, + objectInspector: objectInspector.reducer.default +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/reducers/input.js @@ -0,0 +1,63 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const constants = require("../constants"); +const Immutable = require("immutable"); + +const initialState = Immutable.Map({ + currentValue: "", + currentNavigationKey: null, + history: Immutable.OrderedMap() +}); + +function update(state = initialState, action) { + const { type, value, key } = action; + + const currentValue = state.get("currentValue"); + const currentNavigationKey = state.get("currentNavigationKey"); + const history = state.get("history"); + + switch (type) { + case constants.ADD_INPUT: + return state.withMutations(map => { + map + .set("history", history.set(key, value)) + .set("currentValue", "") + .set("currentNavigationKey", null); + }); + + case constants.CHANGE_CURRENT_INPUT: + return state.set("currentValue", value); + + case constants.NAVIGATE_INPUT_HISTORY: + const keys = history.reverse().keySeq(); + const navigationIndex = keys.indexOf(currentNavigationKey); + const dir = value; + + const newNavigationIndex = + dir === constants.DIR_BACKWARD + ? navigationIndex + 1 + : navigationIndex - 1; + + const newNavigationKey = + newNavigationIndex >= 0 ? keys.get(newNavigationIndex) : null; + + const fallbackValue = dir === constants.DIR_BACKWARD ? currentValue : ""; + const fallbackNavigationKey = + dir === constants.DIR_BACKWARD ? currentNavigationKey : -1; + + return state.withMutations(map => { + map + .set("currentValue", history.get(newNavigationKey) || fallbackValue) + .set( + "currentNavigationKey", + newNavigationKey || fallbackNavigationKey + ); + }); + } + + return state; +} + +module.exports = update;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/samples.js @@ -0,0 +1,196 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const samples = { + array: ['x = [1, "2", {three: 3}, []]', "x = []"], + + boolean: ["true", "false"], + + date: ["new Date()"], + + function: ["x = () => { 2 }"], + + node: [ + `x = document.createElement("div"); + x.setAttribute("id", "myNodeId"); + x.setAttribute("class", "my-class and another"); + x.textContent = "My node id"; + x;`, + `x = document.createElementNS("http://www.w3.org/2000/svg", "clipPath"); + x.setAttribute("id", "myNodeId"); + x.setAttribute("class", "my-class and another"); + x;`, + "document.createComment('my comment node')", + "document.createTextNode('foo')", + `x = document.createAttribute('foo'); + x.value = "bar"; + x;` + ], + + "map & sets": [ + ` + ({ + "small set": new Set([1,2,3,4]), + "small map": new Map([ + ["a", {suba: 1}], + [{bkey: "b"}, 2]] + ), + "medium set": new Set( + Array.from({length: 20}) + .map((el, i) => ({ + [String.fromCharCode(65 + i)]: i + 1, + test: { + [i] : "item" + i + } + }) + )), + "medium map": new Map( + Array + .from({length: 20}) + .map((el, i) => [ + { + [String.fromCharCode(65 + i)]: i + 1, + test: {[i] : "item" + i, body: document.body} + }, + Symbol(i + 1) + ]) + ), + "large set": new Set( + Array.from({length: 2000}) + .map((el, i) => ({ + [String.fromCharCode(65 + i)]: i + 1, + test: { + [i] : "item" + i + } + }) + )), + "large map": new Map( + Array + .from({length: 2000}) + .map((el, i) => [ + { + [String.fromCharCode(65 + i)]: i + 1, + document + }, + Symbol(i + 1) + ]) + ), + }) + ` + ], + + number: ["1", "-1", "-3.14", "0", "-0", "Infinity", "-Infinity", "NaN"], + + object: [ + "x = {a: 2}", + ` +Object.create(null, Object.getOwnPropertyDescriptors({ + get myStringGetter() { + return "hello" + }, + get myNumberGetter() { + return 123; + }, + get myUndefinedGetter() { + return undefined; + }, + get myNullGetter() { + return null; + }, + get myObjectGetter() { + return {foo: "bar"} + }, + get myArrayGetter() { + return Array.from({length: 100000}, (_, i) => i) + }, + get myMapGetter() { + return new Map([["foo", {bar: "baz"}]]) + }, + get mySetGetter() { + return new Set([1, {bar: "baz"}]); + }, + get myProxyGetter() { + var handler = { get: function(target, name) { + return name in target ? target[name] : 37; } + }; + return new Proxy({a: 1}, handler); + }, + get myThrowingGetter() { + return a.b.c.d.e.f; + }, + get myLongStringGetter() { + return "ab ".repeat(1e5) + }, + set mySetterOnly(x) {} +})) +` + ], + + promise: [ + "Promise.resolve([1, 2, 3])", + "Promise.reject(new Error('This is wrong'))", + "new Promise(() => {})" + ], + + proxy: [ + ` + var handler = { + get: function(target, name) { + return name in target ? + target[name] : + 37; + } + }; + new Proxy({a: 1}, handler); + ` + ], + + regexp: ["new RegExp('^[-]?[0-9]+[.]?[0-9]+$')"], + + string: [ + "'foo'", + "'bar\nbaz\nyup'", + "'http://example.com'", + "'blah'.repeat(10000)", + "'http://example.com '.repeat(1000)" + ], + + symbol: ["Symbol('foo')", "Symbol()"], + + errors: [ + "throw new Error('This is a simple error message.');", + ` + var error = new Error('Complicated error message'); + error.stack = + "unserializeProfileOfArbitraryFormat@http://localhost:4242/2969802751c9e11c0c2d.bundle.js:26705:11\\n" + + "_callee7$@http://localhost:4242/2969802751c9e11c0c2d.bundle.js:27948:27\\n" + + "tryCatch@http://localhost:4242/2969802751c9e11c0c2d.bundle.js:64198:37\\n" + + "invoke@http://localhost:4242/2969802751c9e11c0c2d.bundle.js:64432:22\\n" + + "defineIteratorMethods/</prototype[method]@http://localhost:4242/2969802751c9e11c0c2d.bundle.js:64250:16\\n" + + "step@http://localhost:4242/2969802751c9e11c0c2d.bundle.js:5257:22\\n" + + "step/<@http://localhost:4242/2969802751c9e11c0c2d.bundle.js:5268:13\\n" + + "run@http://localhost:4242/2969802751c9e11c0c2d.bundle.js:64973:22\\n" + + "notify/<@http://localhost:4242/2969802751c9e11c0c2d.bundle.js:64986:28\\n" + + "flush@http://localhost:4242/2969802751c9e11c0c2d.bundle.js:65282:9\\n"; + + error; + `, + ` + var error = new Error('Complicated error message'); + error.stack = + "onPacket@resource://devtools/shared/base-loader.js -> resource://devtools/shared/client/debugger-client.js:856:9\\n" + + "send/<@resource://devtools/shared/base-loader.js -> resource://devtools/shared/transport/transport.js:569:13\\n" + + "exports.makeInfallible/<@resource://devtools/shared/base-loader.js -> resource://devtools/shared/ThreadSafeDevToolsUtils.js:109:14\\n" + + "exports.makeInfallible/<@resource://devtools/shared/base-loader.js -> resource://devtools/shared/ThreadSafeDevToolsUtils.js:109:14\\n"; + + error; + ` + ] +}; + +samples.yolo = Object.keys(samples).reduce((res, key) => { + return [...res, ...samples[key]]; +}, []); + +module.exports = samples;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/selectors/index.js @@ -0,0 +1,20 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +function getExpressions(state) { + return state.expressions; +} + +function getInputState(state) { + return state.input; +} + +function getCurrentInputValue(state) { + return getInputState(state).get("currentValue"); +} + +module.exports = { + getCurrentInputValue, + getExpressions +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/store.js @@ -0,0 +1,21 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const { applyMiddleware, combineReducers, createStore } = require("redux"); + +const { logger } = require("redux-logger"); +const { promise } = require("./utils/redux/middleware/promise"); +const { thunk } = require("./utils/redux/middleware/thunk"); +const reducers = require("./reducers"); + +function configureStore(options, client) { + return createStore( + combineReducers(reducers), + applyMiddleware(thunk(options.makeThunkArgs), promise, logger) + ); +} + +module.exports = { + configureStore +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/utils/redux/middleware/promise.js @@ -0,0 +1,57 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +const { executeSoon, filterByKey } = require("../../utils"); + +const PROMISE = (exports.PROMISE = "@@dispatch/promise"); +let seqIdVal = 1; + +function seqIdGen() { + return seqIdVal++; +} + +function promiseMiddleware({ dispatch, getState }) { + return next => action => { + if (!action || !Object.keys(action).includes(PROMISE)) { + return next(action); + } + + const promiseInst = action[PROMISE]; + const seqId = seqIdGen().toString(); + + // Create a new action that doesn't have the promise field and has + // the `seqId` field that represents the sequence id + action = Object.assign(filterByKey(action, key => key !== PROMISE), { + seqId + }); + + dispatch(Object.assign({}, action, { status: "start" })); + + // Return the promise so action creators can still compose if they want to. + return Promise.resolve(promiseInst) + .finally(() => new Promise(resolve => executeSoon(resolve))) + .then( + value => { + dispatch( + Object.assign({}, action, { + status: "done", + value: value + }) + ); + return value; + }, + error => { + dispatch( + Object.assign({}, action, { + status: "error", + error: error.message || error + }) + ); + return Promise.reject(error); + } + ); + }; +} + +exports.promise = promiseMiddleware;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/utils/redux/middleware/thunk.js @@ -0,0 +1,23 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +/** + * A middleware that allows thunks (functions) to be dispatched. If + * it's a thunk, it is called with an argument that contains + * `dispatch`, `getState`, and any additional args passed in via the + * middleware constructure. This allows the action to create multiple + * actions (most likely asynchronously). + */ +function thunk(makeArgs) { + return ({ dispatch, getState }) => { + const args = { dispatch, getState }; + + return next => action => { + return typeof action === "function" + ? action(makeArgs ? makeArgs(args, getState()) : args) + : next(action); + }; + }; +} +exports.thunk = thunk;
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/launchpad/utils/utils.js @@ -0,0 +1,60 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +/** + * Returns an object with a promise and its resolve and reject function, + * so they can be called outside of the promise callback. + * + * @returns {{resolve: function, reject: function, promise: Promise}} + */ +function defer() { + let resolve, reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + + return { + resolve, + reject, + promise + }; +} + +/** + * Takes a function and executes it on the next tick. + * + * @param function fn + */ +function executeSoon(fn) { + setTimeout(fn, 0); +} + +/** + * Takes an object into another object, + * filtered on its keys by the given predicate. + * + * @param object obj + * @param function predicate + * @returns object + */ +function filterByKey(obj, predicate) { + return Object.keys(obj).reduce((res, key) => { + if (predicate(key)) { + return Object.assign(res, { [key]: obj[key] }); + } + return res; + }, {}); +} + +function generateKey() { + return `${performance.now()}`; +} + +module.exports = { + defer, + executeSoon, + filterByKey, + generateKey +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/object-inspector/actions.js @@ -0,0 +1,133 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +// @flow + +import type { GripProperties, Node, Props, ReduxAction } from "./types"; + +const { loadItemProperties } = require("./utils/load-properties"); +const { getLoadedProperties, getActors } = require("./reducer"); + +type Dispatch = ReduxAction => void; + +type ThunkArg = { + getState: () => {}, + dispatch: Dispatch +}; + +/** + * This action is responsible for expanding a given node, which also means that + * it will call the action responsible to fetch properties. + */ +function nodeExpand(node: Node, actor) { + return async ({ dispatch, getState }: ThunkArg) => { + dispatch({ type: "NODE_EXPAND", data: { node } }); + dispatch(nodeLoadProperties(node, actor)); + }; +} + +function nodeCollapse(node: Node) { + return { + type: "NODE_COLLAPSE", + data: { node } + }; +} + +/* + * This action checks if we need to fetch properties, entries, prototype and + * symbols for a given node. If we do, it will call the appropriate ObjectClient + * functions. + */ +function nodeLoadProperties(node: Node, actor) { + return async ({ dispatch, client, getState }: ThunkArg) => { + const state = getState(); + const loadedProperties = getLoadedProperties(state); + if (loadedProperties.has(node.path)) { + return; + } + + try { + const properties = await loadItemProperties( + node, + client.createObjectClient, + client.createLongStringClient, + loadedProperties + ); + + dispatch(nodePropertiesLoaded(node, actor, properties)); + } catch (e) { + console.error(e); + } + }; +} + +function nodePropertiesLoaded( + node: Node, + actor?: string, + properties: GripProperties +) { + return { + type: "NODE_PROPERTIES_LOADED", + data: { node, actor, properties } + }; +} + +function closeObjectInspector() { + return async ({ getState, client }: ThunkArg) => { + releaseActors(getState(), client); + }; +} + +/* + * This action is dispatched when the `roots` prop, provided by a consumer of + * the ObjectInspector (inspector, console, …), is modified. It will clean the + * internal state properties (expandedPaths, loadedProperties, …) and release + * the actors consumed with the previous roots. + * It takes a props argument which reflects what is passed by the upper-level + * consumer. + */ +function rootsChanged(props: Props) { + return async ({ dispatch, client, getState }: ThunkArg) => { + releaseActors(getState(), client); + dispatch({ + type: "ROOTS_CHANGED", + data: props + }); + }; +} + +function releaseActors(state, client) { + const actors = getActors(state); + for (const actor of actors) { + client.releaseActor(actor); + } +} + +function invokeGetter(node: Node, grip: object, getterName: string) { + return async ({ dispatch, client, getState }: ThunkArg) => { + try { + const objectClient = client.createObjectClient(grip); + const result = await objectClient.getPropertyValue(getterName); + dispatch({ + type: "GETTER_INVOKED", + data: { + node, + result + } + }); + } catch (e) { + console.error(e); + } + }; +} + +module.exports = { + closeObjectInspector, + invokeGetter, + nodeExpand, + nodeCollapse, + nodeLoadProperties, + nodePropertiesLoaded, + rootsChanged +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/object-inspector/components/ObjectInspector.css @@ -0,0 +1,53 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +.tree.object-inspector .node.object-node { + display: inline-block; +} + +.tree.object-inspector .object-label, +.tree.object-inspector .object-label * { + color: var(--theme-highlight-blue); +} + +.tree.object-inspector .node .unavailable { + color: var(--theme-comment); +} + +.tree.object-inspector .lessen, +.tree.object-inspector .lessen *, +.tree.object-inspector .lessen .object-label, +.tree.object-inspector .lessen .object-label * { + color: var(--theme-comment); +} + +.tree.object-inspector .block .object-label, +.tree.object-inspector .block .object-label * { + color: var(--theme-body-color); +} + +.tree.object-inspector .block .object-label:before { + content: "☲ "; + font-size: 1.1em; +} + +.object-inspector .object-delimiter { + color: var(--theme-comment); +} + +.object-inspector .tree-node .arrow { + display: inline-block; + vertical-align: middle; +} + +/* Focused styles */ +.tree.object-inspector .tree-node.focused * { + color: inherit; +} + +.tree-node.focused button.jump-definition, +.tree-node.focused button.open-inspector, +.tree-node.focused button.invoke-getter { + background-color: currentColor; +}
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/object-inspector/components/ObjectInspector.js @@ -0,0 +1,289 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +// @flow + +const { Component, createFactory, createElement } = require("react"); +const { connect } = require("react-redux"); +const actions = require("../actions"); + +const selectors = require("../reducer"); + +import Components from "devtools-components"; +const Tree = createFactory(Components.Tree); +require("./ObjectInspector.css"); + +const ObjectInspectorItem = createFactory(require("./ObjectInspectorItem")); + +const classnames = require("classnames"); + +const Utils = require("../utils"); +const { renderRep, shouldRenderRootsInReps } = Utils; +const { + getChildrenWithEvaluations, + getActor, + getParent, + nodeIsPrimitive, + nodeHasGetter, + nodeHasSetter +} = Utils.node; + +import type { CachedNodes, Props } from "../types"; + +type DefaultProps = { + autoExpandAll: boolean, + autoExpandDepth: number +}; + +// This implements a component that renders an interactive inspector +// for looking at JavaScript objects. It expects descriptions of +// objects from the protocol, and will dynamically fetch children +// properties as objects are expanded. +// +// If you want to inspect a single object, pass the name and the +// protocol descriptor of it: +// +// ObjectInspector({ +// name: "foo", +// desc: { writable: true, ..., { value: { actor: "1", ... }}}, +// ... +// }) +// +// If you want multiple top-level objects (like scopes), you can pass +// an array of manually constructed nodes as `roots`: +// +// ObjectInspector({ +// roots: [{ name: ... }, ...], +// ... +// }); + +// There are 3 types of nodes: a simple node with a children array, an +// object that has properties that should be children when they are +// fetched, and a primitive value that should be displayed with no +// children. + +class ObjectInspector extends Component<Props> { + static defaultProps: DefaultProps; + constructor(props: Props) { + super(); + this.cachedNodes = new Map(); + + const self: any = this; + + self.getItemChildren = this.getItemChildren.bind(this); + self.isNodeExpandable = this.isNodeExpandable.bind(this); + self.setExpanded = this.setExpanded.bind(this); + self.focusItem = this.focusItem.bind(this); + self.getRoots = this.getRoots.bind(this); + self.getNodeKey = this.getNodeKey.bind(this); + } + + componentWillMount() { + this.roots = this.props.roots; + this.focusedItem = this.props.focusedItem; + } + + componentWillUpdate(nextProps) { + this.removeOutdatedNodesFromCache(nextProps); + + if (this.roots !== nextProps.roots) { + // Since the roots changed, we assume the properties did as well, + // so we need to cleanup the component internal state. + this.roots = nextProps.roots; + this.focusedItem = nextProps.focusedItem; + if (this.props.rootsChanged) { + this.props.rootsChanged(); + } + return; + } + } + + removeOutdatedNodesFromCache(nextProps) { + // When the roots changes, we can wipe out everything. + if (this.roots !== nextProps.roots) { + this.cachedNodes.clear(); + return; + } + + // If there are new evaluations, we want to remove the existing cached + // nodes from the cache. + if (nextProps.evaluations > this.props.evaluations) { + for (const key of nextProps.evaluations.keys()) { + if (!this.props.evaluations.has(key)) { + this.cachedNodes.delete(key); + } + } + } + } + + shouldComponentUpdate(nextProps: Props) { + const { expandedPaths, loadedProperties, evaluations } = this.props; + + // We should update if: + // - there are new loaded properties + // - OR there are new evaluations + // - OR the expanded paths number changed, and all of them have properties + // loaded + // - OR the expanded paths number did not changed, but old and new sets + // differ + // - OR the focused node changed. + return ( + loadedProperties.size !== nextProps.loadedProperties.size || + evaluations.size !== nextProps.evaluations.size || + (expandedPaths.size !== nextProps.expandedPaths.size && + [...nextProps.expandedPaths].every(path => + nextProps.loadedProperties.has(path) + )) || + (expandedPaths.size === nextProps.expandedPaths.size && + [...nextProps.expandedPaths].some(key => !expandedPaths.has(key))) || + this.focusedItem !== nextProps.focusedItem || + this.roots !== nextProps.roots + ); + } + + componentWillUnmount() { + this.props.closeObjectInspector(); + } + + props: Props; + cachedNodes: CachedNodes; + + getItemChildren(item: Node): Array<Node> | NodeContents | null { + const { loadedProperties, evaluations } = this.props; + const { cachedNodes } = this; + + return getChildrenWithEvaluations({ + evaluations, + loadedProperties, + cachedNodes, + item + }); + } + + getRoots(): Array<Node> { + return this.props.roots; + } + + getNodeKey(item: Node): string { + return item.path && typeof item.path.toString === "function" + ? item.path.toString() + : JSON.stringify(item); + } + + isNodeExpandable(item: Node): boolean { + if (nodeIsPrimitive(item)) { + return false; + } + + if (nodeHasSetter(item) || nodeHasGetter(item)) { + return false; + } + + return true; + } + + setExpanded(item: Node, expand: boolean) { + if (!this.isNodeExpandable(item)) { + return; + } + + const { + nodeExpand, + nodeCollapse, + recordTelemetryEvent, + roots + } = this.props; + + if (expand === true) { + const actor = getActor(item, roots); + nodeExpand(item, actor); + if (recordTelemetryEvent) { + recordTelemetryEvent("object_expanded"); + } + } else { + nodeCollapse(item); + } + } + + focusItem(item: Node) { + const { focusable = true, onFocus } = this.props; + + if (focusable && this.focusedItem !== item) { + this.focusedItem = item; + this.forceUpdate(); + + if (onFocus) { + onFocus(item); + } + } + } + + render() { + const { + autoExpandAll = true, + autoExpandDepth = 1, + focusable = true, + disableWrap = false, + expandedPaths, + inline + } = this.props; + + return Tree({ + className: classnames({ + inline, + nowrap: disableWrap, + "object-inspector": true + }), + + autoExpandAll, + autoExpandDepth, + + isExpanded: item => expandedPaths && expandedPaths.has(item.path), + isExpandable: this.isNodeExpandable, + focused: this.focusedItem, + + getRoots: this.getRoots, + getParent, + getChildren: this.getItemChildren, + getKey: this.getNodeKey, + + onExpand: item => this.setExpanded(item, true), + onCollapse: item => this.setExpanded(item, false), + onFocus: focusable ? this.focusItem : null, + + renderItem: (item, depth, focused, arrow, expanded) => + ObjectInspectorItem({ + ...this.props, + item, + depth, + focused, + arrow, + expanded, + setExpanded: this.setExpanded + }) + }); + } +} + +function mapStateToProps(state, props) { + return { + expandedPaths: selectors.getExpandedPaths(state), + loadedProperties: selectors.getLoadedProperties(state), + evaluations: selectors.getEvaluations(state) + }; +} + +const OI = connect( + mapStateToProps, + actions +)(ObjectInspector); + +module.exports = (props: Props) => { + const { roots } = props; + if (shouldRenderRootsInReps(roots)) { + return renderRep(roots[0], props); + } + + return createElement(OI, props); +};
new file mode 100644 --- /dev/null +++ b/devtools/client/debugger/new/packages/devtools-reps/src/object-inspector/components/ObjectInspectorItem.js @@ -0,0 +1,308 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +// @flow + +const { Component } = require("react"); +const dom = require("react-dom-factories"); + +import Services from "devtools-services"; +const { appinfo } = Services; +const isMacOS = appinfo.OS === "Darwin"; + +const classnames = require("classnames"); +const { MODE } = require("../../reps/constants"); + +const Utils = require("../utils"); + +const { + getValue, + nodeHasAccessors, + nodeHasProperties, + nodeIsBlock, + nodeIsDefaultProperties, + nodeIsFunction, + nodeIsGetter, + nodeIsMapEntry, + nodeIsMissingArguments, + nodeIsOptimizedOut, + nodeIsPrimitive, + nodeIsPrototype, + nodeIsSetter, + nodeIsUninitializedBinding, + nodeIsUnmappedBinding, + nodeIsUnscopedBinding, + nodeIsWindow, + nodeIsLongString, + nodeHasFullText, + nodeHasGetter, + getNonPrototypeParentGripValue +} = Utils.node; + +type Props = { + item: Node, + depth: number, + expanded: boolean, + focused: boolean, + arrow: ReactElement, + setExpanded: (item: Node, expanded: boolean) => void, + mode: Mode, + dimTopLevelWindow: boolean, + invokeGetter: () => void, + onDoubleClick: ?( + item: Node, + options: { + depth: number, + focused: boolean, + expanded: boolean + } + ) => any, + onCmdCtrlClick: ?( + item: Node, + options: { + depth: number, + event: SyntheticEvent, + focused: boolean, + expanded: boolean + } + ) => any, + onLabelClick: ?( + item: Node, + options: { + depth: number, + focused: boolean, + expanded: boolean, + setExpanded: (Node, boolean) => any + } + ) => any +}; + +class ObjectInspectorItem extends Component<Props> { + // eslint-disable-next-line complexity + getLabelAndValue(): { + value?: string | Element, + label?: string + } { + const { item, depth, expanded, mode } = this.props; + + const label = item.name; + const isPrimitive = nodeIsPrimitive(item); + + if (nodeIsOptimizedOut(item)) { + return { + label, + value: dom.span({ className: "unavailable" }, "(optimized away)") + }; + } + + if (nodeIsUninitializedBinding(item)) { + return { + label, + value: dom.span({ className: "unavailable" }, "(uninitialized)") + }; + } + + if (nodeIsUnmappedBinding(item)) { + return {