@whittlelabs/sifter 0.28.1 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +25 -5
  2. package/bin.js +2016 -26
  3. package/bin.js.map +4 -4
  4. package/package.json +1 -1
package/bin.js CHANGED
@@ -11604,6 +11604,120 @@ var require_version_check = __commonJS({
11604
11604
  }
11605
11605
  });
11606
11606
 
11607
+ // ../../packages/shuttle/dist/branding/environment.js
11608
+ var require_environment = __commonJS({
11609
+ "../../packages/shuttle/dist/branding/environment.js"(exports2) {
11610
+ "use strict";
11611
+ Object.defineProperty(exports2, "__esModule", { value: true });
11612
+ exports2.resolveEnvironment = resolveEnvironment;
11613
+ exports2.applyEnvironment = applyEnvironment;
11614
+ exports2.isWorthReporting = isWorthReporting;
11615
+ exports2.renderEnvironmentReport = renderEnvironmentReport;
11616
+ exports2.renderVerificationLine = renderVerificationLine;
11617
+ exports2.environmentReportJson = environmentReportJson;
11618
+ exports2.verificationJson = verificationJson;
11619
+ exports2.hostOf = hostOf;
11620
+ function resolveEnvironment(brand, profile, overrides = {}) {
11621
+ const table = brand.environments ?? {};
11622
+ const known = Object.keys(table).sort();
11623
+ const matched = Object.prototype.hasOwnProperty.call(table, profile) ? profile : null;
11624
+ const entry = matched === null ? void 0 : table[matched];
11625
+ return {
11626
+ profile,
11627
+ environment: matched,
11628
+ known,
11629
+ keep: pick(overrides.keepUrl, entry?.keepApiUrl, brand.keepRegistration.keepApiUrl),
11630
+ jobs: pick(overrides.jobsUrl, entry?.jobsApiUrl, brand.keepRegistration.jobsApiUrl)
11631
+ };
11632
+ }
11633
+ function pick(flag, fromEnvironment, brandDefault) {
11634
+ if (flag)
11635
+ return { url: flag, source: "flag" };
11636
+ if (fromEnvironment)
11637
+ return { url: fromEnvironment, source: "environment" };
11638
+ return { url: brandDefault, source: "brand-default" };
11639
+ }
11640
+ function applyEnvironment(brand, resolved) {
11641
+ const reg = brand.keepRegistration;
11642
+ if (resolved.keep.url === reg.keepApiUrl && resolved.jobs.url === reg.jobsApiUrl) {
11643
+ return brand;
11644
+ }
11645
+ return {
11646
+ ...brand,
11647
+ keepRegistration: {
11648
+ ...reg,
11649
+ keepApiUrl: resolved.keep.url,
11650
+ jobsApiUrl: resolved.jobs.url
11651
+ }
11652
+ };
11653
+ }
11654
+ function isWorthReporting(resolved) {
11655
+ return resolved.environment !== null || resolved.keep.source === "flag" || resolved.jobs.source === "flag";
11656
+ }
11657
+ function renderEnvironmentReport(resolved) {
11658
+ return [
11659
+ "",
11660
+ "Pairing environment",
11661
+ field("Profile", resolved.profile),
11662
+ field("Environment", describeEnvironment(resolved)),
11663
+ field("Keep", `${resolved.keep.url} ${describeSource(resolved, resolved.keep)}`),
11664
+ field("Jobs", `${resolved.jobs.url} ${describeSource(resolved, resolved.jobs)}`),
11665
+ ""
11666
+ ];
11667
+ }
11668
+ function renderVerificationLine(verificationUri) {
11669
+ return field("Verify at", `${hostOf(verificationUri)} as Keep reported it`);
11670
+ }
11671
+ function environmentReportJson(resolved) {
11672
+ return JSON.stringify({
11673
+ kind: "pairing-environment",
11674
+ profile: resolved.profile,
11675
+ environment: resolved.environment,
11676
+ known: resolved.known,
11677
+ keep: resolved.keep,
11678
+ jobs: resolved.jobs
11679
+ });
11680
+ }
11681
+ function verificationJson(verificationUri) {
11682
+ return JSON.stringify({
11683
+ kind: "pairing-verification",
11684
+ verificationUri,
11685
+ host: hostOf(verificationUri),
11686
+ source: "keep"
11687
+ });
11688
+ }
11689
+ function field(label, value) {
11690
+ return ` ${`${label}:`.padEnd(13)}${value}`;
11691
+ }
11692
+ function describeEnvironment(resolved) {
11693
+ if (resolved.environment !== null) {
11694
+ return `${resolved.environment} (named by this build)`;
11695
+ }
11696
+ if (resolved.known.length === 0) {
11697
+ return "none (this build declares no environments)";
11698
+ }
11699
+ return `none (this build knows ${resolved.known.join(", ")})`;
11700
+ }
11701
+ function describeSource(resolved, url) {
11702
+ switch (url.source) {
11703
+ case "flag":
11704
+ return "from the flag you passed";
11705
+ case "environment":
11706
+ return `from the "${resolved.environment ?? ""}" environment`;
11707
+ default:
11708
+ return "from the brand default";
11709
+ }
11710
+ }
11711
+ function hostOf(url) {
11712
+ try {
11713
+ return new URL(url).host;
11714
+ } catch {
11715
+ return url;
11716
+ }
11717
+ }
11718
+ }
11719
+ });
11720
+
11607
11721
  // ../../packages/shuttle/dist/preflight/checks.js
11608
11722
  var require_checks = __commonJS({
11609
11723
  "../../packages/shuttle/dist/preflight/checks.js"(exports2) {
@@ -11619,6 +11733,7 @@ var require_checks = __commonJS({
11619
11733
  var loom_1 = require_dist();
11620
11734
  var version_check_1 = require_version_check();
11621
11735
  var apply_1 = require_apply();
11736
+ var environment_1 = require_environment();
11622
11737
  var NODE_FLOOR = "20.0.0";
11623
11738
  var DISK_FLOOR_BYTES = 1024 * 1024 * 1024;
11624
11739
  var WORKSPACE_EXECUTOR = "claude-code";
@@ -11745,7 +11860,7 @@ var require_checks = __commonJS({
11745
11860
  if (strays.length > 0) {
11746
11861
  return fail("pairing-environment", `the config claims from ${strays.join(", ")}, which this pairing is not rostered into`, `run \`${subject.brand.product.cliBinary} init\` to rewrite the config from this pairing`);
11747
11862
  }
11748
- return pass("pairing-environment", `config and pairing both use ${pairing.jobsApiUrl}`);
11863
+ return pass("pairing-environment", `paired with Keep at ${(0, environment_1.hostOf)(pairing.keepApiUrl)}, claiming from Jobs at ${(0, environment_1.hostOf)(pairing.jobsApiUrl)}`);
11749
11864
  });
11750
11865
  }
11751
11866
  };
@@ -20572,15 +20687,1769 @@ var require_doctor = __commonJS({
20572
20687
  }
20573
20688
  });
20574
20689
 
20690
+ // ../../node_modules/.pnpm/qrcode-generator@2.0.4/node_modules/qrcode-generator/dist/qrcode.js
20691
+ var require_qrcode = __commonJS({
20692
+ "../../node_modules/.pnpm/qrcode-generator@2.0.4/node_modules/qrcode-generator/dist/qrcode.js"(exports2, module2) {
20693
+ var qrcode = (function() {
20694
+ var qrcode2 = function(typeNumber, errorCorrectionLevel) {
20695
+ var PAD0 = 236;
20696
+ var PAD1 = 17;
20697
+ var _typeNumber = typeNumber;
20698
+ var _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel];
20699
+ var _modules = null;
20700
+ var _moduleCount = 0;
20701
+ var _dataCache = null;
20702
+ var _dataList = [];
20703
+ var _this = {};
20704
+ var makeImpl = function(test, maskPattern) {
20705
+ _moduleCount = _typeNumber * 4 + 17;
20706
+ _modules = (function(moduleCount) {
20707
+ var modules = new Array(moduleCount);
20708
+ for (var row = 0; row < moduleCount; row += 1) {
20709
+ modules[row] = new Array(moduleCount);
20710
+ for (var col = 0; col < moduleCount; col += 1) {
20711
+ modules[row][col] = null;
20712
+ }
20713
+ }
20714
+ return modules;
20715
+ })(_moduleCount);
20716
+ setupPositionProbePattern(0, 0);
20717
+ setupPositionProbePattern(_moduleCount - 7, 0);
20718
+ setupPositionProbePattern(0, _moduleCount - 7);
20719
+ setupPositionAdjustPattern();
20720
+ setupTimingPattern();
20721
+ setupTypeInfo(test, maskPattern);
20722
+ if (_typeNumber >= 7) {
20723
+ setupTypeNumber(test);
20724
+ }
20725
+ if (_dataCache == null) {
20726
+ _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList);
20727
+ }
20728
+ mapData(_dataCache, maskPattern);
20729
+ };
20730
+ var setupPositionProbePattern = function(row, col) {
20731
+ for (var r = -1; r <= 7; r += 1) {
20732
+ if (row + r <= -1 || _moduleCount <= row + r) continue;
20733
+ for (var c = -1; c <= 7; c += 1) {
20734
+ if (col + c <= -1 || _moduleCount <= col + c) continue;
20735
+ if (0 <= r && r <= 6 && (c == 0 || c == 6) || 0 <= c && c <= 6 && (r == 0 || r == 6) || 2 <= r && r <= 4 && 2 <= c && c <= 4) {
20736
+ _modules[row + r][col + c] = true;
20737
+ } else {
20738
+ _modules[row + r][col + c] = false;
20739
+ }
20740
+ }
20741
+ }
20742
+ };
20743
+ var getBestMaskPattern = function() {
20744
+ var minLostPoint = 0;
20745
+ var pattern = 0;
20746
+ for (var i = 0; i < 8; i += 1) {
20747
+ makeImpl(true, i);
20748
+ var lostPoint = QRUtil.getLostPoint(_this);
20749
+ if (i == 0 || minLostPoint > lostPoint) {
20750
+ minLostPoint = lostPoint;
20751
+ pattern = i;
20752
+ }
20753
+ }
20754
+ return pattern;
20755
+ };
20756
+ var setupTimingPattern = function() {
20757
+ for (var r = 8; r < _moduleCount - 8; r += 1) {
20758
+ if (_modules[r][6] != null) {
20759
+ continue;
20760
+ }
20761
+ _modules[r][6] = r % 2 == 0;
20762
+ }
20763
+ for (var c = 8; c < _moduleCount - 8; c += 1) {
20764
+ if (_modules[6][c] != null) {
20765
+ continue;
20766
+ }
20767
+ _modules[6][c] = c % 2 == 0;
20768
+ }
20769
+ };
20770
+ var setupPositionAdjustPattern = function() {
20771
+ var pos = QRUtil.getPatternPosition(_typeNumber);
20772
+ for (var i = 0; i < pos.length; i += 1) {
20773
+ for (var j = 0; j < pos.length; j += 1) {
20774
+ var row = pos[i];
20775
+ var col = pos[j];
20776
+ if (_modules[row][col] != null) {
20777
+ continue;
20778
+ }
20779
+ for (var r = -2; r <= 2; r += 1) {
20780
+ for (var c = -2; c <= 2; c += 1) {
20781
+ if (r == -2 || r == 2 || c == -2 || c == 2 || r == 0 && c == 0) {
20782
+ _modules[row + r][col + c] = true;
20783
+ } else {
20784
+ _modules[row + r][col + c] = false;
20785
+ }
20786
+ }
20787
+ }
20788
+ }
20789
+ }
20790
+ };
20791
+ var setupTypeNumber = function(test) {
20792
+ var bits = QRUtil.getBCHTypeNumber(_typeNumber);
20793
+ for (var i = 0; i < 18; i += 1) {
20794
+ var mod = !test && (bits >> i & 1) == 1;
20795
+ _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;
20796
+ }
20797
+ for (var i = 0; i < 18; i += 1) {
20798
+ var mod = !test && (bits >> i & 1) == 1;
20799
+ _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
20800
+ }
20801
+ };
20802
+ var setupTypeInfo = function(test, maskPattern) {
20803
+ var data = _errorCorrectionLevel << 3 | maskPattern;
20804
+ var bits = QRUtil.getBCHTypeInfo(data);
20805
+ for (var i = 0; i < 15; i += 1) {
20806
+ var mod = !test && (bits >> i & 1) == 1;
20807
+ if (i < 6) {
20808
+ _modules[i][8] = mod;
20809
+ } else if (i < 8) {
20810
+ _modules[i + 1][8] = mod;
20811
+ } else {
20812
+ _modules[_moduleCount - 15 + i][8] = mod;
20813
+ }
20814
+ }
20815
+ for (var i = 0; i < 15; i += 1) {
20816
+ var mod = !test && (bits >> i & 1) == 1;
20817
+ if (i < 8) {
20818
+ _modules[8][_moduleCount - i - 1] = mod;
20819
+ } else if (i < 9) {
20820
+ _modules[8][15 - i - 1 + 1] = mod;
20821
+ } else {
20822
+ _modules[8][15 - i - 1] = mod;
20823
+ }
20824
+ }
20825
+ _modules[_moduleCount - 8][8] = !test;
20826
+ };
20827
+ var mapData = function(data, maskPattern) {
20828
+ var inc = -1;
20829
+ var row = _moduleCount - 1;
20830
+ var bitIndex = 7;
20831
+ var byteIndex = 0;
20832
+ var maskFunc = QRUtil.getMaskFunction(maskPattern);
20833
+ for (var col = _moduleCount - 1; col > 0; col -= 2) {
20834
+ if (col == 6) col -= 1;
20835
+ while (true) {
20836
+ for (var c = 0; c < 2; c += 1) {
20837
+ if (_modules[row][col - c] == null) {
20838
+ var dark = false;
20839
+ if (byteIndex < data.length) {
20840
+ dark = (data[byteIndex] >>> bitIndex & 1) == 1;
20841
+ }
20842
+ var mask = maskFunc(row, col - c);
20843
+ if (mask) {
20844
+ dark = !dark;
20845
+ }
20846
+ _modules[row][col - c] = dark;
20847
+ bitIndex -= 1;
20848
+ if (bitIndex == -1) {
20849
+ byteIndex += 1;
20850
+ bitIndex = 7;
20851
+ }
20852
+ }
20853
+ }
20854
+ row += inc;
20855
+ if (row < 0 || _moduleCount <= row) {
20856
+ row -= inc;
20857
+ inc = -inc;
20858
+ break;
20859
+ }
20860
+ }
20861
+ }
20862
+ };
20863
+ var createBytes = function(buffer, rsBlocks) {
20864
+ var offset = 0;
20865
+ var maxDcCount = 0;
20866
+ var maxEcCount = 0;
20867
+ var dcdata = new Array(rsBlocks.length);
20868
+ var ecdata = new Array(rsBlocks.length);
20869
+ for (var r = 0; r < rsBlocks.length; r += 1) {
20870
+ var dcCount = rsBlocks[r].dataCount;
20871
+ var ecCount = rsBlocks[r].totalCount - dcCount;
20872
+ maxDcCount = Math.max(maxDcCount, dcCount);
20873
+ maxEcCount = Math.max(maxEcCount, ecCount);
20874
+ dcdata[r] = new Array(dcCount);
20875
+ for (var i = 0; i < dcdata[r].length; i += 1) {
20876
+ dcdata[r][i] = 255 & buffer.getBuffer()[i + offset];
20877
+ }
20878
+ offset += dcCount;
20879
+ var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
20880
+ var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);
20881
+ var modPoly = rawPoly.mod(rsPoly);
20882
+ ecdata[r] = new Array(rsPoly.getLength() - 1);
20883
+ for (var i = 0; i < ecdata[r].length; i += 1) {
20884
+ var modIndex = i + modPoly.getLength() - ecdata[r].length;
20885
+ ecdata[r][i] = modIndex >= 0 ? modPoly.getAt(modIndex) : 0;
20886
+ }
20887
+ }
20888
+ var totalCodeCount = 0;
20889
+ for (var i = 0; i < rsBlocks.length; i += 1) {
20890
+ totalCodeCount += rsBlocks[i].totalCount;
20891
+ }
20892
+ var data = new Array(totalCodeCount);
20893
+ var index = 0;
20894
+ for (var i = 0; i < maxDcCount; i += 1) {
20895
+ for (var r = 0; r < rsBlocks.length; r += 1) {
20896
+ if (i < dcdata[r].length) {
20897
+ data[index] = dcdata[r][i];
20898
+ index += 1;
20899
+ }
20900
+ }
20901
+ }
20902
+ for (var i = 0; i < maxEcCount; i += 1) {
20903
+ for (var r = 0; r < rsBlocks.length; r += 1) {
20904
+ if (i < ecdata[r].length) {
20905
+ data[index] = ecdata[r][i];
20906
+ index += 1;
20907
+ }
20908
+ }
20909
+ }
20910
+ return data;
20911
+ };
20912
+ var createData = function(typeNumber2, errorCorrectionLevel2, dataList) {
20913
+ var rsBlocks = QRRSBlock.getRSBlocks(typeNumber2, errorCorrectionLevel2);
20914
+ var buffer = qrBitBuffer();
20915
+ for (var i = 0; i < dataList.length; i += 1) {
20916
+ var data = dataList[i];
20917
+ buffer.put(data.getMode(), 4);
20918
+ buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber2));
20919
+ data.write(buffer);
20920
+ }
20921
+ var totalDataCount = 0;
20922
+ for (var i = 0; i < rsBlocks.length; i += 1) {
20923
+ totalDataCount += rsBlocks[i].dataCount;
20924
+ }
20925
+ if (buffer.getLengthInBits() > totalDataCount * 8) {
20926
+ throw "code length overflow. (" + buffer.getLengthInBits() + ">" + totalDataCount * 8 + ")";
20927
+ }
20928
+ if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
20929
+ buffer.put(0, 4);
20930
+ }
20931
+ while (buffer.getLengthInBits() % 8 != 0) {
20932
+ buffer.putBit(false);
20933
+ }
20934
+ while (true) {
20935
+ if (buffer.getLengthInBits() >= totalDataCount * 8) {
20936
+ break;
20937
+ }
20938
+ buffer.put(PAD0, 8);
20939
+ if (buffer.getLengthInBits() >= totalDataCount * 8) {
20940
+ break;
20941
+ }
20942
+ buffer.put(PAD1, 8);
20943
+ }
20944
+ return createBytes(buffer, rsBlocks);
20945
+ };
20946
+ _this.addData = function(data, mode) {
20947
+ mode = mode || "Byte";
20948
+ var newData = null;
20949
+ switch (mode) {
20950
+ case "Numeric":
20951
+ newData = qrNumber(data);
20952
+ break;
20953
+ case "Alphanumeric":
20954
+ newData = qrAlphaNum(data);
20955
+ break;
20956
+ case "Byte":
20957
+ newData = qr8BitByte(data);
20958
+ break;
20959
+ case "Kanji":
20960
+ newData = qrKanji(data);
20961
+ break;
20962
+ default:
20963
+ throw "mode:" + mode;
20964
+ }
20965
+ _dataList.push(newData);
20966
+ _dataCache = null;
20967
+ };
20968
+ _this.isDark = function(row, col) {
20969
+ if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {
20970
+ throw row + "," + col;
20971
+ }
20972
+ return _modules[row][col];
20973
+ };
20974
+ _this.getModuleCount = function() {
20975
+ return _moduleCount;
20976
+ };
20977
+ _this.make = function() {
20978
+ if (_typeNumber < 1) {
20979
+ var typeNumber2 = 1;
20980
+ for (; typeNumber2 < 40; typeNumber2++) {
20981
+ var rsBlocks = QRRSBlock.getRSBlocks(typeNumber2, _errorCorrectionLevel);
20982
+ var buffer = qrBitBuffer();
20983
+ for (var i = 0; i < _dataList.length; i++) {
20984
+ var data = _dataList[i];
20985
+ buffer.put(data.getMode(), 4);
20986
+ buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber2));
20987
+ data.write(buffer);
20988
+ }
20989
+ var totalDataCount = 0;
20990
+ for (var i = 0; i < rsBlocks.length; i++) {
20991
+ totalDataCount += rsBlocks[i].dataCount;
20992
+ }
20993
+ if (buffer.getLengthInBits() <= totalDataCount * 8) {
20994
+ break;
20995
+ }
20996
+ }
20997
+ _typeNumber = typeNumber2;
20998
+ }
20999
+ makeImpl(false, getBestMaskPattern());
21000
+ };
21001
+ _this.createTableTag = function(cellSize, margin) {
21002
+ cellSize = cellSize || 2;
21003
+ margin = typeof margin == "undefined" ? cellSize * 4 : margin;
21004
+ var qrHtml = "";
21005
+ qrHtml += '<table style="';
21006
+ qrHtml += " border-width: 0px; border-style: none;";
21007
+ qrHtml += " border-collapse: collapse;";
21008
+ qrHtml += " padding: 0px; margin: " + margin + "px;";
21009
+ qrHtml += '">';
21010
+ qrHtml += "<tbody>";
21011
+ for (var r = 0; r < _this.getModuleCount(); r += 1) {
21012
+ qrHtml += "<tr>";
21013
+ for (var c = 0; c < _this.getModuleCount(); c += 1) {
21014
+ qrHtml += '<td style="';
21015
+ qrHtml += " border-width: 0px; border-style: none;";
21016
+ qrHtml += " border-collapse: collapse;";
21017
+ qrHtml += " padding: 0px; margin: 0px;";
21018
+ qrHtml += " width: " + cellSize + "px;";
21019
+ qrHtml += " height: " + cellSize + "px;";
21020
+ qrHtml += " background-color: ";
21021
+ qrHtml += _this.isDark(r, c) ? "#000000" : "#ffffff";
21022
+ qrHtml += ";";
21023
+ qrHtml += '"/>';
21024
+ }
21025
+ qrHtml += "</tr>";
21026
+ }
21027
+ qrHtml += "</tbody>";
21028
+ qrHtml += "</table>";
21029
+ return qrHtml;
21030
+ };
21031
+ _this.createSvgTag = function(cellSize, margin, alt, title) {
21032
+ var opts = {};
21033
+ if (typeof arguments[0] == "object") {
21034
+ opts = arguments[0];
21035
+ cellSize = opts.cellSize;
21036
+ margin = opts.margin;
21037
+ alt = opts.alt;
21038
+ title = opts.title;
21039
+ }
21040
+ cellSize = cellSize || 2;
21041
+ margin = typeof margin == "undefined" ? cellSize * 4 : margin;
21042
+ alt = typeof alt === "string" ? { text: alt } : alt || {};
21043
+ alt.text = alt.text || null;
21044
+ alt.id = alt.text ? alt.id || "qrcode-description" : null;
21045
+ title = typeof title === "string" ? { text: title } : title || {};
21046
+ title.text = title.text || null;
21047
+ title.id = title.text ? title.id || "qrcode-title" : null;
21048
+ var size = _this.getModuleCount() * cellSize + margin * 2;
21049
+ var c, mc, r, mr, qrSvg = "", rect;
21050
+ rect = "l" + cellSize + ",0 0," + cellSize + " -" + cellSize + ",0 0,-" + cellSize + "z ";
21051
+ qrSvg += '<svg version="1.1" xmlns="http://www.w3.org/2000/svg"';
21052
+ qrSvg += !opts.scalable ? ' width="' + size + 'px" height="' + size + 'px"' : "";
21053
+ qrSvg += ' viewBox="0 0 ' + size + " " + size + '" ';
21054
+ qrSvg += ' preserveAspectRatio="xMinYMin meet"';
21055
+ qrSvg += title.text || alt.text ? ' role="img" aria-labelledby="' + escapeXml([title.id, alt.id].join(" ").trim()) + '"' : "";
21056
+ qrSvg += ">";
21057
+ qrSvg += title.text ? '<title id="' + escapeXml(title.id) + '">' + escapeXml(title.text) + "</title>" : "";
21058
+ qrSvg += alt.text ? '<description id="' + escapeXml(alt.id) + '">' + escapeXml(alt.text) + "</description>" : "";
21059
+ qrSvg += '<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>';
21060
+ qrSvg += '<path d="';
21061
+ for (r = 0; r < _this.getModuleCount(); r += 1) {
21062
+ mr = r * cellSize + margin;
21063
+ for (c = 0; c < _this.getModuleCount(); c += 1) {
21064
+ if (_this.isDark(r, c)) {
21065
+ mc = c * cellSize + margin;
21066
+ qrSvg += "M" + mc + "," + mr + rect;
21067
+ }
21068
+ }
21069
+ }
21070
+ qrSvg += '" stroke="transparent" fill="black"/>';
21071
+ qrSvg += "</svg>";
21072
+ return qrSvg;
21073
+ };
21074
+ _this.createDataURL = function(cellSize, margin) {
21075
+ cellSize = cellSize || 2;
21076
+ margin = typeof margin == "undefined" ? cellSize * 4 : margin;
21077
+ var size = _this.getModuleCount() * cellSize + margin * 2;
21078
+ var min = margin;
21079
+ var max = size - margin;
21080
+ return createDataURL(size, size, function(x, y) {
21081
+ if (min <= x && x < max && min <= y && y < max) {
21082
+ var c = Math.floor((x - min) / cellSize);
21083
+ var r = Math.floor((y - min) / cellSize);
21084
+ return _this.isDark(r, c) ? 0 : 1;
21085
+ } else {
21086
+ return 1;
21087
+ }
21088
+ });
21089
+ };
21090
+ _this.createImgTag = function(cellSize, margin, alt) {
21091
+ cellSize = cellSize || 2;
21092
+ margin = typeof margin == "undefined" ? cellSize * 4 : margin;
21093
+ var size = _this.getModuleCount() * cellSize + margin * 2;
21094
+ var img = "";
21095
+ img += "<img";
21096
+ img += ' src="';
21097
+ img += _this.createDataURL(cellSize, margin);
21098
+ img += '"';
21099
+ img += ' width="';
21100
+ img += size;
21101
+ img += '"';
21102
+ img += ' height="';
21103
+ img += size;
21104
+ img += '"';
21105
+ if (alt) {
21106
+ img += ' alt="';
21107
+ img += escapeXml(alt);
21108
+ img += '"';
21109
+ }
21110
+ img += "/>";
21111
+ return img;
21112
+ };
21113
+ var escapeXml = function(s) {
21114
+ var escaped = "";
21115
+ for (var i = 0; i < s.length; i += 1) {
21116
+ var c = s.charAt(i);
21117
+ switch (c) {
21118
+ case "<":
21119
+ escaped += "&lt;";
21120
+ break;
21121
+ case ">":
21122
+ escaped += "&gt;";
21123
+ break;
21124
+ case "&":
21125
+ escaped += "&amp;";
21126
+ break;
21127
+ case '"':
21128
+ escaped += "&quot;";
21129
+ break;
21130
+ default:
21131
+ escaped += c;
21132
+ break;
21133
+ }
21134
+ }
21135
+ return escaped;
21136
+ };
21137
+ var _createHalfASCII = function(margin) {
21138
+ var cellSize = 1;
21139
+ margin = typeof margin == "undefined" ? cellSize * 2 : margin;
21140
+ var size = _this.getModuleCount() * cellSize + margin * 2;
21141
+ var min = margin;
21142
+ var max = size - margin;
21143
+ var y, x, r1, r2, p;
21144
+ var blocks = {
21145
+ "\u2588\u2588": "\u2588",
21146
+ "\u2588 ": "\u2580",
21147
+ " \u2588": "\u2584",
21148
+ " ": " "
21149
+ };
21150
+ var blocksLastLineNoMargin = {
21151
+ "\u2588\u2588": "\u2580",
21152
+ "\u2588 ": "\u2580",
21153
+ " \u2588": " ",
21154
+ " ": " "
21155
+ };
21156
+ var ascii = "";
21157
+ for (y = 0; y < size; y += 2) {
21158
+ r1 = Math.floor((y - min) / cellSize);
21159
+ r2 = Math.floor((y + 1 - min) / cellSize);
21160
+ for (x = 0; x < size; x += 1) {
21161
+ p = "\u2588";
21162
+ if (min <= x && x < max && min <= y && y < max && _this.isDark(r1, Math.floor((x - min) / cellSize))) {
21163
+ p = " ";
21164
+ }
21165
+ if (min <= x && x < max && min <= y + 1 && y + 1 < max && _this.isDark(r2, Math.floor((x - min) / cellSize))) {
21166
+ p += " ";
21167
+ } else {
21168
+ p += "\u2588";
21169
+ }
21170
+ ascii += margin < 1 && y + 1 >= max ? blocksLastLineNoMargin[p] : blocks[p];
21171
+ }
21172
+ ascii += "\n";
21173
+ }
21174
+ if (size % 2 && margin > 0) {
21175
+ return ascii.substring(0, ascii.length - size - 1) + Array(size + 1).join("\u2580");
21176
+ }
21177
+ return ascii.substring(0, ascii.length - 1);
21178
+ };
21179
+ _this.createASCII = function(cellSize, margin) {
21180
+ cellSize = cellSize || 1;
21181
+ if (cellSize < 2) {
21182
+ return _createHalfASCII(margin);
21183
+ }
21184
+ cellSize -= 1;
21185
+ margin = typeof margin == "undefined" ? cellSize * 2 : margin;
21186
+ var size = _this.getModuleCount() * cellSize + margin * 2;
21187
+ var min = margin;
21188
+ var max = size - margin;
21189
+ var y, x, r, p;
21190
+ var white = Array(cellSize + 1).join("\u2588\u2588");
21191
+ var black = Array(cellSize + 1).join(" ");
21192
+ var ascii = "";
21193
+ var line = "";
21194
+ for (y = 0; y < size; y += 1) {
21195
+ r = Math.floor((y - min) / cellSize);
21196
+ line = "";
21197
+ for (x = 0; x < size; x += 1) {
21198
+ p = 1;
21199
+ if (min <= x && x < max && min <= y && y < max && _this.isDark(r, Math.floor((x - min) / cellSize))) {
21200
+ p = 0;
21201
+ }
21202
+ line += p ? white : black;
21203
+ }
21204
+ for (r = 0; r < cellSize; r += 1) {
21205
+ ascii += line + "\n";
21206
+ }
21207
+ }
21208
+ return ascii.substring(0, ascii.length - 1);
21209
+ };
21210
+ _this.renderTo2dContext = function(context, cellSize) {
21211
+ cellSize = cellSize || 2;
21212
+ var length = _this.getModuleCount();
21213
+ for (var row = 0; row < length; row++) {
21214
+ for (var col = 0; col < length; col++) {
21215
+ context.fillStyle = _this.isDark(row, col) ? "black" : "white";
21216
+ context.fillRect(col * cellSize, row * cellSize, cellSize, cellSize);
21217
+ }
21218
+ }
21219
+ };
21220
+ return _this;
21221
+ };
21222
+ qrcode2.stringToBytesFuncs = {
21223
+ "default": function(s) {
21224
+ var bytes = [];
21225
+ for (var i = 0; i < s.length; i += 1) {
21226
+ var c = s.charCodeAt(i);
21227
+ bytes.push(c & 255);
21228
+ }
21229
+ return bytes;
21230
+ }
21231
+ };
21232
+ qrcode2.stringToBytes = qrcode2.stringToBytesFuncs["default"];
21233
+ qrcode2.createStringToBytes = function(unicodeData, numChars) {
21234
+ var unicodeMap = (function() {
21235
+ var bin = base64DecodeInputStream(unicodeData);
21236
+ var read = function() {
21237
+ var b = bin.read();
21238
+ if (b == -1) throw "eof";
21239
+ return b;
21240
+ };
21241
+ var count = 0;
21242
+ var unicodeMap2 = {};
21243
+ while (true) {
21244
+ var b0 = bin.read();
21245
+ if (b0 == -1) break;
21246
+ var b1 = read();
21247
+ var b2 = read();
21248
+ var b3 = read();
21249
+ var k = String.fromCharCode(b0 << 8 | b1);
21250
+ var v = b2 << 8 | b3;
21251
+ unicodeMap2[k] = v;
21252
+ count += 1;
21253
+ }
21254
+ if (count != numChars) {
21255
+ throw count + " != " + numChars;
21256
+ }
21257
+ return unicodeMap2;
21258
+ })();
21259
+ var unknownChar = "?".charCodeAt(0);
21260
+ return function(s) {
21261
+ var bytes = [];
21262
+ for (var i = 0; i < s.length; i += 1) {
21263
+ var c = s.charCodeAt(i);
21264
+ if (c < 128) {
21265
+ bytes.push(c);
21266
+ } else {
21267
+ var b = unicodeMap[s.charAt(i)];
21268
+ if (typeof b == "number") {
21269
+ if ((b & 255) == b) {
21270
+ bytes.push(b);
21271
+ } else {
21272
+ bytes.push(b >>> 8);
21273
+ bytes.push(b & 255);
21274
+ }
21275
+ } else {
21276
+ bytes.push(unknownChar);
21277
+ }
21278
+ }
21279
+ }
21280
+ return bytes;
21281
+ };
21282
+ };
21283
+ var QRMode = {
21284
+ MODE_NUMBER: 1 << 0,
21285
+ MODE_ALPHA_NUM: 1 << 1,
21286
+ MODE_8BIT_BYTE: 1 << 2,
21287
+ MODE_KANJI: 1 << 3
21288
+ };
21289
+ var QRErrorCorrectionLevel = {
21290
+ L: 1,
21291
+ M: 0,
21292
+ Q: 3,
21293
+ H: 2
21294
+ };
21295
+ var QRMaskPattern = {
21296
+ PATTERN000: 0,
21297
+ PATTERN001: 1,
21298
+ PATTERN010: 2,
21299
+ PATTERN011: 3,
21300
+ PATTERN100: 4,
21301
+ PATTERN101: 5,
21302
+ PATTERN110: 6,
21303
+ PATTERN111: 7
21304
+ };
21305
+ var QRUtil = (function() {
21306
+ var PATTERN_POSITION_TABLE = [
21307
+ [],
21308
+ [6, 18],
21309
+ [6, 22],
21310
+ [6, 26],
21311
+ [6, 30],
21312
+ [6, 34],
21313
+ [6, 22, 38],
21314
+ [6, 24, 42],
21315
+ [6, 26, 46],
21316
+ [6, 28, 50],
21317
+ [6, 30, 54],
21318
+ [6, 32, 58],
21319
+ [6, 34, 62],
21320
+ [6, 26, 46, 66],
21321
+ [6, 26, 48, 70],
21322
+ [6, 26, 50, 74],
21323
+ [6, 30, 54, 78],
21324
+ [6, 30, 56, 82],
21325
+ [6, 30, 58, 86],
21326
+ [6, 34, 62, 90],
21327
+ [6, 28, 50, 72, 94],
21328
+ [6, 26, 50, 74, 98],
21329
+ [6, 30, 54, 78, 102],
21330
+ [6, 28, 54, 80, 106],
21331
+ [6, 32, 58, 84, 110],
21332
+ [6, 30, 58, 86, 114],
21333
+ [6, 34, 62, 90, 118],
21334
+ [6, 26, 50, 74, 98, 122],
21335
+ [6, 30, 54, 78, 102, 126],
21336
+ [6, 26, 52, 78, 104, 130],
21337
+ [6, 30, 56, 82, 108, 134],
21338
+ [6, 34, 60, 86, 112, 138],
21339
+ [6, 30, 58, 86, 114, 142],
21340
+ [6, 34, 62, 90, 118, 146],
21341
+ [6, 30, 54, 78, 102, 126, 150],
21342
+ [6, 24, 50, 76, 102, 128, 154],
21343
+ [6, 28, 54, 80, 106, 132, 158],
21344
+ [6, 32, 58, 84, 110, 136, 162],
21345
+ [6, 26, 54, 82, 110, 138, 166],
21346
+ [6, 30, 58, 86, 114, 142, 170]
21347
+ ];
21348
+ var G15 = 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0;
21349
+ var G18 = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0;
21350
+ var G15_MASK = 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1;
21351
+ var _this = {};
21352
+ var getBCHDigit = function(data) {
21353
+ var digit = 0;
21354
+ while (data != 0) {
21355
+ digit += 1;
21356
+ data >>>= 1;
21357
+ }
21358
+ return digit;
21359
+ };
21360
+ _this.getBCHTypeInfo = function(data) {
21361
+ var d = data << 10;
21362
+ while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {
21363
+ d ^= G15 << getBCHDigit(d) - getBCHDigit(G15);
21364
+ }
21365
+ return (data << 10 | d) ^ G15_MASK;
21366
+ };
21367
+ _this.getBCHTypeNumber = function(data) {
21368
+ var d = data << 12;
21369
+ while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {
21370
+ d ^= G18 << getBCHDigit(d) - getBCHDigit(G18);
21371
+ }
21372
+ return data << 12 | d;
21373
+ };
21374
+ _this.getPatternPosition = function(typeNumber) {
21375
+ return PATTERN_POSITION_TABLE[typeNumber - 1];
21376
+ };
21377
+ _this.getMaskFunction = function(maskPattern) {
21378
+ switch (maskPattern) {
21379
+ case QRMaskPattern.PATTERN000:
21380
+ return function(i, j) {
21381
+ return (i + j) % 2 == 0;
21382
+ };
21383
+ case QRMaskPattern.PATTERN001:
21384
+ return function(i, j) {
21385
+ return i % 2 == 0;
21386
+ };
21387
+ case QRMaskPattern.PATTERN010:
21388
+ return function(i, j) {
21389
+ return j % 3 == 0;
21390
+ };
21391
+ case QRMaskPattern.PATTERN011:
21392
+ return function(i, j) {
21393
+ return (i + j) % 3 == 0;
21394
+ };
21395
+ case QRMaskPattern.PATTERN100:
21396
+ return function(i, j) {
21397
+ return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
21398
+ };
21399
+ case QRMaskPattern.PATTERN101:
21400
+ return function(i, j) {
21401
+ return i * j % 2 + i * j % 3 == 0;
21402
+ };
21403
+ case QRMaskPattern.PATTERN110:
21404
+ return function(i, j) {
21405
+ return (i * j % 2 + i * j % 3) % 2 == 0;
21406
+ };
21407
+ case QRMaskPattern.PATTERN111:
21408
+ return function(i, j) {
21409
+ return (i * j % 3 + (i + j) % 2) % 2 == 0;
21410
+ };
21411
+ default:
21412
+ throw "bad maskPattern:" + maskPattern;
21413
+ }
21414
+ };
21415
+ _this.getErrorCorrectPolynomial = function(errorCorrectLength) {
21416
+ var a = qrPolynomial([1], 0);
21417
+ for (var i = 0; i < errorCorrectLength; i += 1) {
21418
+ a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0));
21419
+ }
21420
+ return a;
21421
+ };
21422
+ _this.getLengthInBits = function(mode, type) {
21423
+ if (1 <= type && type < 10) {
21424
+ switch (mode) {
21425
+ case QRMode.MODE_NUMBER:
21426
+ return 10;
21427
+ case QRMode.MODE_ALPHA_NUM:
21428
+ return 9;
21429
+ case QRMode.MODE_8BIT_BYTE:
21430
+ return 8;
21431
+ case QRMode.MODE_KANJI:
21432
+ return 8;
21433
+ default:
21434
+ throw "mode:" + mode;
21435
+ }
21436
+ } else if (type < 27) {
21437
+ switch (mode) {
21438
+ case QRMode.MODE_NUMBER:
21439
+ return 12;
21440
+ case QRMode.MODE_ALPHA_NUM:
21441
+ return 11;
21442
+ case QRMode.MODE_8BIT_BYTE:
21443
+ return 16;
21444
+ case QRMode.MODE_KANJI:
21445
+ return 10;
21446
+ default:
21447
+ throw "mode:" + mode;
21448
+ }
21449
+ } else if (type < 41) {
21450
+ switch (mode) {
21451
+ case QRMode.MODE_NUMBER:
21452
+ return 14;
21453
+ case QRMode.MODE_ALPHA_NUM:
21454
+ return 13;
21455
+ case QRMode.MODE_8BIT_BYTE:
21456
+ return 16;
21457
+ case QRMode.MODE_KANJI:
21458
+ return 12;
21459
+ default:
21460
+ throw "mode:" + mode;
21461
+ }
21462
+ } else {
21463
+ throw "type:" + type;
21464
+ }
21465
+ };
21466
+ _this.getLostPoint = function(qrcode3) {
21467
+ var moduleCount = qrcode3.getModuleCount();
21468
+ var lostPoint = 0;
21469
+ for (var row = 0; row < moduleCount; row += 1) {
21470
+ for (var col = 0; col < moduleCount; col += 1) {
21471
+ var sameCount = 0;
21472
+ var dark = qrcode3.isDark(row, col);
21473
+ for (var r = -1; r <= 1; r += 1) {
21474
+ if (row + r < 0 || moduleCount <= row + r) {
21475
+ continue;
21476
+ }
21477
+ for (var c = -1; c <= 1; c += 1) {
21478
+ if (col + c < 0 || moduleCount <= col + c) {
21479
+ continue;
21480
+ }
21481
+ if (r == 0 && c == 0) {
21482
+ continue;
21483
+ }
21484
+ if (dark == qrcode3.isDark(row + r, col + c)) {
21485
+ sameCount += 1;
21486
+ }
21487
+ }
21488
+ }
21489
+ if (sameCount > 5) {
21490
+ lostPoint += 3 + sameCount - 5;
21491
+ }
21492
+ }
21493
+ }
21494
+ ;
21495
+ for (var row = 0; row < moduleCount - 1; row += 1) {
21496
+ for (var col = 0; col < moduleCount - 1; col += 1) {
21497
+ var count = 0;
21498
+ if (qrcode3.isDark(row, col)) count += 1;
21499
+ if (qrcode3.isDark(row + 1, col)) count += 1;
21500
+ if (qrcode3.isDark(row, col + 1)) count += 1;
21501
+ if (qrcode3.isDark(row + 1, col + 1)) count += 1;
21502
+ if (count == 0 || count == 4) {
21503
+ lostPoint += 3;
21504
+ }
21505
+ }
21506
+ }
21507
+ for (var row = 0; row < moduleCount; row += 1) {
21508
+ for (var col = 0; col < moduleCount - 6; col += 1) {
21509
+ if (qrcode3.isDark(row, col) && !qrcode3.isDark(row, col + 1) && qrcode3.isDark(row, col + 2) && qrcode3.isDark(row, col + 3) && qrcode3.isDark(row, col + 4) && !qrcode3.isDark(row, col + 5) && qrcode3.isDark(row, col + 6)) {
21510
+ lostPoint += 40;
21511
+ }
21512
+ }
21513
+ }
21514
+ for (var col = 0; col < moduleCount; col += 1) {
21515
+ for (var row = 0; row < moduleCount - 6; row += 1) {
21516
+ if (qrcode3.isDark(row, col) && !qrcode3.isDark(row + 1, col) && qrcode3.isDark(row + 2, col) && qrcode3.isDark(row + 3, col) && qrcode3.isDark(row + 4, col) && !qrcode3.isDark(row + 5, col) && qrcode3.isDark(row + 6, col)) {
21517
+ lostPoint += 40;
21518
+ }
21519
+ }
21520
+ }
21521
+ var darkCount = 0;
21522
+ for (var col = 0; col < moduleCount; col += 1) {
21523
+ for (var row = 0; row < moduleCount; row += 1) {
21524
+ if (qrcode3.isDark(row, col)) {
21525
+ darkCount += 1;
21526
+ }
21527
+ }
21528
+ }
21529
+ var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
21530
+ lostPoint += ratio * 10;
21531
+ return lostPoint;
21532
+ };
21533
+ return _this;
21534
+ })();
21535
+ var QRMath = (function() {
21536
+ var EXP_TABLE = new Array(256);
21537
+ var LOG_TABLE = new Array(256);
21538
+ for (var i = 0; i < 8; i += 1) {
21539
+ EXP_TABLE[i] = 1 << i;
21540
+ }
21541
+ for (var i = 8; i < 256; i += 1) {
21542
+ EXP_TABLE[i] = EXP_TABLE[i - 4] ^ EXP_TABLE[i - 5] ^ EXP_TABLE[i - 6] ^ EXP_TABLE[i - 8];
21543
+ }
21544
+ for (var i = 0; i < 255; i += 1) {
21545
+ LOG_TABLE[EXP_TABLE[i]] = i;
21546
+ }
21547
+ var _this = {};
21548
+ _this.glog = function(n) {
21549
+ if (n < 1) {
21550
+ throw "glog(" + n + ")";
21551
+ }
21552
+ return LOG_TABLE[n];
21553
+ };
21554
+ _this.gexp = function(n) {
21555
+ while (n < 0) {
21556
+ n += 255;
21557
+ }
21558
+ while (n >= 256) {
21559
+ n -= 255;
21560
+ }
21561
+ return EXP_TABLE[n];
21562
+ };
21563
+ return _this;
21564
+ })();
21565
+ function qrPolynomial(num, shift) {
21566
+ if (typeof num.length == "undefined") {
21567
+ throw num.length + "/" + shift;
21568
+ }
21569
+ var _num = (function() {
21570
+ var offset = 0;
21571
+ while (offset < num.length && num[offset] == 0) {
21572
+ offset += 1;
21573
+ }
21574
+ var _num2 = new Array(num.length - offset + shift);
21575
+ for (var i = 0; i < num.length - offset; i += 1) {
21576
+ _num2[i] = num[i + offset];
21577
+ }
21578
+ return _num2;
21579
+ })();
21580
+ var _this = {};
21581
+ _this.getAt = function(index) {
21582
+ return _num[index];
21583
+ };
21584
+ _this.getLength = function() {
21585
+ return _num.length;
21586
+ };
21587
+ _this.multiply = function(e) {
21588
+ var num2 = new Array(_this.getLength() + e.getLength() - 1);
21589
+ for (var i = 0; i < _this.getLength(); i += 1) {
21590
+ for (var j = 0; j < e.getLength(); j += 1) {
21591
+ num2[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i)) + QRMath.glog(e.getAt(j)));
21592
+ }
21593
+ }
21594
+ return qrPolynomial(num2, 0);
21595
+ };
21596
+ _this.mod = function(e) {
21597
+ if (_this.getLength() - e.getLength() < 0) {
21598
+ return _this;
21599
+ }
21600
+ var ratio = QRMath.glog(_this.getAt(0)) - QRMath.glog(e.getAt(0));
21601
+ var num2 = new Array(_this.getLength());
21602
+ for (var i = 0; i < _this.getLength(); i += 1) {
21603
+ num2[i] = _this.getAt(i);
21604
+ }
21605
+ for (var i = 0; i < e.getLength(); i += 1) {
21606
+ num2[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i)) + ratio);
21607
+ }
21608
+ return qrPolynomial(num2, 0).mod(e);
21609
+ };
21610
+ return _this;
21611
+ }
21612
+ ;
21613
+ var QRRSBlock = (function() {
21614
+ var RS_BLOCK_TABLE = [
21615
+ // L
21616
+ // M
21617
+ // Q
21618
+ // H
21619
+ // 1
21620
+ [1, 26, 19],
21621
+ [1, 26, 16],
21622
+ [1, 26, 13],
21623
+ [1, 26, 9],
21624
+ // 2
21625
+ [1, 44, 34],
21626
+ [1, 44, 28],
21627
+ [1, 44, 22],
21628
+ [1, 44, 16],
21629
+ // 3
21630
+ [1, 70, 55],
21631
+ [1, 70, 44],
21632
+ [2, 35, 17],
21633
+ [2, 35, 13],
21634
+ // 4
21635
+ [1, 100, 80],
21636
+ [2, 50, 32],
21637
+ [2, 50, 24],
21638
+ [4, 25, 9],
21639
+ // 5
21640
+ [1, 134, 108],
21641
+ [2, 67, 43],
21642
+ [2, 33, 15, 2, 34, 16],
21643
+ [2, 33, 11, 2, 34, 12],
21644
+ // 6
21645
+ [2, 86, 68],
21646
+ [4, 43, 27],
21647
+ [4, 43, 19],
21648
+ [4, 43, 15],
21649
+ // 7
21650
+ [2, 98, 78],
21651
+ [4, 49, 31],
21652
+ [2, 32, 14, 4, 33, 15],
21653
+ [4, 39, 13, 1, 40, 14],
21654
+ // 8
21655
+ [2, 121, 97],
21656
+ [2, 60, 38, 2, 61, 39],
21657
+ [4, 40, 18, 2, 41, 19],
21658
+ [4, 40, 14, 2, 41, 15],
21659
+ // 9
21660
+ [2, 146, 116],
21661
+ [3, 58, 36, 2, 59, 37],
21662
+ [4, 36, 16, 4, 37, 17],
21663
+ [4, 36, 12, 4, 37, 13],
21664
+ // 10
21665
+ [2, 86, 68, 2, 87, 69],
21666
+ [4, 69, 43, 1, 70, 44],
21667
+ [6, 43, 19, 2, 44, 20],
21668
+ [6, 43, 15, 2, 44, 16],
21669
+ // 11
21670
+ [4, 101, 81],
21671
+ [1, 80, 50, 4, 81, 51],
21672
+ [4, 50, 22, 4, 51, 23],
21673
+ [3, 36, 12, 8, 37, 13],
21674
+ // 12
21675
+ [2, 116, 92, 2, 117, 93],
21676
+ [6, 58, 36, 2, 59, 37],
21677
+ [4, 46, 20, 6, 47, 21],
21678
+ [7, 42, 14, 4, 43, 15],
21679
+ // 13
21680
+ [4, 133, 107],
21681
+ [8, 59, 37, 1, 60, 38],
21682
+ [8, 44, 20, 4, 45, 21],
21683
+ [12, 33, 11, 4, 34, 12],
21684
+ // 14
21685
+ [3, 145, 115, 1, 146, 116],
21686
+ [4, 64, 40, 5, 65, 41],
21687
+ [11, 36, 16, 5, 37, 17],
21688
+ [11, 36, 12, 5, 37, 13],
21689
+ // 15
21690
+ [5, 109, 87, 1, 110, 88],
21691
+ [5, 65, 41, 5, 66, 42],
21692
+ [5, 54, 24, 7, 55, 25],
21693
+ [11, 36, 12, 7, 37, 13],
21694
+ // 16
21695
+ [5, 122, 98, 1, 123, 99],
21696
+ [7, 73, 45, 3, 74, 46],
21697
+ [15, 43, 19, 2, 44, 20],
21698
+ [3, 45, 15, 13, 46, 16],
21699
+ // 17
21700
+ [1, 135, 107, 5, 136, 108],
21701
+ [10, 74, 46, 1, 75, 47],
21702
+ [1, 50, 22, 15, 51, 23],
21703
+ [2, 42, 14, 17, 43, 15],
21704
+ // 18
21705
+ [5, 150, 120, 1, 151, 121],
21706
+ [9, 69, 43, 4, 70, 44],
21707
+ [17, 50, 22, 1, 51, 23],
21708
+ [2, 42, 14, 19, 43, 15],
21709
+ // 19
21710
+ [3, 141, 113, 4, 142, 114],
21711
+ [3, 70, 44, 11, 71, 45],
21712
+ [17, 47, 21, 4, 48, 22],
21713
+ [9, 39, 13, 16, 40, 14],
21714
+ // 20
21715
+ [3, 135, 107, 5, 136, 108],
21716
+ [3, 67, 41, 13, 68, 42],
21717
+ [15, 54, 24, 5, 55, 25],
21718
+ [15, 43, 15, 10, 44, 16],
21719
+ // 21
21720
+ [4, 144, 116, 4, 145, 117],
21721
+ [17, 68, 42],
21722
+ [17, 50, 22, 6, 51, 23],
21723
+ [19, 46, 16, 6, 47, 17],
21724
+ // 22
21725
+ [2, 139, 111, 7, 140, 112],
21726
+ [17, 74, 46],
21727
+ [7, 54, 24, 16, 55, 25],
21728
+ [34, 37, 13],
21729
+ // 23
21730
+ [4, 151, 121, 5, 152, 122],
21731
+ [4, 75, 47, 14, 76, 48],
21732
+ [11, 54, 24, 14, 55, 25],
21733
+ [16, 45, 15, 14, 46, 16],
21734
+ // 24
21735
+ [6, 147, 117, 4, 148, 118],
21736
+ [6, 73, 45, 14, 74, 46],
21737
+ [11, 54, 24, 16, 55, 25],
21738
+ [30, 46, 16, 2, 47, 17],
21739
+ // 25
21740
+ [8, 132, 106, 4, 133, 107],
21741
+ [8, 75, 47, 13, 76, 48],
21742
+ [7, 54, 24, 22, 55, 25],
21743
+ [22, 45, 15, 13, 46, 16],
21744
+ // 26
21745
+ [10, 142, 114, 2, 143, 115],
21746
+ [19, 74, 46, 4, 75, 47],
21747
+ [28, 50, 22, 6, 51, 23],
21748
+ [33, 46, 16, 4, 47, 17],
21749
+ // 27
21750
+ [8, 152, 122, 4, 153, 123],
21751
+ [22, 73, 45, 3, 74, 46],
21752
+ [8, 53, 23, 26, 54, 24],
21753
+ [12, 45, 15, 28, 46, 16],
21754
+ // 28
21755
+ [3, 147, 117, 10, 148, 118],
21756
+ [3, 73, 45, 23, 74, 46],
21757
+ [4, 54, 24, 31, 55, 25],
21758
+ [11, 45, 15, 31, 46, 16],
21759
+ // 29
21760
+ [7, 146, 116, 7, 147, 117],
21761
+ [21, 73, 45, 7, 74, 46],
21762
+ [1, 53, 23, 37, 54, 24],
21763
+ [19, 45, 15, 26, 46, 16],
21764
+ // 30
21765
+ [5, 145, 115, 10, 146, 116],
21766
+ [19, 75, 47, 10, 76, 48],
21767
+ [15, 54, 24, 25, 55, 25],
21768
+ [23, 45, 15, 25, 46, 16],
21769
+ // 31
21770
+ [13, 145, 115, 3, 146, 116],
21771
+ [2, 74, 46, 29, 75, 47],
21772
+ [42, 54, 24, 1, 55, 25],
21773
+ [23, 45, 15, 28, 46, 16],
21774
+ // 32
21775
+ [17, 145, 115],
21776
+ [10, 74, 46, 23, 75, 47],
21777
+ [10, 54, 24, 35, 55, 25],
21778
+ [19, 45, 15, 35, 46, 16],
21779
+ // 33
21780
+ [17, 145, 115, 1, 146, 116],
21781
+ [14, 74, 46, 21, 75, 47],
21782
+ [29, 54, 24, 19, 55, 25],
21783
+ [11, 45, 15, 46, 46, 16],
21784
+ // 34
21785
+ [13, 145, 115, 6, 146, 116],
21786
+ [14, 74, 46, 23, 75, 47],
21787
+ [44, 54, 24, 7, 55, 25],
21788
+ [59, 46, 16, 1, 47, 17],
21789
+ // 35
21790
+ [12, 151, 121, 7, 152, 122],
21791
+ [12, 75, 47, 26, 76, 48],
21792
+ [39, 54, 24, 14, 55, 25],
21793
+ [22, 45, 15, 41, 46, 16],
21794
+ // 36
21795
+ [6, 151, 121, 14, 152, 122],
21796
+ [6, 75, 47, 34, 76, 48],
21797
+ [46, 54, 24, 10, 55, 25],
21798
+ [2, 45, 15, 64, 46, 16],
21799
+ // 37
21800
+ [17, 152, 122, 4, 153, 123],
21801
+ [29, 74, 46, 14, 75, 47],
21802
+ [49, 54, 24, 10, 55, 25],
21803
+ [24, 45, 15, 46, 46, 16],
21804
+ // 38
21805
+ [4, 152, 122, 18, 153, 123],
21806
+ [13, 74, 46, 32, 75, 47],
21807
+ [48, 54, 24, 14, 55, 25],
21808
+ [42, 45, 15, 32, 46, 16],
21809
+ // 39
21810
+ [20, 147, 117, 4, 148, 118],
21811
+ [40, 75, 47, 7, 76, 48],
21812
+ [43, 54, 24, 22, 55, 25],
21813
+ [10, 45, 15, 67, 46, 16],
21814
+ // 40
21815
+ [19, 148, 118, 6, 149, 119],
21816
+ [18, 75, 47, 31, 76, 48],
21817
+ [34, 54, 24, 34, 55, 25],
21818
+ [20, 45, 15, 61, 46, 16]
21819
+ ];
21820
+ var qrRSBlock = function(totalCount, dataCount) {
21821
+ var _this2 = {};
21822
+ _this2.totalCount = totalCount;
21823
+ _this2.dataCount = dataCount;
21824
+ return _this2;
21825
+ };
21826
+ var _this = {};
21827
+ var getRsBlockTable = function(typeNumber, errorCorrectionLevel) {
21828
+ switch (errorCorrectionLevel) {
21829
+ case QRErrorCorrectionLevel.L:
21830
+ return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
21831
+ case QRErrorCorrectionLevel.M:
21832
+ return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
21833
+ case QRErrorCorrectionLevel.Q:
21834
+ return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
21835
+ case QRErrorCorrectionLevel.H:
21836
+ return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
21837
+ default:
21838
+ return void 0;
21839
+ }
21840
+ };
21841
+ _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) {
21842
+ var rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);
21843
+ if (typeof rsBlock == "undefined") {
21844
+ throw "bad rs block @ typeNumber:" + typeNumber + "/errorCorrectionLevel:" + errorCorrectionLevel;
21845
+ }
21846
+ var length = rsBlock.length / 3;
21847
+ var list = [];
21848
+ for (var i = 0; i < length; i += 1) {
21849
+ var count = rsBlock[i * 3 + 0];
21850
+ var totalCount = rsBlock[i * 3 + 1];
21851
+ var dataCount = rsBlock[i * 3 + 2];
21852
+ for (var j = 0; j < count; j += 1) {
21853
+ list.push(qrRSBlock(totalCount, dataCount));
21854
+ }
21855
+ }
21856
+ return list;
21857
+ };
21858
+ return _this;
21859
+ })();
21860
+ var qrBitBuffer = function() {
21861
+ var _buffer = [];
21862
+ var _length = 0;
21863
+ var _this = {};
21864
+ _this.getBuffer = function() {
21865
+ return _buffer;
21866
+ };
21867
+ _this.getAt = function(index) {
21868
+ var bufIndex = Math.floor(index / 8);
21869
+ return (_buffer[bufIndex] >>> 7 - index % 8 & 1) == 1;
21870
+ };
21871
+ _this.put = function(num, length) {
21872
+ for (var i = 0; i < length; i += 1) {
21873
+ _this.putBit((num >>> length - i - 1 & 1) == 1);
21874
+ }
21875
+ };
21876
+ _this.getLengthInBits = function() {
21877
+ return _length;
21878
+ };
21879
+ _this.putBit = function(bit) {
21880
+ var bufIndex = Math.floor(_length / 8);
21881
+ if (_buffer.length <= bufIndex) {
21882
+ _buffer.push(0);
21883
+ }
21884
+ if (bit) {
21885
+ _buffer[bufIndex] |= 128 >>> _length % 8;
21886
+ }
21887
+ _length += 1;
21888
+ };
21889
+ return _this;
21890
+ };
21891
+ var qrNumber = function(data) {
21892
+ var _mode = QRMode.MODE_NUMBER;
21893
+ var _data = data;
21894
+ var _this = {};
21895
+ _this.getMode = function() {
21896
+ return _mode;
21897
+ };
21898
+ _this.getLength = function(buffer) {
21899
+ return _data.length;
21900
+ };
21901
+ _this.write = function(buffer) {
21902
+ var data2 = _data;
21903
+ var i = 0;
21904
+ while (i + 2 < data2.length) {
21905
+ buffer.put(strToNum(data2.substring(i, i + 3)), 10);
21906
+ i += 3;
21907
+ }
21908
+ if (i < data2.length) {
21909
+ if (data2.length - i == 1) {
21910
+ buffer.put(strToNum(data2.substring(i, i + 1)), 4);
21911
+ } else if (data2.length - i == 2) {
21912
+ buffer.put(strToNum(data2.substring(i, i + 2)), 7);
21913
+ }
21914
+ }
21915
+ };
21916
+ var strToNum = function(s) {
21917
+ var num = 0;
21918
+ for (var i = 0; i < s.length; i += 1) {
21919
+ num = num * 10 + chatToNum(s.charAt(i));
21920
+ }
21921
+ return num;
21922
+ };
21923
+ var chatToNum = function(c) {
21924
+ if ("0" <= c && c <= "9") {
21925
+ return c.charCodeAt(0) - "0".charCodeAt(0);
21926
+ }
21927
+ throw "illegal char :" + c;
21928
+ };
21929
+ return _this;
21930
+ };
21931
+ var qrAlphaNum = function(data) {
21932
+ var _mode = QRMode.MODE_ALPHA_NUM;
21933
+ var _data = data;
21934
+ var _this = {};
21935
+ _this.getMode = function() {
21936
+ return _mode;
21937
+ };
21938
+ _this.getLength = function(buffer) {
21939
+ return _data.length;
21940
+ };
21941
+ _this.write = function(buffer) {
21942
+ var s = _data;
21943
+ var i = 0;
21944
+ while (i + 1 < s.length) {
21945
+ buffer.put(
21946
+ getCode(s.charAt(i)) * 45 + getCode(s.charAt(i + 1)),
21947
+ 11
21948
+ );
21949
+ i += 2;
21950
+ }
21951
+ if (i < s.length) {
21952
+ buffer.put(getCode(s.charAt(i)), 6);
21953
+ }
21954
+ };
21955
+ var getCode = function(c) {
21956
+ if ("0" <= c && c <= "9") {
21957
+ return c.charCodeAt(0) - "0".charCodeAt(0);
21958
+ } else if ("A" <= c && c <= "Z") {
21959
+ return c.charCodeAt(0) - "A".charCodeAt(0) + 10;
21960
+ } else {
21961
+ switch (c) {
21962
+ case " ":
21963
+ return 36;
21964
+ case "$":
21965
+ return 37;
21966
+ case "%":
21967
+ return 38;
21968
+ case "*":
21969
+ return 39;
21970
+ case "+":
21971
+ return 40;
21972
+ case "-":
21973
+ return 41;
21974
+ case ".":
21975
+ return 42;
21976
+ case "/":
21977
+ return 43;
21978
+ case ":":
21979
+ return 44;
21980
+ default:
21981
+ throw "illegal char :" + c;
21982
+ }
21983
+ }
21984
+ };
21985
+ return _this;
21986
+ };
21987
+ var qr8BitByte = function(data) {
21988
+ var _mode = QRMode.MODE_8BIT_BYTE;
21989
+ var _data = data;
21990
+ var _bytes = qrcode2.stringToBytes(data);
21991
+ var _this = {};
21992
+ _this.getMode = function() {
21993
+ return _mode;
21994
+ };
21995
+ _this.getLength = function(buffer) {
21996
+ return _bytes.length;
21997
+ };
21998
+ _this.write = function(buffer) {
21999
+ for (var i = 0; i < _bytes.length; i += 1) {
22000
+ buffer.put(_bytes[i], 8);
22001
+ }
22002
+ };
22003
+ return _this;
22004
+ };
22005
+ var qrKanji = function(data) {
22006
+ var _mode = QRMode.MODE_KANJI;
22007
+ var _data = data;
22008
+ var stringToBytes = qrcode2.stringToBytesFuncs["SJIS"];
22009
+ if (!stringToBytes) {
22010
+ throw "sjis not supported.";
22011
+ }
22012
+ !(function(c, code) {
22013
+ var test = stringToBytes(c);
22014
+ if (test.length != 2 || (test[0] << 8 | test[1]) != code) {
22015
+ throw "sjis not supported.";
22016
+ }
22017
+ })("\u53CB", 38726);
22018
+ var _bytes = stringToBytes(data);
22019
+ var _this = {};
22020
+ _this.getMode = function() {
22021
+ return _mode;
22022
+ };
22023
+ _this.getLength = function(buffer) {
22024
+ return ~~(_bytes.length / 2);
22025
+ };
22026
+ _this.write = function(buffer) {
22027
+ var data2 = _bytes;
22028
+ var i = 0;
22029
+ while (i + 1 < data2.length) {
22030
+ var c = (255 & data2[i]) << 8 | 255 & data2[i + 1];
22031
+ if (33088 <= c && c <= 40956) {
22032
+ c -= 33088;
22033
+ } else if (57408 <= c && c <= 60351) {
22034
+ c -= 49472;
22035
+ } else {
22036
+ throw "illegal char at " + (i + 1) + "/" + c;
22037
+ }
22038
+ c = (c >>> 8 & 255) * 192 + (c & 255);
22039
+ buffer.put(c, 13);
22040
+ i += 2;
22041
+ }
22042
+ if (i < data2.length) {
22043
+ throw "illegal char at " + (i + 1);
22044
+ }
22045
+ };
22046
+ return _this;
22047
+ };
22048
+ var byteArrayOutputStream = function() {
22049
+ var _bytes = [];
22050
+ var _this = {};
22051
+ _this.writeByte = function(b) {
22052
+ _bytes.push(b & 255);
22053
+ };
22054
+ _this.writeShort = function(i) {
22055
+ _this.writeByte(i);
22056
+ _this.writeByte(i >>> 8);
22057
+ };
22058
+ _this.writeBytes = function(b, off, len) {
22059
+ off = off || 0;
22060
+ len = len || b.length;
22061
+ for (var i = 0; i < len; i += 1) {
22062
+ _this.writeByte(b[i + off]);
22063
+ }
22064
+ };
22065
+ _this.writeString = function(s) {
22066
+ for (var i = 0; i < s.length; i += 1) {
22067
+ _this.writeByte(s.charCodeAt(i));
22068
+ }
22069
+ };
22070
+ _this.toByteArray = function() {
22071
+ return _bytes;
22072
+ };
22073
+ _this.toString = function() {
22074
+ var s = "";
22075
+ s += "[";
22076
+ for (var i = 0; i < _bytes.length; i += 1) {
22077
+ if (i > 0) {
22078
+ s += ",";
22079
+ }
22080
+ s += _bytes[i];
22081
+ }
22082
+ s += "]";
22083
+ return s;
22084
+ };
22085
+ return _this;
22086
+ };
22087
+ var base64EncodeOutputStream = function() {
22088
+ var _buffer = 0;
22089
+ var _buflen = 0;
22090
+ var _length = 0;
22091
+ var _base64 = "";
22092
+ var _this = {};
22093
+ var writeEncoded = function(b) {
22094
+ _base64 += String.fromCharCode(encode(b & 63));
22095
+ };
22096
+ var encode = function(n) {
22097
+ if (n < 0) {
22098
+ } else if (n < 26) {
22099
+ return 65 + n;
22100
+ } else if (n < 52) {
22101
+ return 97 + (n - 26);
22102
+ } else if (n < 62) {
22103
+ return 48 + (n - 52);
22104
+ } else if (n == 62) {
22105
+ return 43;
22106
+ } else if (n == 63) {
22107
+ return 47;
22108
+ }
22109
+ throw "n:" + n;
22110
+ };
22111
+ _this.writeByte = function(n) {
22112
+ _buffer = _buffer << 8 | n & 255;
22113
+ _buflen += 8;
22114
+ _length += 1;
22115
+ while (_buflen >= 6) {
22116
+ writeEncoded(_buffer >>> _buflen - 6);
22117
+ _buflen -= 6;
22118
+ }
22119
+ };
22120
+ _this.flush = function() {
22121
+ if (_buflen > 0) {
22122
+ writeEncoded(_buffer << 6 - _buflen);
22123
+ _buffer = 0;
22124
+ _buflen = 0;
22125
+ }
22126
+ if (_length % 3 != 0) {
22127
+ var padlen = 3 - _length % 3;
22128
+ for (var i = 0; i < padlen; i += 1) {
22129
+ _base64 += "=";
22130
+ }
22131
+ }
22132
+ };
22133
+ _this.toString = function() {
22134
+ return _base64;
22135
+ };
22136
+ return _this;
22137
+ };
22138
+ var base64DecodeInputStream = function(str) {
22139
+ var _str = str;
22140
+ var _pos = 0;
22141
+ var _buffer = 0;
22142
+ var _buflen = 0;
22143
+ var _this = {};
22144
+ _this.read = function() {
22145
+ while (_buflen < 8) {
22146
+ if (_pos >= _str.length) {
22147
+ if (_buflen == 0) {
22148
+ return -1;
22149
+ }
22150
+ throw "unexpected end of file./" + _buflen;
22151
+ }
22152
+ var c = _str.charAt(_pos);
22153
+ _pos += 1;
22154
+ if (c == "=") {
22155
+ _buflen = 0;
22156
+ return -1;
22157
+ } else if (c.match(/^\s$/)) {
22158
+ continue;
22159
+ }
22160
+ _buffer = _buffer << 6 | decode(c.charCodeAt(0));
22161
+ _buflen += 6;
22162
+ }
22163
+ var n = _buffer >>> _buflen - 8 & 255;
22164
+ _buflen -= 8;
22165
+ return n;
22166
+ };
22167
+ var decode = function(c) {
22168
+ if (65 <= c && c <= 90) {
22169
+ return c - 65;
22170
+ } else if (97 <= c && c <= 122) {
22171
+ return c - 97 + 26;
22172
+ } else if (48 <= c && c <= 57) {
22173
+ return c - 48 + 52;
22174
+ } else if (c == 43) {
22175
+ return 62;
22176
+ } else if (c == 47) {
22177
+ return 63;
22178
+ } else {
22179
+ throw "c:" + c;
22180
+ }
22181
+ };
22182
+ return _this;
22183
+ };
22184
+ var gifImage = function(width, height) {
22185
+ var _width = width;
22186
+ var _height = height;
22187
+ var _data = new Array(width * height);
22188
+ var _this = {};
22189
+ _this.setPixel = function(x, y, pixel) {
22190
+ _data[y * _width + x] = pixel;
22191
+ };
22192
+ _this.write = function(out) {
22193
+ out.writeString("GIF87a");
22194
+ out.writeShort(_width);
22195
+ out.writeShort(_height);
22196
+ out.writeByte(128);
22197
+ out.writeByte(0);
22198
+ out.writeByte(0);
22199
+ out.writeByte(0);
22200
+ out.writeByte(0);
22201
+ out.writeByte(0);
22202
+ out.writeByte(255);
22203
+ out.writeByte(255);
22204
+ out.writeByte(255);
22205
+ out.writeString(",");
22206
+ out.writeShort(0);
22207
+ out.writeShort(0);
22208
+ out.writeShort(_width);
22209
+ out.writeShort(_height);
22210
+ out.writeByte(0);
22211
+ var lzwMinCodeSize = 2;
22212
+ var raster = getLZWRaster(lzwMinCodeSize);
22213
+ out.writeByte(lzwMinCodeSize);
22214
+ var offset = 0;
22215
+ while (raster.length - offset > 255) {
22216
+ out.writeByte(255);
22217
+ out.writeBytes(raster, offset, 255);
22218
+ offset += 255;
22219
+ }
22220
+ out.writeByte(raster.length - offset);
22221
+ out.writeBytes(raster, offset, raster.length - offset);
22222
+ out.writeByte(0);
22223
+ out.writeString(";");
22224
+ };
22225
+ var bitOutputStream = function(out) {
22226
+ var _out = out;
22227
+ var _bitLength = 0;
22228
+ var _bitBuffer = 0;
22229
+ var _this2 = {};
22230
+ _this2.write = function(data, length) {
22231
+ if (data >>> length != 0) {
22232
+ throw "length over";
22233
+ }
22234
+ while (_bitLength + length >= 8) {
22235
+ _out.writeByte(255 & (data << _bitLength | _bitBuffer));
22236
+ length -= 8 - _bitLength;
22237
+ data >>>= 8 - _bitLength;
22238
+ _bitBuffer = 0;
22239
+ _bitLength = 0;
22240
+ }
22241
+ _bitBuffer = data << _bitLength | _bitBuffer;
22242
+ _bitLength = _bitLength + length;
22243
+ };
22244
+ _this2.flush = function() {
22245
+ if (_bitLength > 0) {
22246
+ _out.writeByte(_bitBuffer);
22247
+ }
22248
+ };
22249
+ return _this2;
22250
+ };
22251
+ var getLZWRaster = function(lzwMinCodeSize) {
22252
+ var clearCode = 1 << lzwMinCodeSize;
22253
+ var endCode = (1 << lzwMinCodeSize) + 1;
22254
+ var bitLength = lzwMinCodeSize + 1;
22255
+ var table = lzwTable();
22256
+ for (var i = 0; i < clearCode; i += 1) {
22257
+ table.add(String.fromCharCode(i));
22258
+ }
22259
+ table.add(String.fromCharCode(clearCode));
22260
+ table.add(String.fromCharCode(endCode));
22261
+ var byteOut = byteArrayOutputStream();
22262
+ var bitOut = bitOutputStream(byteOut);
22263
+ bitOut.write(clearCode, bitLength);
22264
+ var dataIndex = 0;
22265
+ var s = String.fromCharCode(_data[dataIndex]);
22266
+ dataIndex += 1;
22267
+ while (dataIndex < _data.length) {
22268
+ var c = String.fromCharCode(_data[dataIndex]);
22269
+ dataIndex += 1;
22270
+ if (table.contains(s + c)) {
22271
+ s = s + c;
22272
+ } else {
22273
+ bitOut.write(table.indexOf(s), bitLength);
22274
+ if (table.size() < 4095) {
22275
+ if (table.size() == 1 << bitLength) {
22276
+ bitLength += 1;
22277
+ }
22278
+ table.add(s + c);
22279
+ }
22280
+ s = c;
22281
+ }
22282
+ }
22283
+ bitOut.write(table.indexOf(s), bitLength);
22284
+ bitOut.write(endCode, bitLength);
22285
+ bitOut.flush();
22286
+ return byteOut.toByteArray();
22287
+ };
22288
+ var lzwTable = function() {
22289
+ var _map = {};
22290
+ var _size = 0;
22291
+ var _this2 = {};
22292
+ _this2.add = function(key) {
22293
+ if (_this2.contains(key)) {
22294
+ throw "dup key:" + key;
22295
+ }
22296
+ _map[key] = _size;
22297
+ _size += 1;
22298
+ };
22299
+ _this2.size = function() {
22300
+ return _size;
22301
+ };
22302
+ _this2.indexOf = function(key) {
22303
+ return _map[key];
22304
+ };
22305
+ _this2.contains = function(key) {
22306
+ return typeof _map[key] != "undefined";
22307
+ };
22308
+ return _this2;
22309
+ };
22310
+ return _this;
22311
+ };
22312
+ var createDataURL = function(width, height, getPixel) {
22313
+ var gif = gifImage(width, height);
22314
+ for (var y = 0; y < height; y += 1) {
22315
+ for (var x = 0; x < width; x += 1) {
22316
+ gif.setPixel(x, y, getPixel(x, y));
22317
+ }
22318
+ }
22319
+ var b = byteArrayOutputStream();
22320
+ gif.write(b);
22321
+ var base64 = base64EncodeOutputStream();
22322
+ var bytes = b.toByteArray();
22323
+ for (var i = 0; i < bytes.length; i += 1) {
22324
+ base64.writeByte(bytes[i]);
22325
+ }
22326
+ base64.flush();
22327
+ return "data:image/gif;base64," + base64;
22328
+ };
22329
+ return qrcode2;
22330
+ })();
22331
+ !(function() {
22332
+ qrcode.stringToBytesFuncs["UTF-8"] = function(s) {
22333
+ function toUTF8Array(str) {
22334
+ var utf8 = [];
22335
+ for (var i = 0; i < str.length; i++) {
22336
+ var charcode = str.charCodeAt(i);
22337
+ if (charcode < 128) utf8.push(charcode);
22338
+ else if (charcode < 2048) {
22339
+ utf8.push(
22340
+ 192 | charcode >> 6,
22341
+ 128 | charcode & 63
22342
+ );
22343
+ } else if (charcode < 55296 || charcode >= 57344) {
22344
+ utf8.push(
22345
+ 224 | charcode >> 12,
22346
+ 128 | charcode >> 6 & 63,
22347
+ 128 | charcode & 63
22348
+ );
22349
+ } else {
22350
+ i++;
22351
+ charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);
22352
+ utf8.push(
22353
+ 240 | charcode >> 18,
22354
+ 128 | charcode >> 12 & 63,
22355
+ 128 | charcode >> 6 & 63,
22356
+ 128 | charcode & 63
22357
+ );
22358
+ }
22359
+ }
22360
+ return utf8;
22361
+ }
22362
+ return toUTF8Array(s);
22363
+ };
22364
+ })();
22365
+ (function(factory) {
22366
+ if (typeof define === "function" && define.amd) {
22367
+ define([], factory);
22368
+ } else if (typeof exports2 === "object") {
22369
+ module2.exports = factory();
22370
+ }
22371
+ })(function() {
22372
+ return qrcode;
22373
+ });
22374
+ }
22375
+ });
22376
+
22377
+ // ../../packages/shuttle/dist/pairing/terminal.js
22378
+ var require_terminal = __commonJS({
22379
+ "../../packages/shuttle/dist/pairing/terminal.js"(exports2) {
22380
+ "use strict";
22381
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
22382
+ return mod && mod.__esModule ? mod : { "default": mod };
22383
+ };
22384
+ Object.defineProperty(exports2, "__esModule", { value: true });
22385
+ exports2.renderPairingInvitation = renderPairingInvitation;
22386
+ exports2.hyperlink = hyperlink;
22387
+ exports2.qrBlock = qrBlock;
22388
+ var qrcode_generator_1 = __importDefault(require_qrcode());
22389
+ var INK = 0;
22390
+ var PAPER = 15;
22391
+ var HALF = "\u2580";
22392
+ var RESET = "\x1B[0m";
22393
+ var QUIET = 4;
22394
+ function renderPairingInvitation(invitation) {
22395
+ const lines = [invitation.header, ""];
22396
+ if (invitation.rich) {
22397
+ const code = qrBlock(invitation.verificationUriComplete, invitation.columns);
22398
+ if (code.length > 0) {
22399
+ lines.push(...code, "");
22400
+ }
22401
+ }
22402
+ lines.push(`Open: ${invitation.rich ? hyperlink(invitation.verificationUriComplete) : invitation.verificationUriComplete}`);
22403
+ lines.push(`User code: ${invitation.userCode}`);
22404
+ lines.push("");
22405
+ lines.push(`Waiting for verification (expires in ${invitation.expiresIn}s)...`);
22406
+ return lines;
22407
+ }
22408
+ function hyperlink(url, label = url) {
22409
+ return `\x1B]8;;${url}\x1B\\${label}\x1B]8;;\x1B\\`;
22410
+ }
22411
+ function qrBlock(text, columns) {
22412
+ const qr = (0, qrcode_generator_1.default)(0, "M");
22413
+ qr.addData(text);
22414
+ qr.make();
22415
+ const count = qr.getModuleCount();
22416
+ const size = count + QUIET * 2;
22417
+ if (columns !== void 0 && size > columns)
22418
+ return [];
22419
+ const dark = (row, column) => {
22420
+ const r = row - QUIET;
22421
+ const c = column - QUIET;
22422
+ if (r < 0 || c < 0 || r >= count || c >= count)
22423
+ return false;
22424
+ return qr.isDark(r, c);
22425
+ };
22426
+ const lines = [];
22427
+ for (let row = 0; row < size; row += 2) {
22428
+ let line = "";
22429
+ for (let column = 0; column < size; column++) {
22430
+ const top = dark(row, column) ? INK : PAPER;
22431
+ const bottom = row + 1 < size && dark(row + 1, column) ? INK : PAPER;
22432
+ line += `\x1B[38;5;${top};48;5;${bottom}m${HALF}`;
22433
+ }
22434
+ lines.push(line + RESET);
22435
+ }
22436
+ return lines;
22437
+ }
22438
+ }
22439
+ });
22440
+
20575
22441
  // ../../packages/shuttle/dist/pairing/device-code.js
20576
22442
  var require_device_code = __commonJS({
20577
22443
  "../../packages/shuttle/dist/pairing/device-code.js"(exports2) {
20578
22444
  "use strict";
20579
22445
  Object.defineProperty(exports2, "__esModule", { value: true });
20580
22446
  exports2.pair = pair;
22447
+ exports2.webFirstRemedy = webFirstRemedy;
20581
22448
  var os_1 = require("os");
20582
22449
  var apply_1 = require_apply();
20583
22450
  var version_check_1 = require_version_check();
22451
+ var typed_exit_1 = require_typed_exit();
22452
+ var terminal_1 = require_terminal();
20584
22453
  async function pair(opts) {
20585
22454
  const fetcher = opts.fetcher ?? globalThis.fetch;
20586
22455
  const log = opts.log ?? ((line) => console.log(line));
@@ -20602,18 +22471,31 @@ var require_device_code = __commonJS({
20602
22471
  });
20603
22472
  log(opts.brand.strings?.pairingDoneMessage ?? `Paired ${displayName}.`);
20604
22473
  } else {
20605
- const device = await startDeviceCode({
20606
- keepApiUrl: reg.keepApiUrl,
20607
- oauthClientId: reg.oauthClientId,
20608
- fetcher,
20609
- brand: opts.brand
22474
+ let device;
22475
+ try {
22476
+ device = await startDeviceCode({
22477
+ keepApiUrl: reg.keepApiUrl,
22478
+ oauthClientId: reg.oauthClientId,
22479
+ fetcher,
22480
+ brand: opts.brand
22481
+ });
22482
+ } catch (err) {
22483
+ if ((0, typed_exit_1.isTypedExit)(err))
22484
+ throw err;
22485
+ throw new Error(webFirstRemedy(opts.brand, err));
22486
+ }
22487
+ opts.onVerificationUri?.(device.verificationUri);
22488
+ const invitation = (0, terminal_1.renderPairingInvitation)({
22489
+ header: opts.brand.strings?.pairingHeader ?? `Pair your ${opts.brand.product.title}`,
22490
+ verificationUri: device.verificationUri,
22491
+ verificationUriComplete: device.verificationUriComplete ?? device.verificationUri,
22492
+ userCode: device.userCode,
22493
+ expiresIn: device.expiresIn,
22494
+ rich: opts.rich ?? Boolean(process.stdout.isTTY),
22495
+ ...columnsOf(opts) !== void 0 ? { columns: columnsOf(opts) } : {}
20610
22496
  });
20611
- log(opts.brand.strings?.pairingHeader ?? `Pair your ${opts.brand.product.title}`);
20612
- log("");
20613
- log(`Visit: ${device.verificationUri}`);
20614
- log(`User code: ${device.userCode}`);
20615
- log("");
20616
- log(`Waiting for verification (expires in ${device.expiresIn}s)...`);
22497
+ for (const line of invitation)
22498
+ log(line);
20617
22499
  token = await pollForToken({
20618
22500
  keepApiUrl: reg.keepApiUrl,
20619
22501
  oauthClientId: reg.oauthClientId,
@@ -20681,6 +22563,19 @@ var require_device_code = __commonJS({
20681
22563
  const poolsJson = await readJson(poolsRes);
20682
22564
  return poolsJson.data.pools;
20683
22565
  }
22566
+ function webFirstRemedy(brand, cause) {
22567
+ const reason = cause instanceof Error ? cause.message : String(cause);
22568
+ const where = brand.product.webPairingUrl ? brand.product.webPairingUrl : `your ${brand.product.title} web app, under Settings, Sifters`;
22569
+ return [
22570
+ `Could not start browser pairing: ${reason}`,
22571
+ "",
22572
+ `Pair from the web instead: open ${where}, press Pair a Sifter, and run the`,
22573
+ `command it shows (${brand.product.cliBinary} init --pairing-code=<code>).`
22574
+ ].join("\n");
22575
+ }
22576
+ function columnsOf(opts) {
22577
+ return opts.columns ?? process.stdout.columns;
22578
+ }
20684
22579
  async function startDeviceCode(opts) {
20685
22580
  const url = `${opts.keepApiUrl.replace(/\/$/, "")}/api/oauth/device`;
20686
22581
  const response = await opts.fetcher(url, {
@@ -20933,24 +22828,31 @@ var require_init = __commonJS({
20933
22828
  var fsp = __importStar(require("fs/promises"));
20934
22829
  var commander_1 = require_commander();
20935
22830
  var apply_1 = require_apply();
22831
+ var environment_1 = require_environment();
20936
22832
  var device_code_1 = require_device_code();
20937
22833
  var store_1 = require_store();
20938
22834
  var spend_store_1 = require_spend_store();
20939
22835
  var typed_exit_1 = require_typed_exit();
20940
22836
  var preflight_1 = require_preflight();
20941
22837
  function buildInitCommand(brand) {
20942
- return new commander_1.Command("init").description(`Pair this ${brand.product.title} with Keep and seed local state`).option("--pairing-code <code>", "Pairing code from the product UI").option("--keep-url <url>", "Override the Keep API URL from BrandConfig").option("--jobs-url <url>", "Override the Jobs API URL from BrandConfig").option("--executor <type>", `Executor to write into ${brand.product.id}.yaml (e.g. claude-code). Must be in the brand's executor allowlist.`).option("--poll-interval <ms>", "Run-loop poll interval in milliseconds").option("--daily-cap <tokens>", "Daily token cap; overrides the brand default").option("--monthly-cap <tokens>", "Monthly token cap; overrides the brand default").option("--tmp-dir <path>", "Base directory for each job's throwaway checkout (defaults to the OS temp dir; set only when that is unsuitable)").option("-p, --profile <name>", 'Config profile to pair into (isolates this pairing under its own dir; default "default")').action(async (options) => {
22838
+ return new commander_1.Command("init").description(`Pair this ${brand.product.title} with Keep and seed local state`).option("--pairing-code <code>", "Pairing code from the product UI").option("--keep-url <url>", "Override the Keep API URL, beating both the profile's environment and the brand default").option("--jobs-url <url>", "Override the Jobs API URL, beating both the profile's environment and the brand default").option("--json", "Print the resolved pairing environment as JSON, one object per line; the rest of the output is unchanged").option("--executor <type>", `Executor to write into ${brand.product.id}.yaml (e.g. claude-code). Must be in the brand's executor allowlist.`).option("--poll-interval <ms>", "Run-loop poll interval in milliseconds").option("--daily-cap <tokens>", "Daily token cap; overrides the brand default").option("--monthly-cap <tokens>", "Monthly token cap; overrides the brand default").option("--tmp-dir <path>", "Base directory for each job's throwaway checkout (defaults to the OS temp dir; set only when that is unsuitable)").option("-p, --profile <name>", profileFlagDescription(brand)).action(async (options) => {
20943
22839
  try {
20944
22840
  const profile = (0, apply_1.resolveProfile)(brand, options.profile);
20945
22841
  const setupOptions = parseSetupOptions(brand, options);
20946
- const effectiveBrand = options.keepUrl || options.jobsUrl ? {
20947
- ...brand,
20948
- keepRegistration: {
20949
- ...brand.keepRegistration,
20950
- ...options.keepUrl ? { keepApiUrl: options.keepUrl } : {},
20951
- ...options.jobsUrl ? { jobsApiUrl: options.jobsUrl } : {}
20952
- }
20953
- } : brand;
22842
+ const asJson = options.json === true;
22843
+ const environment = (0, environment_1.resolveEnvironment)(brand, profile, {
22844
+ keepUrl: options.keepUrl,
22845
+ jobsUrl: options.jobsUrl
22846
+ });
22847
+ const effectiveBrand = (0, environment_1.applyEnvironment)(brand, environment);
22848
+ const report = (0, environment_1.isWorthReporting)(environment);
22849
+ if (report) {
22850
+ if (asJson)
22851
+ console.log((0, environment_1.environmentReportJson)(environment));
22852
+ else
22853
+ for (const line of (0, environment_1.renderEnvironmentReport)(environment))
22854
+ console.log(line);
22855
+ }
20954
22856
  const paths = (0, apply_1.resolvePaths)(effectiveBrand, profile);
20955
22857
  await fsp.mkdir(paths.configDir, { recursive: true });
20956
22858
  for (const step of effectiveBrand.setupSteps ?? []) {
@@ -20980,7 +22882,14 @@ var require_init = __commonJS({
20980
22882
  }
20981
22883
  const pairing = await (0, device_code_1.pair)({
20982
22884
  brand: effectiveBrand,
20983
- pairingCode: options.pairingCode
22885
+ pairingCode: options.pairingCode,
22886
+ // Keep's answer is the half no local table can predict: it
22887
+ // builds `verification_uri` from its OWN configuration, so a
22888
+ // tier pointed at a page nobody serves looks exactly like a
22889
+ // healthy one until an operator opens the link.
22890
+ ...report ? {
22891
+ onVerificationUri: (uri) => console.log(asJson ? (0, environment_1.verificationJson)(uri) : (0, environment_1.renderVerificationLine)(uri))
22892
+ } : {}
20984
22893
  });
20985
22894
  const store = new store_1.PairingConfigStore(paths.configFile);
20986
22895
  await store.write(pairing);
@@ -21020,6 +22929,13 @@ var require_init = __commonJS({
21020
22929
  }
21021
22930
  });
21022
22931
  }
22932
+ function profileFlagDescription(brand) {
22933
+ const known = Object.keys(brand.environments ?? {}).sort();
22934
+ const base = 'Config profile to pair into (isolates this pairing under its own dir; default "default")';
22935
+ if (known.length === 0)
22936
+ return base;
22937
+ return `${base}. These names also select the backend: ${known.join(", ")}`;
22938
+ }
21023
22939
  function parseSetupOptions(brand, raw) {
21024
22940
  const out = {};
21025
22941
  if (raw.executor !== void 0) {
@@ -23317,7 +25233,8 @@ var require_dist5 = __commonJS({
23317
25233
  "../../packages/shuttle/dist/index.js"(exports2) {
23318
25234
  "use strict";
23319
25235
  Object.defineProperty(exports2, "__esModule", { value: true });
23320
- exports2.revokePairing = exports2.listPairings = exports2.PairingConfigStore = exports2.pair = exports2.DEFAULT_REFUSAL_MESSAGE = exports2.DEFAULT_MONTHLY_PERIOD = exports2.DEFAULT_DAILY_PERIOD = exports2.SUBSTRATE_BRAND = exports2.renderTemplate = exports2.expandHome = exports2.resolvePaths = exports2.SpendStore = exports2.AuditLogStore = exports2.createSpendTrackerObserver = exports2.createAuditLogObserver = exports2.createLoggerObserver = exports2.SpendCapExceeded = exports2.ObserverChain = exports2.createCustomScriptExecutor = exports2.createWebhookExecutor = exports2.createHttpApiExecutor = exports2.createClaudeCodeExecutor = exports2.ExecutorRegistry = exports2.AgentCredentialRevokedError = exports2.runPreflight = exports2.renderLines = exports2.renderJson = exports2.printReport = exports2.hasFailure = exports2.createProbes = exports2.checksFor = exports2.PREFLIGHT_FLOORS = exports2.PREFLIGHT_EXIT_CODE = exports2.CHECKS = exports2.readResponseLatestVersion = exports2.checkResponseMinVersion = exports2.compareSemver = exports2.UpgradeRequiredError = exports2.LATEST_VERSION_HEADER = exports2.MIN_VERSION_HEADER = exports2.loadConfig = exports2.Shuttle = exports2.createCli = void 0;
25236
+ exports2.listPairings = exports2.PairingConfigStore = exports2.pair = exports2.DEFAULT_REFUSAL_MESSAGE = exports2.DEFAULT_MONTHLY_PERIOD = exports2.DEFAULT_DAILY_PERIOD = exports2.SUBSTRATE_BRAND = exports2.verificationJson = exports2.resolveEnvironment = exports2.renderVerificationLine = exports2.renderEnvironmentReport = exports2.isWorthReporting = exports2.hostOf = exports2.environmentReportJson = exports2.applyEnvironment = exports2.renderTemplate = exports2.expandHome = exports2.resolvePaths = exports2.SpendStore = exports2.AuditLogStore = exports2.createSpendTrackerObserver = exports2.createAuditLogObserver = exports2.createLoggerObserver = exports2.SpendCapExceeded = exports2.ObserverChain = exports2.createCustomScriptExecutor = exports2.createWebhookExecutor = exports2.createHttpApiExecutor = exports2.createClaudeCodeExecutor = exports2.ExecutorRegistry = exports2.AgentCredentialRevokedError = exports2.runPreflight = exports2.renderLines = exports2.renderJson = exports2.printReport = exports2.hasFailure = exports2.createProbes = exports2.checksFor = exports2.PREFLIGHT_FLOORS = exports2.PREFLIGHT_EXIT_CODE = exports2.CHECKS = exports2.readResponseLatestVersion = exports2.checkResponseMinVersion = exports2.compareSemver = exports2.UpgradeRequiredError = exports2.LATEST_VERSION_HEADER = exports2.MIN_VERSION_HEADER = exports2.loadConfig = exports2.Shuttle = exports2.createCli = void 0;
25237
+ exports2.revokePairing = void 0;
23321
25238
  var cli_1 = require_cli();
23322
25239
  Object.defineProperty(exports2, "createCli", { enumerable: true, get: function() {
23323
25240
  return cli_1.createCli;
@@ -23441,6 +25358,31 @@ var require_dist5 = __commonJS({
23441
25358
  Object.defineProperty(exports2, "renderTemplate", { enumerable: true, get: function() {
23442
25359
  return apply_1.renderTemplate;
23443
25360
  } });
25361
+ var environment_1 = require_environment();
25362
+ Object.defineProperty(exports2, "applyEnvironment", { enumerable: true, get: function() {
25363
+ return environment_1.applyEnvironment;
25364
+ } });
25365
+ Object.defineProperty(exports2, "environmentReportJson", { enumerable: true, get: function() {
25366
+ return environment_1.environmentReportJson;
25367
+ } });
25368
+ Object.defineProperty(exports2, "hostOf", { enumerable: true, get: function() {
25369
+ return environment_1.hostOf;
25370
+ } });
25371
+ Object.defineProperty(exports2, "isWorthReporting", { enumerable: true, get: function() {
25372
+ return environment_1.isWorthReporting;
25373
+ } });
25374
+ Object.defineProperty(exports2, "renderEnvironmentReport", { enumerable: true, get: function() {
25375
+ return environment_1.renderEnvironmentReport;
25376
+ } });
25377
+ Object.defineProperty(exports2, "renderVerificationLine", { enumerable: true, get: function() {
25378
+ return environment_1.renderVerificationLine;
25379
+ } });
25380
+ Object.defineProperty(exports2, "resolveEnvironment", { enumerable: true, get: function() {
25381
+ return environment_1.resolveEnvironment;
25382
+ } });
25383
+ Object.defineProperty(exports2, "verificationJson", { enumerable: true, get: function() {
25384
+ return environment_1.verificationJson;
25385
+ } });
23444
25386
  var defaults_1 = require_defaults2();
23445
25387
  Object.defineProperty(exports2, "SUBSTRATE_BRAND", { enumerable: true, get: function() {
23446
25388
  return defaults_1.SUBSTRATE_BRAND;
@@ -23480,7 +25422,7 @@ var import_path = require("path");
23480
25422
  var import_promises = require("fs/promises");
23481
25423
  var import_yaml = __toESM(require_dist4());
23482
25424
  var import_shuttle = __toESM(require_dist5());
23483
- var buildVersion = true ? "0.28.1" : pkg.version;
25425
+ var buildVersion = true ? "0.30.0" : pkg.version;
23484
25426
  var sifterBrand = {
23485
25427
  product: {
23486
25428
  id: "sifter",
@@ -23488,7 +25430,12 @@ var sifterBrand = {
23488
25430
  cliBinary: "whittle-sifter",
23489
25431
  packageName: "@whittlelabs/sifter",
23490
25432
  version: buildVersion,
23491
- description: "Pairs with Whittle Sift to run AI code reviews on your hardware with your credentials."
25433
+ description: "Pairs with Whittle Sift to run AI code reviews on your hardware with your credentials.",
25434
+ // Production's own pairing page. The published binary defaults to the
25435
+ // production backend, so this is the surface the person holding that
25436
+ // binary actually has; a non-prod pairing arrives with its command
25437
+ // already built by the tier that printed it.
25438
+ webPairingUrl: "https://sift.whittlelabs.com/settings/sifters"
23492
25439
  },
23493
25440
  paths: {
23494
25441
  configDir: "~/.sifter",
@@ -23523,6 +25470,40 @@ var sifterBrand = {
23523
25470
  ]
23524
25471
  }
23525
25472
  },
25473
+ // The environments Whittle Labs operates, keyed by the profile name that
25474
+ // selects one. `init --profile stage` resolves both URLs from here, so a
25475
+ // non-prod pairing is one flag instead of three and there is no host to
25476
+ // mistype. `--keep-url` / `--jobs-url` still win, which is what keeps a
25477
+ // backend Whittle Labs does not run reachable.
25478
+ //
25479
+ // `prod` is stated even though it duplicates the defaults below: a person
25480
+ // reading `--help` should see the whole set, and a profile literally named
25481
+ // `prod` should resolve rather than fall through to a default that only
25482
+ // happens to agree. The DEFAULT profile ("default") is deliberately not a
25483
+ // key — it is not an environment name, and it keeps its historic meaning
25484
+ // of "the brand's own defaults", which are production's.
25485
+ //
25486
+ // `studio` is the local dev fleet on this machine, reachable over Tailscale
25487
+ // at the `studio.whittlelabs.com` hostname rather than `localhost`, because
25488
+ // a pairing made from a phone or a second machine has to resolve too.
25489
+ environments: {
25490
+ prod: {
25491
+ keepApiUrl: "https://keep.whittlelabs.com",
25492
+ jobsApiUrl: "https://jobs.whittlelabs.com"
25493
+ },
25494
+ stage: {
25495
+ keepApiUrl: "https://keep.stage.whittlelabs.com",
25496
+ jobsApiUrl: "https://jobs.stage.whittlelabs.com"
25497
+ },
25498
+ test: {
25499
+ keepApiUrl: "https://keep.test.whittlelabs.com",
25500
+ jobsApiUrl: "https://jobs.test.whittlelabs.com"
25501
+ },
25502
+ studio: {
25503
+ keepApiUrl: "http://studio.whittlelabs.com:3007",
25504
+ jobsApiUrl: "http://studio.whittlelabs.com:3005"
25505
+ }
25506
+ },
23526
25507
  keepRegistration: {
23527
25508
  keepApiUrl: process.env.KEEP_API_URL ?? "https://keep.whittlelabs.com",
23528
25509
  jobsApiUrl: process.env.JOBS_API_URL ?? "https://jobs.whittlelabs.com",
@@ -23642,7 +25623,16 @@ async function buildExecutorBlock(executor, ctx) {
23642
25623
  console.error("Keep refused its credentials \u2014 it was decommissioned from the");
23643
25624
  console.error("web app, or its secret was rotated by a newer pairing.");
23644
25625
  console.error("");
23645
- console.error(`Run \`${sifterBrand.product.cliBinary} init\` to pair again.`);
25626
+ console.error("Two ways to pair again:");
25627
+ console.error("");
25628
+ console.error(
25629
+ ` 1. Run \`${sifterBrand.product.cliBinary} init\` and scan the QR code it prints,`
25630
+ );
25631
+ console.error(" or open the link beside it.");
25632
+ console.error(
25633
+ ` 2. Open ${sifterBrand.product.webPairingUrl ?? "the web app, under Settings, Sifters"},`
25634
+ );
25635
+ console.error(" press Pair a Sifter, and run the command it shows.");
23646
25636
  console.error("");
23647
25637
  process.exit(3);
23648
25638
  }